Fide-Soft
BaseLinker ERP Architektura

BaseLinker ↔ ERP: synchroniczna czy asynchroniczna integracja?

Decyzja, którą podejmuje się raz, a kosztuje przez lata. Synchroniczne wywołania kuszą prostotą; asynchroniczne kolejki są droższe na starcie, ale ratują w incydentach. Kiedy które.

· 8 min czytania

Większość integracji BaseLinker ↔ ERP (Comarch, Optima, Subiekt, SAP) zaczyna się od pytania: jak często synchronizować i w którą stronę?. To pytanie jest niewłaściwe. Właściwe brzmi: co się dzieje, gdy jedna strona nie odpowiada?

Tu zaczyna się różnica między integracją synchroniczną a asynchroniczną. I jest to różnica, która w produkcji wraca co tydzień.

flowchart TB
  subgraph SYNC["Synchronicznie - prosto, dopóki działa"]
    direction TB
    a1["Zamówienie"] --> b1["BaseLinker / middleware"]
    b1 -->|"wywołanie, czeka na odpowiedź"| c1[("ERP")]
    c1 -.->|"ERP wolny lub padł = timeout, duplikat"| b1
  end
  subgraph ASYNC["Asynchronicznie - odporne na awarie"]
    direction TB
    a2["Zamówienie"] --> b2["BaseLinker / middleware"]
    b2 -->|"event"| q[["Kolejka: retry + DLQ"]]
    q --> w["Worker"]
    w --> c2[("ERP")]
    c2 -.->|"ERP padł = catch-up po powrocie"| q
  end
  classDef sync fill:#fef2f2,stroke:#b91c1c,color:#0f172a;
  classDef async fill:#ecfdf5,stroke:#15803d,color:#0f172a;
  class a1,b1,c1 sync;
  class a2,b2,q,w,c2 async;
Synchronicznie: jedno wywołanie, które czeka - proste, ale awaria ERP zatrzymuje proces. Asynchronicznie: kolejka z retry - drożej na starcie, ale nic nie ginie.

Synchroniczna: prosta dopóki działa

W modelu synchronicznym BaseLinker (albo Wasz middleware) wywołuje API ERP w momencie zdarzenia - przyszło zamówienie → tworzymy dokument w Comarchu od razu, zmienił się stan w ERP → publikujemy do BaseLinkera w tym samym requeście.

Zalety:

  • prosty kod, mało infrastruktury
  • “co widać w BL, jest w ERP” - łatwe do tłumaczenia handlowcom
  • debug to często jeden log po każdej stronie

Wady ujawniają się w incydencie:

  • ERP padł na 15 minut → 200 zamówień nie trafiło, klient nie wie, że trzeba ponowić
  • ERP odpowiada wolno (5s na request) → BL timeout, zamówienie znika z widoku, ale w ERP zostało utworzone (duplikat)
  • update produktu wywołuje 12 wywołań do ERP (cena, stan, opis, kategorie) - każde to nowy timeout do obsłużenia

W praktyce synchroniczne integracje zaczynają się od czystego kodu, a kończą bałaganem retry-loopów, custom obsługi 5xx, ad-hoc cache’ów na timeoutach i Excelem “co się nie zsynchronizowało, sprawdzić ręcznie”.

Asynchroniczna: drożej na starcie, taniej na 12 miesiącu

W modelu asynchronicznym między BL a ERP siedzi kolejka komunikatów (RabbitMQ, AWS SQS, Redis Streams). Zdarzenie → wiadomość → konsument przetwarza ją w swoim tempie, z retry i DLQ (dead letter queue).

Co to daje konkretnie:

  • ERP padł → wiadomości czekają w kolejce, po przywróceniu ERP catch-up automatyczny
  • ERP wolny → konsumenci mogą być zwolnieni, ale nic nie ginie
  • 12 wywołań do ERP per produkt → możemy je debouncować w kolejce (jedno wywołanie na 5 sekund per SKU, jeśli były zmiany)

Wady:

  • infrastruktura: trzeba postawić i utrzymywać kolejkę (koszt operacyjny, monitoring)
  • debug trudniejszy: zdarzenie z 14:32 zostało przetworzone o 14:34, więc kontekst nie jest “tu i teraz”
  • eventual consistency: handlowiec widzi w BL stan z 30 sekund temu, w ERP sprzed 2 sekund - to jest fundamentalne w async i trzeba pogodzić z tym biznes

Reguła kciuka: kiedy które

Sync wystarcza, gdy:

  • < 50 zamówień / dzień
  • jedna instancja ERP, jedna BL, brak partnerów zewnętrznych
  • ERP ma stabilne API z dobrym SLA (Comarch ERP XL, SAP)

Async opłaca się, gdy:

  • 200 zamówień / dzień LUB > 5000 SKU z regularnymi update’ami

  • wiele kanałów / partnerów konsumuje dane (BL + EDI + portal B2B + marketplace API)
  • ERP jest legacy / niestabilny / wolny
  • są wymagania compliance: audit log każdej publikacji (kolejka daje to za darmo, sync wymaga osobnej infrastruktury)

Najczęstszy błąd

Klient mówi: “zaczniemy od synchronicznego, asynchroniczne zrobimy później jak urośniemy”. W praktyce: migracja sync → async w działającym systemie to przepisanie 60-80% kodu integracyjnego. Bo cała logika obsługi błędów, retry, idempotencji była robiona pod założenie “wywołuję i czekam”.

Lepszy plan: jeśli wiesz, że za 12 miesięcy będziesz async, zacznij async od dnia 1, nawet jeśli kolejka będzie obsługiwała 30 wiadomości dziennie. Koszt na starcie: +20-30% czasu wdrożenia. Koszt migracji później: 3-6 miesięcy pracy.

Co my robimy

W projektach do ~200 zamówień/dzień z jednym ERP zwykle proponujemy sync (BaseLinker ↔ ERP przez middleware). W projektach z wieloma odbiorcami danych (BL + partnerzy + EDI) idziemy w async od początku - to nie jest “wczesna optymalizacja”, to dobra architektura pod realny scope.

Decyzja powinna zapaść w audycie, nie w trakcie wdrożenia.

Co dalej

Rozpoznajesz problem? Sprawdźmy Wasz przepływ danych.

Audyt konta BaseLinker i wymiany danych z partnerami: 2 500 - 6 000 zł. Wynik to konkretny dokument z rekomendacją architektury i orientacyjnym kosztem kolejnego etapu. Bez zobowiązania kontynuacji u nas.

Umów diagnozę przepływu danych