Configurar sincronização bidirecional entre dois sistemas no Jitterbit Studio
Introdução
A sincronização bidirecional mantém os registros consistentes em dois sistemas separados propagando mudanças em qualquer direção: as atualizações realizadas no sistema A são gravadas no sistema B, e as atualizações realizadas no sistema B são gravadas de volta no sistema A.
O desafio principal é evitar loops infinitos. Quando o Studio grava um registro no sistema B, a detecção de mudanças do sistema B vê esse registro como uma nova modificação e (sem uma proteção) dispara a sincronização B-para-A, que grava o registro de volta no sistema A, o que então dispara a sincronização A-para-B novamente. Um campo de sinalizador de sincronização nos registros de cada sistema é a forma mais confiável de interromper esse ciclo: cada direção de sincronização marca os registros que grava como "sincronizados pelo Jitterbit" e a direção oposta filtra esses registros de suas consultas.
Este guia usa Salesforce e NetSuite como os dois sistemas de exemplo e presume familiaridade com a configuração de conexões, transformações e scripts do Studio. Para mais informações sobre tópicos relacionados, consulte:
Padrão de design
O padrão usa duas cadeias de operações independentes:
Dois campos booleanos personalizados carregam o estado de sincronização, um em cada sistema externo:
- Salesforce:
Jitterbit_Synced__c:falsequando um usuário modificou o registro pela última vez;truequando o Studio gravou o registro pela última vez. - NetSuite:
custbody_jb_synced: a mesma semântica.
Cada sistema também requer uma regra de automação que redefine o campo para false sempre que um usuário modifica um registro. Isso garante que as mudanças iniciadas pelo usuário sejam sempre capturadas pela próxima execução de sincronização, enquanto os registros gravados pelo Studio são ignorados.
Como o loop é evitado:
- Um usuário modifica uma conta no Salesforce. A regra de automação define
Jitterbit_Synced__c = false. - A cadeia Salesforce-para-NetSuite consulta registros onde
Jitterbit_Synced__c = falsee encontra o registro modificado. - O Studio grava o registro no NetSuite com
custbody_jb_synced = truee depois defineJitterbit_Synced__c = truede volta no Salesforce. - A cadeia NetSuite-para-Salesforce consulta o NetSuite por registros onde
custbody_jb_synced = false. O registro da etapa 3 é excluído, portanto não é gravado de volta no Salesforce.
Pré-requisitos
Antes de configurar as operações do Studio, conclua as etapas a seguir em cada sistema externo.
No Salesforce
-
No objeto
Account(ou qualquer objeto que você esteja sincronizando), crie um campo de caixa de seleção personalizado com o rótulo Jitterbit Synced e o nome da APIJitterbit_Synced__c. Defina o valor padrão como Desmarcado. -
Crie uma regra de fluxo de trabalho ou um fluxo do Process Builder que dispare na criação ou atualização de registro por um usuário e defina
Jitterbit_Synced__ccomofalse. Isso garante que as mudanças iniciadas pelo usuário sejam visíveis para a cadeia Salesforce-para-NetSuite.
No NetSuite
-
No tipo de registro
Customer(ou qualquer tipo de registro que você esteja sincronizando), crie um campo de caixa de seleção personalizado com o rótulo Jitterbit Synced e IDcustbody_jb_synced. Defina o valor padrão como desmarcado. -
Crie um SuiteScript de evento de usuário (
afterSubmit) que dispare ao salvar o registro e definacustbody_jb_synced = false. Usecontext.typepara ignorar a execução quando o registro é salvo por um script (como uma gravação de sincronização do Jitterbit), para que apenas salvamentos de usuários redefinam o sinalizador.
No seu projeto Jitterbit
Crie duas variáveis de projeto para rastrear o último horário de sincronização bem-sucedida para cada direção:
sf_last_sync_time: a última vez que a cadeia Salesforce-para-NetSuite foi executada com sucesso. Defina um valor inicial de uma data no passado, por exemplo2020-01-01T00:00:00Z.ns_last_sync_time: a última vez que a cadeia NetSuite-para-Salesforce foi executada com sucesso. Defina o mesmo valor inicial.
Parte 1: Configurar a cadeia de operações Salesforce-para-NetSuite
Etapa 1: Configurar a atividade Query do Salesforce
-
Na tela de design, arraste uma atividade Query do Salesforce de um endpoint Salesforce existente para a tela e inicie a sequência.
-
Clique duas vezes na atividade para abrir sua configuração.
-
Nome: Digite
Query Salesforce Accounts. -
Objeto: Selecione Account.
-
Condições de consulta: Adicione duas condições:
Jitterbit_Synced__cé igual afalseLastModifiedDatemaior que$sf_last_sync_time
Juntas, essas condições retornam apenas registros modificados pelos usuários desde a última execução de sincronização.
-
Selecione os campos a retornar:
Id,Namee quaisquer outros campos que mapeiem para o NetSuite. -
Clique em Finished.
Etapa 2: Configurar a transformação
-
Adicione uma etapa de Transformation após a atividade Query do Salesforce.
-
Defina o esquema de origem como a resposta da Query do Salesforce e o esquema de destino como a estrutura do registro
Customerdo NetSuite. -
Mapeie os campos de origem do Salesforce para os campos de destino correspondentes do NetSuite.
-
Adicione um script no nível raiz (fora do nó de loop) que marca cada registro gravado como "sincronizado pelo Jitterbit" e captura o tempo da execução atual:
target.custbody_jb_synced = true; $sync_run_time = Now();Definir
custbody_jb_synced = trueem cada registro do NetSuite gravado por essa sequência é o que impede que a sequência NetSuite-para-Salesforce os selecione e os grave novamente. -
No mesmo script de nível raiz, acrescente o ID de cada registro de origem a uma variável global para que o script pós-sincronização possa atualizar o Salesforce:
$synced_sf_ids = $synced_sf_ids + If(Length($synced_sf_ids) > 0, ",", "") + Source.Id;
Etapa 3: Configurar a atividade Upsert do NetSuite
-
Adicione uma atividade Upsert do NetSuite após a transformação.
-
Nome: Digite
Upsert NetSuite Customers. -
Tipo de registro: Selecione Customer.
-
Campo de ID externo: Selecione o campo que armazena o ID do registro do Salesforce no NetSuite (por exemplo,
custentity_sf_id). Este campo é a chave de upsert: se um registro correspondente existir, ele será atualizado; caso contrário, um novo registro será criado. -
Clique em Finished.
Etapa 4: Escrever o script pós-sincronização
Após fazer o upsert para o NetSuite, atualize o Salesforce para marcar os mesmos registros como processados. Isso evita que eles sejam consultados novamente na próxima execução.
-
Adicione uma etapa de Script após a atividade Upsert do NetSuite.
-
Digite o seguinte:
// 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 = ""; -
Crie uma operação separada nomeada
Mark Salesforce Records Syncedcontendo uma atividade Update do Salesforce. Configure a atividade para definirJitterbit_Synced__c = trueem cada ID de registro emsynced_sf_ids. Use uma transformação que dividesynced_sf_idsem vírgulas e mapeia cada ID para um payload de atualização. -
Também inicialize
$synced_sf_ids = ""no início de qualquer script do controlador que chame essa sequência, para que a lista de IDs esteja vazia no início de cada execução.
Parte 2: Configurar a sequência de operação NetSuite-para-Salesforce
A sequência NetSuite-para-Salesforce segue a mesma estrutura da Parte 1 com os sistemas de origem e destino invertidos.
Etapa 1: Configurar a atividade Search do NetSuite
-
Arraste uma atividade Search do NetSuite para a tela.
-
Nome: Digite
Search NetSuite Customers. -
Filtro de pesquisa: Adicione duas condições:
custbody_jb_syncedéfalselastmodifieddateapós$ns_last_sync_time
-
Campos de retorno: Selecione
internalId,entityId,custentity_sf_ide quaisquer outros campos que mapeiem para o Salesforce. -
Clique em Finished.
Etapa 2: Configurar a transformação
-
Adicione uma etapa de Transformation após a atividade Search do NetSuite.
-
Defina o esquema de origem como a resposta da Search do NetSuite e o esquema de destino como a estrutura
Accountdo Salesforce. -
Mapeie os campos de origem do NetSuite para os campos de destino do Salesforce correspondentes.
-
Adicione um script no nível raiz que marca cada registro do Salesforce como "sincronizado pelo Jitterbit" e coleta os IDs do NetSuite para a atualização pós-sincronização:
target.Jitterbit_Synced__c = true; $sync_run_time = Now(); $synced_ns_ids = $synced_ns_ids + If(Length($synced_ns_ids) > 0, ",", "") + Source.internalId;
Etapa 3: Configurar a atividade de Upsert do Salesforce
-
Adicione uma atividade Upsert do Salesforce após a transformação.
-
Nome: Digite
Upsert Salesforce Accounts. -
Campo de ID externo: Selecione o campo que armazena o ID interno do NetSuite no Salesforce (por exemplo,
NetSuite_ID__c). -
Clique em Concluído.
Etapa 4: Escrever o script pós-sincronização
-
Adicione uma etapa Script após a atividade Upsert do Salesforce.
-
Digite o seguinte:
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 = ""; -
Crie uma operação separada chamada
Mark NetSuite Records Syncedcontendo uma atividade Atualizar do NetSuite que definecustbody_jb_synced = trueem cada ID de registro emsynced_ns_ids.
Parte 3: Agendar as operações
Ambas as cadeias são executadas em agendamentos de operação. Para reduzir a chance de ambas as cadeias serem executadas simultaneamente e coletarem gravações em progresso uma da outra, escalone seus horários de início.
-
Atribua um agendamento à cadeia do Salesforce para NetSuite. Para um intervalo de sincronização de 15 minutos, defina-o para ser executado nos minutos 0, 15, 30 e 45 da hora.
-
Atribua um agendamento à cadeia do NetSuite para Salesforce e o compense pela metade do intervalo (por exemplo, 7, 22, 37 e 52 minutos da hora).
Para instruções passo a passo sobre como criar e atribuir agendamentos, consulte Agendar uma operação para ser executada automaticamente.
Nota
O escalonamento reduz a sobreposição, mas não a elimina. Se uma execução de sincronização levar mais tempo do que o intervalo de compensação, ambas as cadeias podem ser executadas simultaneamente. Para sincronizações de alto volume, considere adicionar um bloqueio: no início de cada cadeia, leia uma variável de projeto ou entrada do Cloud Datastore chamada sync_lock. Se o bloqueio estiver definido, saia antecipadamente usando RaiseError. Caso contrário, defina o bloqueio antes de prosseguir e limpe-o no script pós-sincronização.
Verificar a integração
-
Implante e execute a cadeia do Salesforce para NetSuite manualmente.
-
Nos registros de operação, confirme que os registros foram recuperados do Salesforce e gravados no NetSuite.
-
No NetSuite, abra um dos registros de clientes sincronizados e confirme que
custbody_jb_syncedestá marcado. -
No Salesforce, abra a conta correspondente e confirme que
Jitterbit_Synced__cestá marcado. -
Execute a cadeia do NetSuite para Salesforce. Nos registros, confirme que os registros de Cliente gravados na etapa 2 não aparecem nos resultados de pesquisa do NetSuite. Isso confirma que o filtro de prevenção de loop está funcionando: registros com
custbody_jb_synced = truesão excluídos. -
No NetSuite, modifique um dos registros de clientes sincronizados diretamente. O SuiteScript
afterSubmitredefinecustbody_jb_synced = false. Execute a cadeia do NetSuite para Salesforce e confirme que a mudança é propagada para o Salesforce. -
No Salesforce, confirme que a conta atualizada tem
Jitterbit_Synced__c = trueapós a sincronização. Execute a cadeia do Salesforce para NetSuite e confirme que o registro não aparece nos resultados da consulta, pois foi gravado pela última vez pelo Jitterbit.
Para uma abordagem alternativa para detectar registros alterados sem campos de sinalizador de sincronização, consulte Detectar e desduplicar registros usando funções de hash.