Przejdź do treści

Droga zamówienia przez system

Opis kompletnej ścieżki jednego zamówienia — od momentu złożenia przez klienta w Rainbow do pojawienia się na serwerze analitycznym z poprawnie przypisanym klientem.

Skrócony widok

flowchart LR
    RB["Rainbow\n(sklep)"]
    SC["Scanner"]
    S1["Stage1\nidentyfikacja"]
    S2["Stage2\ndeduplikacja"]
    AS["AnalyticsSync"]
    AN["Serwer\nanalityczny"]

    RB -->|"zamówienie"| SC
    SC -->|"osoba\nz zamówienia"| S1
    S1 -->|"profil klienta\ndo weryfikacji"| S2
    S2 -->|"wynik\ndeduplikacji"| AS
    AS --> AN

Krok 1 — Zamówienie trafia do bazy wymiany danych

Punktem styku między Rainbow a Deduplikatorem jest wspólna baza wymiany danych. Rainbow zapisuje do niej dane zamówień; Deduplikator je z niej odczytuje.

Z perspektywy Deduplikatora ta baza to po prostu skrzynka wejściowa: system obserwuje ją i reaguje na to, co się w niej pojawi. Interesują go dane osób powiązanych z zamówieniem — imię, nazwisko, płeć, data urodzenia, a często też adres e-mail, numer telefonu lub adres dostawy.

Deduplikator niczego nie zmienia po stronie Rainbow — bazę wymiany danych czyta wyłącznie w trybie odczytu.


Krok 2 — Scanner wykrywa zmianę

Co kilka sekund Scanner sprawdza, czy pojawiły się zamówienia nowe lub zmienione od ostatniego sprawdzenia. Interesują go tylko zamówienia zakończone sprzedażą — anulowane i w trakcie realizacji są pomijane.

Gdy Scanner znajdzie nowe zamówienie, wyciąga z niego każdą osobę (zamawiający, płatnik) i przekazuje ją dalej do przetworzenia. Jeśli zamówienie zostało zmodyfikowane (np. zmiana adresu), Scanner przetworzy je ponownie.

Scanner zapamiętuje, jak daleko zaszedł — w razie restartu wznawia od miejsca, w którym skończył.


Krok 3 — Stage1: porządkowanie danych i identyfikacja

Stage1 odbiera dane osoby i decyduje, co z nią zrobić.

Porządkowanie danych (normalizacja) — dane z zamówień rzadko są jednolite. Stage1 je ujednolica: sprowadza imiona do wspólnej formy (rozpoznaje zdrobnienia), usuwa przedrostki z nazw ulic, formatuje numery telefonów według standardu krajowego, porządkuje adresy e-mail.

Filtrowanie — jeśli brakuje któregoś z czterech kluczowych pól (imię, nazwisko, płeć, data urodzenia), osoba jest pomijana. Nie da się deduplikować kogoś, kogo nie można zidentyfikować.

Decyzja — Stage1 sprawdza, czy ta osoba z tego zamówienia była już wcześniej widziana:

Sytuacja Co robi Stage1
Nowa osoba Tworzy profil klienta, przekazuje do Stage2
Znana, dane bez zmian Kończy — nic do zrobienia
Znana, dane się zmieniły Zapisuje nowe dane, przekazuje do Stage2

Stage1 celowo nie scala profili — może tworzyć duplikaty. To zadanie Stage2.


Krok 4 — Stage2: deduplikacja

Stage2 obsługuje dwa przypadki: nowy profil klienta (pierwsze pojawienie się osoby w systemie) oraz aktualizację istniejącego (dane w zamówieniu się zmieniły). W obu cel jest ten sam — sprawdzić, czy ten klient nie figuruje już w bazie pod innym profilem.

Nowy profil — Stage2 przejmuje świeżo utworzony profil i od razu przechodzi do wyszukiwania duplikatów.

Aktualizacja istniejącego profilu — Stage2 najpierw odświeża dane klienta na podstawie najnowszych danych z zamówienia. Kontakty (e-mail, telefon) są dołączane do historii — nie zastępują poprzednich. Dane podstawowe i adres są nadpisywane. Jeśli klient jest powiązany z wieloma zamówieniami (bo wcześniej scalono kilka profili), Stage2 weryfikuje, czy każde z nich nadal pasuje do profilu. Zamówienie, którego dane przestały pasować, zostaje odłączone i dostaje własny nowy profil — który trafi do Stage2 jako osobny przebieg. Jeśli po odłączeniu nie zostaje żadne zamówienie, profil jest usuwany.

