Bidirektionale Synchronisierung zwischen zwei Systemen in Jitterbit Studio einrichten
Einführung
Die bidirektionale Synchronisierung hält Datensätze in zwei separaten Systemen konsistent, indem Änderungen in beide Richtungen propagiert werden: Aktualisierungen in System A werden in System B geschrieben, und Aktualisierungen in System B werden zurück in System A geschrieben.
Die zentrale Herausforderung besteht darin, Endlosschleifen zu verhindern. Wenn Studio einen Datensatz in System B schreibt, erkennt die Änderungserkennung von System B diesen Datensatz als neue Änderung und löst (ohne Sicherheitsmaßnahme) die B-zu-A-Synchronisierung aus, die den Datensatz zurück in System A schreibt, was wiederum die A-zu-B-Synchronisierung erneut auslöst. Ein Synchronisierungs-Flag-Feld in den Datensätzen jedes Systems ist die zuverlässigste Methode, um diesen Zyklus zu unterbrechen: Jede Synchronisierungsrichtung markiert die Datensätze, die sie schreibt, als „von Jitterbit synchronisiert", und die entgegengesetzte Richtung filtert diese Datensätze aus ihren Abfragen.
Diese Anleitung verwendet Salesforce und NetSuite als die zwei Beispielsysteme und setzt Vertrautheit mit der Konfiguration von Studio-Verbindungen, Transformationen und Skripten voraus. Weitere Informationen zu verwandten Themen finden Sie unter:
Designmuster
Das Muster verwendet zwei unabhängige Operationsketten:
Zwei benutzerdefinierte boolesche Felder speichern den Synchronisierungsstatus, eines in jedem externen System:
- Salesforce:
Jitterbit_Synced__c:false, wenn ein Benutzer den Datensatz zuletzt bearbeitet hat;true, wenn Studio den Datensatz zuletzt geschrieben hat. - NetSuite:
custbody_jb_synced: die gleiche Semantik.
Jedes System erfordert auch eine Automatisierungsregel, die das Feld auf false zurückgesetzt, sobald ein Benutzer einen Datensatz bearbeitet. Dies gewährleistet, dass benutzerinitiierte Änderungen bei der nächsten Synchronisierung immer erfasst werden, während von Studio geschriebene Datensätze ignoriert werden.
So wird die Schleife verhindert:
- Ein Benutzer bearbeitet ein Konto in Salesforce. Die Automatisierungsregel setzt
Jitterbit_Synced__c = false. - Die Salesforce-zu-NetSuite-Kette fragt nach Datensätzen ab, bei denen
Jitterbit_Synced__c = falseist, und findet den geänderten Datensatz. - Studio schreibt den Datensatz in NetSuite mit
custbody_jb_synced = trueund setzt dannJitterbit_Synced__c = truezurück in Salesforce. - Die NetSuite-zu-Salesforce-Kette fragt NetSuite nach Datensätzen ab, bei denen
custbody_jb_synced = falseist. Der Datensatz aus Schritt 3 ist ausgeschlossen und wird daher nicht zurück in Salesforce geschrieben.
Voraussetzungen
Bevor die Studio-Operationen konfiguriert werden, müssen folgende Schritte in jedem externen System durchgeführt werden.
In Salesforce
-
Erstellen Sie auf dem
Account-Objekt (oder welchem Objekt auch immer synchronisiert werden) ein benutzerdefiniertes Kontrollkästchen-Feld mit der Bezeichnung Jitterbit Synced und dem API-NamenJitterbit_Synced__c. Stellen Sie den Standardwert auf Nicht aktiviert ein. -
Erstellen Sie eine Workflow-Regel oder einen Process Builder-Fluss, der bei der Erstellung oder Aktualisierung von Datensätzen durch einen Benutzer ausgelöst wird und
Jitterbit_Synced__cauffalsesetzt. Dies stellt sicher, dass benutzerinitiierte Änderungen für die Salesforce-zu-NetSuite-Kette sichtbar sind.
In NetSuite
-
Erstellen Sie auf dem
Customer-Datensatztyp (oder welchem Datensatztyp auch immer synchronisiert werden) ein benutzerdefiniertes Kontrollkästchen-Feld mit der Bezeichnung Jitterbit Synced und der IDcustbody_jb_synced. Stellen Sie den Standardwert auf Nicht aktiviert ein. -
Erstellen Sie ein SuiteScript-Benutzerereignis (
afterSubmit), das beim Speichern von Datensätzen ausgelöst wird undcustbody_jb_synced = falsesetzt. Verwenden Siecontext.type, um die Ausführung zu überspringen, wenn der Datensatz durch ein Skript (z. B. einen Jitterbit-Synchronisierungsschreibvorgang) gespeichert wird, sodass nur Benutzer-Speichervorgänge das Flag zurücksetzen.
In Ihrem Jitterbit-Projekt
Erstellen Sie zwei Projektvariablen, um den letzten erfolgreichen Synchronisierungszeitpunkt für jede Richtung zu verfolgen:
sf_last_sync_time: Der letzte Zeitpunkt, zu dem die Salesforce-zu-NetSuite-Kette erfolgreich ausgeführt wurde. Legen Sie einen anfänglichen Wert auf ein Datum in der Vergangenheit fest, z. B.2020-01-01T00:00:00Z.ns_last_sync_time: Der letzte Zeitpunkt, zu dem die NetSuite-zu-Salesforce-Kette erfolgreich ausgeführt wurde. Stellen Sie denselben anfänglichen Wert ein.
Teil 1: Die Salesforce-zu-NetSuite-Operationskette konfigurieren
Schritt 1: Konfigurieren der Salesforce-Query-Aktivität
-
Ziehen Sie eine Salesforce-Aktivität Query aus einem vorhandenen Salesforce-Endpunkt auf die Canvas, um die Kette zu starten.
-
Doppelklicken Sie auf die Aktivität, um ihre Konfiguration zu öffnen.
-
Name: Geben Sie
Query Salesforce Accountsein. -
Objekt: Wählen Sie Account aus.
-
Abfragebedingungen: Fügen Sie zwei Bedingungen hinzu:
Jitterbit_Synced__cist gleichfalseLastModifiedDategrößer als$sf_last_sync_time
Diese Bedingungen zusammen geben nur Datensätze zurück, die von Benutzern seit der letzten Synchronisierung geändert wurden.
-
Wählen Sie die zurückzugebenden Felder aus:
Id,Nameund alle anderen Felder, die NetSuite entsprechen. -
Klicken Sie auf Fertig.
Schritt 2: Konfigurieren der Transformation
-
Fügen Sie einen Transformation-Schritt nach der Salesforce-Aktivität Query hinzu.
-
Legen Sie das Quellschema auf die Salesforce-Query-Antwort und das Zielschema auf die NetSuite-Datensatzstruktur
Customerfest. -
Ordnen Sie die Salesforce-Quellenfelder den entsprechenden NetSuite-Zielfeldern zu.
-
Fügen Sie ein Skript auf der Stammebene (außerhalb des Schleifenknotens) hinzu, das jeden geschriebenen Datensatz als „von Jitterbit synchronisiert" markiert und die aktuelle Laufzeit erfasst:
target.custbody_jb_synced = true; $sync_run_time = Now();Das Setzen von
custbody_jb_synced = trueauf jedem von dieser Kette geschriebenen NetSuite-Datensatz verhindert, dass die NetSuite-zu-Salesforce-Kette diese Datensätze aufnimmt und zurückschreibt. -
Fügen Sie im gleichen Stammebenen-Skript die ID jedes Quelldatensatzes an eine globale Variable an, damit das Post-Sync-Skript Salesforce aktualisieren kann:
$synced_sf_ids = $synced_sf_ids + If(Length($synced_sf_ids) > 0, ",", "") + Source.Id;
Schritt 3: Konfigurieren der NetSuite-Upsert-Aktivität
-
Fügen Sie eine NetSuite-Aktivität Upsert nach der Transformation hinzu.
-
Name: Geben Sie
Upsert NetSuite Customersein. -
Datensatztyp: Wählen Sie Customer aus.
-
Externes ID-Feld: Wählen Sie das Feld aus, in dem die Salesforce-Datensatz-ID in NetSuite gespeichert ist (z. B.
custentity_sf_id). Dieses Feld ist der Upsert-Schlüssel: Wenn ein übereinstimmender Datensatz vorhanden ist, wird er aktualisiert; andernfalls wird ein neuer Datensatz erstellt. -
Klicken Sie auf Fertig.
Schritt 4: Schreiben des Post-Sync-Skripts
Aktualisieren Sie nach dem Upsert in NetSuite Salesforce, um die gleichen Datensätze als verarbeitet zu markieren. Dies verhindert, dass sie beim nächsten Durchlauf erneut abgefragt werden.
-
Fügen Sie einen Script-Schritt nach der NetSuite-Aktivität Upsert hinzu.
-
Geben Sie Folgendes ein:
// Mark the synced Salesforce records so the next run skips them. // $synced_sf_ids is a comma-separated list of Salesforce IDs built in the transformation. RunOperation("<TAG>operation:Mark Salesforce Records Synced</TAG>"); // Advance the last-sync timestamp so the next query picks up only newer changes. $sf_last_sync_time = $sync_run_time; SetVar("sf_last_sync_time", $sf_last_sync_time); // Reset for the next run. $synced_sf_ids = ""; -
Erstellen Sie einen separaten Betrieb mit dem Namen
Mark Salesforce Records Synced, der eine Salesforce-Aktivität Update enthält. Konfigurieren Sie die Aktivität so, dassJitterbit_Synced__c = trueauf jeder Datensatz-ID insynced_sf_idsgesetzt wird. Verwenden Sie eine Transformation, diesynced_sf_idsbei Kommas teilt und jede ID einem Update-Payload zuordnet. -
Initialisieren Sie auch
$synced_sf_ids = ""zu Beginn jedes Controller-Skripts, das diese Kette aufruft, damit die ID-Liste zu Beginn jedes Durchlaufs leer ist.
Teil 2: Konfigurieren der NetSuite-zu-Salesforce-Operationskette
Die NetSuite-zu-Salesforce-Kette folgt der gleichen Struktur wie Teil 1, wobei die Quell- und Zielsysteme getauscht sind.
Schritt 1: Konfigurieren der NetSuite-Search-Aktivität
-
Ziehen Sie eine NetSuite-Aktivität Search auf die Canvas.
-
Name: Geben Sie
Search NetSuite Customersein. -
Suchfilter: Fügen Sie zwei Bedingungen hinzu:
custbody_jb_syncedistfalselastmodifieddatenach$ns_last_sync_time
-
Rückgabefelder: Wählen Sie
internalId,entityId,custentity_sf_idund alle anderen Felder aus, die Salesforce entsprechen. -
Klicken Sie auf Fertig.
Schritt 2: Konfigurieren der Transformation
-
Fügen Sie einen Transformation-Schritt nach der NetSuite-Aktivität Search hinzu.
-
Legen Sie das Quellschema auf die NetSuite-Search-Antwort und das Zielschema auf die Salesforce-Datensatzstruktur
Accountfest. -
Ordnen Sie die NetSuite-Quellfelder den entsprechenden Salesforce-Zielfeldern zu.
-
Fügen Sie ein Script auf Root-Ebene hinzu, das jeden Salesforce-Datensatz als "synced by Jitterbit" markiert und NetSuite-IDs für die Post-Sync-Aktualisierung sammelt:
target.Jitterbit_Synced__c = true; $sync_run_time = Now(); $synced_ns_ids = $synced_ns_ids + If(Length($synced_ns_ids) > 0, ",", "") + Source.internalId;
Schritt 3: Konfigurieren Sie die Salesforce-Upsert-Aktivität
-
Fügen Sie eine Salesforce-Aktivität Upsert nach der Transformation hinzu.
-
Name: Geben Sie
Upsert Salesforce Accountsein. -
External ID-Feld: Wählen Sie das Feld aus, das die NetSuite-interne ID in Salesforce speichert (z. B.
NetSuite_ID__c). -
Klicken Sie auf Finished (Abgeschlossen).
Schritt 4: Schreiben Sie das Post-Sync-Script
-
Fügen Sie einen Script-Schritt nach der Salesforce-Aktivität Upsert hinzu.
-
Geben Sie Folgendes ein:
RunOperation("<TAG>operation:Mark NetSuite Records Synced</TAG>"); $ns_last_sync_time = $sync_run_time; SetVar("ns_last_sync_time", $ns_last_sync_time); $synced_ns_ids = ""; -
Erstellen Sie einen separaten Vorgang namens
Mark NetSuite Records Syncedmit einer NetSuite-Aktivität Update, diecustbody_jb_synced = truefür jede Datensatz-ID insynced_ns_idssetzt.
Teil 3: Planen Sie die Vorgänge
Beide Ketten werden nach Betriebsplänen ausgeführt. Um die Wahrscheinlichkeit zu verringern, dass beide Ketten gleichzeitig ausgeführt werden und sich gegenseitig überschneidende Schreibvorgänge verarbeiten, verschieben Sie ihre Startzeiten.
-
Ordnen Sie der Salesforce-zu-NetSuite-Kette einen Plan zu. Stellen Sie für ein 15-Minuten-Synchronisierungsintervall fest, dass es zu 0, 15, 30 und 45 Minuten nach der vollen Stunde ausgeführt wird.
-
Ordnen Sie der NetSuite-zu-Salesforce-Kette einen Plan zu und verschieben Sie ihn um die Hälfte des Intervalls (z. B. 7, 22, 37 und 52 Minuten nach der vollen Stunde).
Schritt-für-Schritt-Anleitungen zum Erstellen und Zuordnen von Zeitplänen finden Sie unter Planen Sie einen Vorgang zur automatischen Ausführung.
Hinweis
Das Verschieben reduziert die Überlappung, beseitigt sie jedoch nicht vollständig. Wenn ein Synchronisierungslauf länger als das Verschiebungsintervall dauert, können beide Ketten gleichzeitig ausgeführt werden. Erwägen Sie für umfangreiche Synchronisierungen, einen Lock hinzuzufügen: Lesen Sie zu Beginn jeder Kette eine Projektvariable oder einen Cloud Datastore-Eintrag namens sync_lock. Wenn der Lock gesetzt ist, beenden Sie den Vorgang früh mit RaiseError. Andernfalls setzen Sie den Lock vor dem Fortfahren und löschen ihn im Post-Sync-Script.
Überprüfen Sie die Integration
-
Stellen Sie bereit und führen Sie die Salesforce-zu-NetSuite-Kette manuell aus.
-
Bestätigen Sie in den Betriebsprotokollen, dass Datensätze aus Salesforce abgerufen und in NetSuite geschrieben wurden.
-
Öffnen Sie in NetSuite einen der synchronisierten Kundendatensätze und bestätigen Sie, dass
custbody_jb_syncedaktiviert ist. -
Öffnen Sie in Salesforce das entsprechende Konto und bestätigen Sie, dass
Jitterbit_Synced__caktiviert ist. -
Führen Sie die NetSuite-zu-Salesforce-Kette aus. Bestätigen Sie in den Protokollen, dass die in Schritt 2 geschriebenen Kundendatensätze nicht in den NetSuite-Suchergebnissen angezeigt werden. Dies bestätigt, dass der Loop-Prevention-Filter funktioniert: Datensätze mit
custbody_jb_synced = truewerden ausgeschlossen. -
Ändern Sie in NetSuite einen der synchronisierten Kundendatensätze direkt. Das
afterSubmit-SuiteScript setztcustbody_jb_synced = falsezurück. Führen Sie die NetSuite-zu-Salesforce-Kette aus und bestätigen Sie, dass die Änderung zu Salesforce propagiert wird. -
Bestätigen Sie in Salesforce, dass das aktualisierte Konto nach der Synchronisierung
Jitterbit_Synced__c = trueaufweist. Führen Sie die Salesforce-zu-NetSuite-Kette aus und bestätigen Sie, dass der Datensatz nicht in den Abfrageergebnissen angezeigt wird, da er zuletzt von Jitterbit geschrieben wurde.
Einen alternativen Ansatz zum Erkennen geänderter Datensätze ohne Synchronisierungsflagfeld finden Sie unter Datensätze mit Hash-Funktionen erkennen und deduplizieren.