Zum Inhalt springen

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:

%%{init: {"themeVariables": {"lineColor": "#6b7280", "edgeLabelBackground": "#f5f5f5"}}}%% flowchart LR A[Salesforce Query] --> B[Transformation] --> C[NetSuite Upsert] --> D[Script] E[NetSuite Search] --> F[Transformation] --> G[Salesforce Upsert] --> H[Script]

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:

  1. Ein Benutzer bearbeitet ein Konto in Salesforce. Die Automatisierungsregel setzt Jitterbit_Synced__c = false.
  2. Die Salesforce-zu-NetSuite-Kette fragt nach Datensätzen ab, bei denen Jitterbit_Synced__c = false ist, und findet den geänderten Datensatz.
  3. Studio schreibt den Datensatz in NetSuite mit custbody_jb_synced = true und setzt dann Jitterbit_Synced__c = true zurück in Salesforce.
  4. Die NetSuite-zu-Salesforce-Kette fragt NetSuite nach Datensätzen ab, bei denen custbody_jb_synced = false ist. 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

  1. 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-Namen Jitterbit_Synced__c. Stellen Sie den Standardwert auf Nicht aktiviert ein.

  2. 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__c auf false setzt. Dies stellt sicher, dass benutzerinitiierte Änderungen für die Salesforce-zu-NetSuite-Kette sichtbar sind.

In NetSuite

  1. 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 ID custbody_jb_synced. Stellen Sie den Standardwert auf Nicht aktiviert ein.

  2. Erstellen Sie ein SuiteScript-Benutzerereignis (afterSubmit), das beim Speichern von Datensätzen ausgelöst wird und custbody_jb_synced = false setzt. Verwenden Sie context.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

  1. Ziehen Sie eine Salesforce-Aktivität Query aus einem vorhandenen Salesforce-Endpunkt auf die Canvas, um die Kette zu starten.

  2. Doppelklicken Sie auf die Aktivität, um ihre Konfiguration zu öffnen.

  3. Name: Geben Sie Query Salesforce Accounts ein.

  4. Objekt: Wählen Sie Account aus.

  5. Abfragebedingungen: Fügen Sie zwei Bedingungen hinzu:

    • Jitterbit_Synced__c ist gleich false
    • LastModifiedDate größ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.

  6. Wählen Sie die zurückzugebenden Felder aus: Id, Name und alle anderen Felder, die NetSuite entsprechen.

  7. Klicken Sie auf Fertig.

Schritt 2: Konfigurieren der Transformation

  1. Fügen Sie einen Transformation-Schritt nach der Salesforce-Aktivität Query hinzu.

  2. Legen Sie das Quellschema auf die Salesforce-Query-Antwort und das Zielschema auf die NetSuite-Datensatzstruktur Customer fest.

  3. Ordnen Sie die Salesforce-Quellenfelder den entsprechenden NetSuite-Zielfeldern zu.

  4. 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 = true auf jedem von dieser Kette geschriebenen NetSuite-Datensatz verhindert, dass die NetSuite-zu-Salesforce-Kette diese Datensätze aufnimmt und zurückschreibt.

  5. 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

  1. Fügen Sie eine NetSuite-Aktivität Upsert nach der Transformation hinzu.

  2. Name: Geben Sie Upsert NetSuite Customers ein.

  3. Datensatztyp: Wählen Sie Customer aus.

  4. 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.

  5. 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.

  1. Fügen Sie einen Script-Schritt nach der NetSuite-Aktivität Upsert hinzu.

  2. 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 = "";
    
  3. 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, dass Jitterbit_Synced__c = true auf jeder Datensatz-ID in synced_sf_ids gesetzt wird. Verwenden Sie eine Transformation, die synced_sf_ids bei Kommas teilt und jede ID einem Update-Payload zuordnet.

  4. 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

  1. Ziehen Sie eine NetSuite-Aktivität Search auf die Canvas.

  2. Name: Geben Sie Search NetSuite Customers ein.

  3. Suchfilter: Fügen Sie zwei Bedingungen hinzu:

    • custbody_jb_synced ist false
    • lastmodifieddate nach $ns_last_sync_time
  4. Rückgabefelder: Wählen Sie internalId, entityId, custentity_sf_id und alle anderen Felder aus, die Salesforce entsprechen.

  5. Klicken Sie auf Fertig.

Schritt 2: Konfigurieren der Transformation

  1. Fügen Sie einen Transformation-Schritt nach der NetSuite-Aktivität Search hinzu.

  2. Legen Sie das Quellschema auf die NetSuite-Search-Antwort und das Zielschema auf die Salesforce-Datensatzstruktur Account fest.

  3. Ordnen Sie die NetSuite-Quellfelder den entsprechenden Salesforce-Zielfeldern zu.

  4. 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

  1. Fügen Sie eine Salesforce-Aktivität Upsert nach der Transformation hinzu.

  2. Name: Geben Sie Upsert Salesforce Accounts ein.

  3. External ID-Feld: Wählen Sie das Feld aus, das die NetSuite-interne ID in Salesforce speichert (z. B. NetSuite_ID__c).

  4. Klicken Sie auf Finished (Abgeschlossen).

Schritt 4: Schreiben Sie das Post-Sync-Script

  1. Fügen Sie einen Script-Schritt nach der Salesforce-Aktivität Upsert hinzu.

  2. 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 = "";
    
  3. Erstellen Sie einen separaten Vorgang namens Mark NetSuite Records Synced mit einer NetSuite-Aktivität Update, die custbody_jb_synced = true für jede Datensatz-ID in synced_ns_ids setzt.

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.

  1. 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.

  2. 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

  1. Stellen Sie bereit und führen Sie die Salesforce-zu-NetSuite-Kette manuell aus.

  2. Bestätigen Sie in den Betriebsprotokollen, dass Datensätze aus Salesforce abgerufen und in NetSuite geschrieben wurden.

  3. Öffnen Sie in NetSuite einen der synchronisierten Kundendatensätze und bestätigen Sie, dass custbody_jb_synced aktiviert ist.

  4. Öffnen Sie in Salesforce das entsprechende Konto und bestätigen Sie, dass Jitterbit_Synced__c aktiviert ist.

  5. 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 = true werden ausgeschlossen.

  6. Ändern Sie in NetSuite einen der synchronisierten Kundendatensätze direkt. Das afterSubmit-SuiteScript setzt custbody_jb_synced = false zurück. Führen Sie die NetSuite-zu-Salesforce-Kette aus und bestätigen Sie, dass die Änderung zu Salesforce propagiert wird.

  7. Bestätigen Sie in Salesforce, dass das aktualisierte Konto nach der Synchronisierung Jitterbit_Synced__c = true aufweist. 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.