Wyszukiwanie duplikatów

Jeśli klient jest powiązany z kontem w systemie LDE, Stage2 najpierw szuka w bazie innego klienta z tym samym identyfikatorem LDE. Trafienie oznacza automatyczne scalenie z najwyższą możliwą pewnością — ten sam identyfikator LDE to ta sama osoba, bez wątpliwości.

W pozostałych przypadkach Stage2 przechodzi do dopasowania na podstawie danych osobowych. Zamiast porównywać klienta ze wszystkimi innymi, najpierw zawęża poszukiwania do osób o podobnie brzmiącym imieniu i nazwisku, tej samej płci i roku urodzenia — i bierze pod uwagę do 50 najbardziej podobnych kandydatów.

Każdy kandydat jest następnie porównywany szczegółowo według zestawu reguł (szczegóły w rozdziale Algorytmy):

Wynik Co się dzieje
Ta sama osoba — pewne Automatyczne scalenie
Prawdopodobnie ta sama — z rozbieżnościami Scalenie, ale z oznaczeniem do weryfikacji przez operatora
Różne osoby Brak działania

Jeśli znaleziono dopasowanie, Stage2 tworzy nowy scalony profil klienta, przenosi na niego wszystkie zamówienia i usuwa stare profile. Na koniec przekazuje dalej informację o wyniku — który identyfikator klienta ostatecznie przypisano.


Krok 5 — AnalyticsSync: zapis na serwerze analitycznym

AnalyticsSync nasłuchuje na wyniki z Stage2. Gdy dostaje potwierdzenie zakończonej deduplikacji, aktualizuje rekord zamówienia na serwerze analitycznym — wpisuje identyfikator osoby, który łączy zamówienie z profilem klienta.

Równolegle AnalyticsSync kopiuje na serwer analityczny pełne dane zamówienia (dane produktowe, kwoty, daty itp.).

Dopiero w tym momencie zamówienie jest kompletne na serwerze analitycznym — ma dane zamówienia i wie, kto je złożył, w ujednolicony, zdeduplikowany sposób. To umożliwia raportowanie powracalności klientów.


Zamówienie anulowane

Scanner wychwytuje nie tylko nowe zamówienia, ale też zmiany statusu istniejących — w tym anulowanie.

Obsługa anulowania zamówień

Każdy profil klienta istnieje tylko dlatego, że są do niego przypisane zamówienia. Gdy ostatnie zamówienie znika — czy to przez pełne anulowanie, czy przez usunięcie osoby z zamówienia grupowego — profil traci rację bytu i jest usuwany. Informacja o anulowaniu trafia do systemu analitycznego, aby mógł on usunąć zamówienie ze swoich danych.

Profil klienta istnieje wyłącznie dzięki zamówieniom — brak powiązań oznacza usunięcie

Deduplikator nie przechowuje klientów na zapas. Profil powstaje, kiedy zamówienie wchodzi do systemu, i znika, kiedy ostatnie zamówienie zostaje anulowane lub odpięte. Jeśli klient kupił dwa razy i pierwsze zamówienie zostaje anulowane — profil pozostaje, bo drugie nadal istnieje. Dopiero gdy nie ma już żadnego zamówienia — profil jest usuwany.

Scenariusz: Anulowanie całego zamówienia usuwa klienta z bazy i triggeruje sync Analytics

Zakładając że w bazie istnieje przetworzone zamówienie "1001" z klientem:

Imię Nazwisko Data urodzenia Płeć
Jan Kowalski 1985-03-15 M

Gdy przetworzę zamówienie "1001" jako anulowane
Wtedy klient "Jan Kowalski" nie powinien istnieć w bazie
I powiązania zamówienia "1001" nie powinny istnieć
I usunięcie zamówienia "1001" powinno być zakolejkowane w outboxie

Scenariusz: Anulowanie zamówienia nie usuwa klienta który ma inne aktywne zamówienie

Zakładając że klient Jan Kowalski jest powiązany z zamówieniami "1003" i "1004"
Gdy przetworzę zamówienie "1003" jako anulowane
Wtedy klient "Jan Kowalski" powinien nadal istnieć w bazie
I powiązanie z zamówieniem "1003" nie powinno istnieć
I powiązanie z zamówieniem "1004" powinno nadal istnieć

W zamówieniu grupowym każda osoba jest niezależna — odpinana osobno

Wycieczki grupowe to zamówienie z wieloma pasażerami, każdy z własnym profilem klienta. Gdy aktualizacja zamówienia usuwa z niego jedną osobę, odpinany jest tylko jej profil. Pozostałe osoby z tego samego zamówienia pozostają niezmienione.

Scenariusz: Anulowanie jednej osoby w aktywnym zamówieniu odpina ją od klienta

Zakładając że w bazie istnieje przetworzone zamówienie "1002" z osobami:

OrderPersonId Imię Nazwisko Data urodzenia Płeć
101 Jan Kowalski 1985-03-15 M
102 Anna Nowak 1990-07-22 K

Gdy przetworzę zamówienie "1002" z aktywną listą osób: "101"
Wtedy klient "Jan Kowalski" powinien nadal istnieć w bazie
I klient "Anna Nowak" nie powinien istnieć w bazie
I powiązanie osoby "101" z zamówieniem "1002" powinno istnieć
I powiązanie osoby "102" z zamówieniem "1002" nie powinno istnieć

Zmiany danych po pierwszym przetworzeniu

Zamówienie może się zmieniać także po pierwszym przetworzeniu — klient koryguje dane, ktoś dołącza do wycieczki grupowej lub z niej rezygnuje.

Obsługa aktualizacji zamówień

Zamówienia mogą się zmieniać po pierwszym przetworzeniu — dane osobowe mogą być korygowane, osoby dopisywane lub usuwane z wycieczki grupowej, zamówienie może zostać opróżnione. Każda taka zmiana wymaga od Deduplikatora reakcji: zaktualizować, odpiąć lub usunąć to, co już nie pasuje do aktualnego stanu.

Kontekst: Zakładając że system deduplikacji jest uruchomiony

Zmiana danych na zamówieniu odpina je od klienta gdy przestają pasować

Profil klienta reprezentuje osobę o konkretnej tożsamości. Jeśli zamówienie przychodziło z danymi Jana Kowalskiego, ale teraz przychodzi z danymi Piotra Nowaka — to nie jest aktualizacja tego samego klienta, lecz inna osoba na tym samym zamówieniu. System odpina zamówienie od dotychczasowego klienta (który pozostaje, jeśli ma inne zamówienia) i tworzy nowy profil dla nowych danych.

Scenariusz: Update zamówienia z danymi które nie pasują do klienta - odpięcie i nowy klient

Zakładając że istnieje klient:

Pole Wartość
CustomerId 1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15
Status Active

I zamówienie "ORD-A" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P0
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I zamówienie "ORD-B" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

Kiedy przychodzi aktualizacja zamówienia "ORD-B" z zupełnie innymi danymi:

Pole Wartość
OrderPersonId P1
FirstName Piotr
LastName Nowak
Gender M
BirthDate 1985-08-20

Wtedy zamówienie "ORD-B" jest odpinane od klienta 1
I tworzony jest nowy klient z danymi:

Pole Wartość
FirstName Piotr
LastName Nowak

I klient 1 pozostaje aktywny

Scenariusz: Kaskadowe odpięcie - zamówienie odpinane od klienta z wieloma linkami tworzy nowego klienta

Zakładając że istnieje klient:

Pole Wartość
CustomerId 1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15
Status Active

I zamówienie "ORD-A" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I zamówienie "ORD-B" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

Kiedy przychodzi aktualizacja zamówienia "ORD-B" z zupełnie innymi danymi:

Pole Wartość
OrderPersonId P1
FirstName Piotr
LastName Wiśniewski
Gender M
BirthDate 1978-08-10

Wtedy zamówienie "ORD-B" jest odpinane od klienta 1
I tworzony jest nowy klient z danymi:

Pole Wartość
FirstName Piotr
LastName Wiśniewski

I klient 1 pozostaje aktywny
I zamówienie "ORD-A" pozostaje powiązane z klientem 1

Usunięcie osoby z zamówienia grupowego odpina tylko tę osobę

System wykrywa, które osoby nadal są aktywne w zamówieniu. Jeśli osoba zniknie z aktualnej listy uczestników (np. rezygnacja z wycieczki grupowej), zostaje odpięta od zamówienia. Inne osoby z tego samego zamówienia pozostają niezmienione.

Scenariusz: Zamówienie z 3 osobami aktualizowane do 2 osób - trzecia osoba odpinana

Zakładając że istnieje klient:

Pole Wartość
CustomerId 1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I istnieje klient:

Pole Wartość
CustomerId 2
FirstName Anna
LastName Nowak
Gender F
BirthDate 1985-03-20

I istnieje klient:

Pole Wartość
CustomerId 3
FirstName Piotr
LastName Wiśniewski
Gender M
BirthDate 1978-08-10

I zamówienie "ORD-A" ma 3 powiązane osoby:

OrderPersonId CustomerId
P1 1
P2 2
P3 3

Kiedy przychodzi aktualizacja zamówienia "ORD-A" z tylko 2 osobami:

OrderPersonId FirstName LastName Gender BirthDate
P1 Jan Kowalski M 1990-05-15
P2 Anna Nowak F 1985-03-20

Wtedy osoba P3 jest odpinana od zamówienia "ORD-A"
I klient 3 jest usuwany jako osierocony
I klienci 1 i 2 pozostają aktywni

Scenariusz: Usunięcie osoby z zamówienia - klient ma inne zamówienia więc nie jest usuwany

Zakładając że istnieje klient:

Pole Wartość
CustomerId 1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I istnieje klient:

Pole Wartość
CustomerId 2
FirstName Piotr
LastName Wiśniewski
Gender M
BirthDate 1978-08-10
Status Active

I zamówienie "ORD-A" ma 2 powiązane osoby:

OrderPersonId CustomerId
P1 1
P2 2

I zamówienie "ORD-B" jest powiązane z klientem 2:

Pole Wartość
OrderPersonId P1
FirstName Piotr
LastName Wiśniewski
Gender M
BirthDate 1978-08-10

Kiedy przychodzi aktualizacja zamówienia "ORD-A" z tylko 1 osobą:

OrderPersonId FirstName LastName Gender BirthDate
P1 Jan Kowalski M 1990-05-15

Wtedy osoba P2 jest odpinana od zamówienia "ORD-A"
I klient 2 pozostaje aktywny

Profil bez żadnego zamówienia jest natychmiast usuwany

Deduplikator nie gromadzi historycznych profili. Gdy zamówienie zostaje odpięte od klienta — bo dane nie pasują, bo osoba zrezygnowała z wycieczki, albo bo zamówienie zostało opróżnione — system sprawdza, czy klient nadal ma jakiekolwiek powiązanie. Nie ma? Profil jest usuwany. Ma inne zamówienia? Pozostaje.

Scenariusz: Zamówienie staje się puste - klient jest usuwany

Zakładając że istnieje klient:

Pole Wartość
CustomerId 1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15
Status Active

I zamówienie "ORD-A" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

Kiedy przychodzi aktualizacja zamówienia "ORD-A" bez osób
Wtedy zamówienie "ORD-A" jest odpinane od klienta 1
I klient 1 jest usuwany jako osierocony

Scenariusz: Klient z wieloma zamówieniami - jedno zamówienie puste - klient pozostaje

Zakładając że istnieje klient:

Pole Wartość
CustomerId 1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15
Status Active

I zamówienie "ORD-A" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I zamówienie "ORD-B" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

Kiedy przychodzi aktualizacja zamówienia "ORD-A" bez osób
Wtedy zamówienie "ORD-A" jest odpinane od klienta 1
I klient 1 pozostaje aktywny
I klient 1 pozostaje w systemie

Scenariusz: Klient z wieloma zamówieniami - oba puste - klient usuwany

Zakładając że istnieje klient:

Pole Wartość
CustomerId 1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15
Status Active

I zamówienie "ORD-A" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I zamówienie "ORD-B" jest powiązane z klientem 1:

Pole Wartość
OrderPersonId P1
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

Kiedy przychodzi aktualizacja zamówienia "ORD-A" bez osób
I przychodzi aktualizacja zamówienia "ORD-B" bez osób
Wtedy klient 1 jest usuwany jako osierocony

Odświeżanie profilu klienta przy zmianie danych zamówienia

Gdy dane osobowe na zamówieniu się zmieniają, system odświeża profil klienta na podstawie najnowszych wersji danych. Ale tylko wtedy, gdy jest co odświeżać — to samo zamówienie z tymi samymi danymi przetworzone po raz drugi nie wymusza ponownego porównywania.

Identyczne dane na zamówieniu nie wymuszają ponownego przetworzenia

To samo zamówienie może trafić do systemu wielokrotnie — przy ponownym uruchomieniu, przy rededuplikacji, przy normalnym pobieraniu danych. System porównuje nowe dane z ostatnio zapamiętaną wersją. Jeśli są identyczne, uznaje zamówienie za już przetworzone i nie kieruje go do dalszego porównywania. Chroni to przed zbędnym obciążeniem systemu i zapobiega przypadkowym zmianom danych.

Scenariusz: Ponowne zamówienie z identycznymi danymi zwraca AlreadyProcessed

Zakładając że klient powiązany z zamówieniem "ORD-A" ma dane osoby:

Pole Wartość
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

Kiedy zamówienie "ORD-A" jest przetworzone ponownie z tymi samymi danymi
Wtedy decyzja Stage1 to "AlreadyProcessed"
I kolejka Stage2 jest pusta

Nowe dane na zamówieniu przepływają do profilu — kontakty się sumują, podstawowe dane nadpisują

Gdy dane na zamówieniu się zmieniają (nowy telefon, korekta nazwiska), system odświeża profil klienta na podstawie wszystkich aktualnych danych z jego zamówień. Dane kontaktowe (e-mail, telefon) są sumowane ze wszystkich zamówień — każde może dołożyć nowy kontakt do profilu. Dane podstawowe (imię, nazwisko, data urodzenia) pochodzą z najnowszej wersji — ostatnia wersja wygrywa. Jeśli po zmianie danych klient zaczyna pasować do innego istniejącego profilu, system łączy je automatycznie.

Scenariusz: Nowy numer telefonu z zamówienia jest dodawany do klienta powiązanego z wieloma zamówieniami

Zakładając że klient powiązany z zamówieniami "ORD-A" i "ORD-B" ma dane osoby:

Pole Wartość
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I snapshot zamówienia "ORD-A" zawiera numer telefonu "+48500100200"
I snapshot zamówienia "ORD-B" zawiera numer telefonu "+48500100200"
Kiedy zamówienie "ORD-A" jest przetworzone ponownie z dodatkowym numerem "+48600200300"
I Stage2 przetwarza głównego klienta
Wtedy klient zawiera numer telefonu "+48500100200"
I klient zawiera numer telefonu "+48600200300"

Scenariusz: Drobna zmiana nazwiska w nowszym snapzhocie odświeża dane klienta

Zakładając że klient powiązany z zamówieniami "ORD-A" i "ORD-B" ma dane osoby:

Pole Wartość
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15
Email jan@example.com

I snapshot zamówienia "ORD-A" ma nazwisko "Kowalski" z wcześniejszą datą przetworzenia
I snapshot zamówienia "ORD-B" ma nazwisko "Kovalsky" z późniejszą datą przetworzenia
Kiedy Stage2 przetwarza głównego klienta
Wtedy nazwisko klienta to "Kovalsky"
I klient nadal jest powiązany z zamówieniami "ORD-A" i "ORD-B"

Scenariusz: Zmiana nazwiska na zamówieniu powoduje scalenie z istniejącym klientem

Zakładając że klient C1 powiązany z zamówieniem "ORD-A" ma dane osoby:

Pole Wartość
FirstName Jan
LastName Kowalski
Gender M
BirthDate 1990-05-15

I klient C2 powiązany z zamówieniem "ORD-B" ma dane osoby:

Pole Wartość
FirstName Jan
LastName Kovalsky
Gender M
BirthDate 1990-05-15

Kiedy zamówienie "ORD-A" jest przetworzone ponownie z danymi:

Pole Wartość
FirstName Jan
LastName Kovalsky
Gender M
BirthDate 1990-05-15

I Stage2 przetwarza klienta z zamówienia "ORD-A"
Wtedy zamówienia "ORD-A" i "ORD-B" są powiązane z tym samym klientem


Co, jeśli coś pójdzie nie tak?

System jest zaprojektowany odpornie na błędy:

  • Każdy krok jest powtarzalny — jeśli przetwarzanie zwróci błąd, dana informacja jest ponawiana automatycznie. Po przekroczeniu limitu prób trafia do kolejki błędów, z której operator może ją ręcznie powtórzyć lub odrzucić.
  • Scanner wznawia od miejsca przerwania — restart nie powoduje pominięcia zamówień.
  • Późna modyfikacja zamówienia — jeśli klient zmieni dane po pierwszym przetworzeniu, Scanner wykryje modyfikację i całe zamówienie przejdzie przez system ponownie.