Konsumenci Kafka
Cel
Procesy w Eximee mogą składać się z kroków, które wymagają asynchronicznej komunikacji z systemami zewnętrznymi. Przykładowo: wysyłamy żądanie o weryfikację dokumentów, jednak ta jest czasochłonna, więc na odpowiedź będziemy musieli poczekać. Zadanie to może być wykonane asynchronicznie w zewnętrznym systemie i może on powiadomić proces Eximee za pośrednictwem Kafki. Konsumenci Kafka służą właśnie do obsługi takich odpowiedzi. Używamy ich do odebrania wiadomości, wstępnego przetworzenia zawartych w nich danych oraz powiadamiania Eximee BPMS, by kontynuować wykonywanie procesu.
Powiązanie topika Kafki z Konsumentem Kafki
Każdy konsument Kafki musi być powiązany z topikiem, na który będzie nasłuchiwał. Do ustalenia takiego mapowania potrzebujemy:
nazwy topicu - powinniśmy ją dostać odgórnie,
nazwy konsumenta Kafki - ustalamy ją sami, analogicznie do nazwy innych artefaktów,
mając obie nazwy, możemy zgłosić administratorom prośbę o dodanie do konfiguracji mapowania topicu na konsumenta Kafki (podając obie nazwy). Bez mapowania, będziemy w stanie napisać konsumenta Kafki, jednak nie będzie on odbierał wiadomości.
Wymagania konfiguracyjne po stronie Kafka
Dla każdego topicu używanego przez low-code consumera administratorzy muszą przygotować nie tylko topic podstawowy, ale też kompletny zestaw topiców do ponowień i wiadomości odrzuconych:
<nazwa-topicu>-retry-0<nazwa-topicu>-retry-1<nazwa-topicu>-dlt
Jeżeli którykolwiek z tych topiców nie istnieje, konfiguracja jest niepełna i mechanizm ponowień oraz obsługi DLT nie będzie działał poprawnie.
Dodatkowo konsument Eximee musi mieć nadane uprawnienie idempotentWrite, ponieważ w ramach obsługi błędów zapisuje wiadomości na topicach retry i DLT.
Przykład kompletnej konfiguracji topiców
Jeżeli low-code consumer korzysta z topicu eximee-mortgage.fct.email-status, przygotuj cały zestaw:
eximee-mortgage.fct.email-statuseximee-mortgage.fct.email-status-retry-0eximee-mortgage.fct.email-status-retry-1eximee-mortgage.fct.email-status-dlt
Przy zgłoszeniu do administratorów podaj również informację, że dla konsumenta Eximee trzeba nadać uprawnienie idempotentWrite.
Obsługa błędów i ponawianie dostarczenia wiadomości
Konsument low-code może zakończyć obsługę wiadomości na dwa sposoby:
Nie zgłasza wyjątku - wiadomość zostaje uznana za poprawnie obsłużoną.
Zgłasza wyjątek
MessageNotReadyToProcessExceptioni wymusza ponowną próbę dostarczenia.
Domyślnie low-code consumer korzysta z następującej konfiguracji ponowień:
maxAttempts = 3initialInterval = 60000msmultiplier = 5.0maxInterval = 300000ms
Oznacza to, że standardowo wykonywane są 3 próby łącznie:
pierwsza próba na topicu podstawowym,
druga próba po 1 minucie na topicu
-retry-0,trzecia próba po 5 minutach na topicu
-retry-1.
Jeżeli trzecia próba również zakończy się wyjątkiem, komunikat trafia do topicu -dlt.
Przebieg obsługi błędu wygląda więc następująco:
Wiadomość trafia na topic podstawowy.
Jeżeli konsument zgłosi wyjątek, po 1 minucie wiadomość trafia na topic z przyrostkiem
-retry-0.Jeżeli druga próba również zakończy się wyjątkiem, po 5 minutach wiadomość trafia na topic z przyrostkiem
-retry-1.Jeżeli trzecia próba także zakończy się wyjątkiem, wiadomość trafia na topic z przyrostkiem
-dlt.
Konfiguracja własnych czasów retry
Czasy retry są konfigurowane per kafkaId za pomocą właściwości:
script.events.<kafkaId>.retry.max-attemptsscript.events.<kafkaId>.retry.initial-intervalscript.events.<kafkaId>.retry.multiplierscript.events.<kafkaId>.retry.max-interval
Przykład konfiguracji:
W tym przykładzie:
po pierwszym błędzie kolejna próba nastąpi po 30 sekundach,
następne opóźnienia będą wyliczane z użyciem mnożnika
2.0,pojedyncze opóźnienie nie przekroczy 180 sekund,
łączna liczba prób wyniesie 4.
Po przeniesieniu wiadomości na Dead Letter Topic komunikat nie jest już automatycznie przekazywany dalej ani przetwarzany ponownie. Wymagana jest reakcja administratora, który powinien przeanalizować przyczynę błędu i zdecydować o dalszych działaniach.
Konsumenci Kafka w Procesie
Konsumenci Kafka mogą działać niezależnie, jednak zazwyczaj będą powiązani z procesem w Eximee BPMS. Konsumenci Kafka w procesie biorą udział w zdarzeniach typu "Message". Na kroku tego typu Eximee BPMS oczekuje na wiadomość, by móc kontynuować wykonywanie procesu. Wiadomość może zostać wysłana z konsumenta Kafki.

Na etapie projektowania procesu musimy pamiętać o uzupełnieniu nazwy wiadomości w konfiguracji. Musi spełniać ograniczenia Eximee BPMS (Message Events) i będzie nam potrzebna później, przy powiązaniu kroku procesu z konsumentem Kafki.

Tworzenie Konsumenta Kafka
W Eximee Designer wybieramy odpowiednio Biblioteka → Konsumenci Kafka. Tutaj, podobnie do pozostałych artefaktów, znajduje się przycisk Dodaj Konsumenta Kafka:

Przykład użycia konsumenta Kafka:
Pisząc konsumenta Kafki, niemal zawsze będziemy zaczynać od pobrania treści wiadomości, używając context.getMessage().value;. To jak później możemy przetworzyć wiadomość, zależy od ustalonego formatu wiadomości, więc zestaw i typ pól w każdym przypadku mogą być inne. Ważne jest, aby na etapie ustaleń pamiętać o identyfikatorze instancji procesu. W przykładzie jest to pole processInstanceId. Dzięki tej wartości wiemy, której instancji procesu dotyczy dany komunikat.
Pobranie danych z wiadomości
Używając context.getMessage() pobieramy wiadomość i jej metadane. Obiekt, który jest zwracany przez tę funkcję, ma następujące pola:
value
string
Treść (payload) wiadomości.
headers
object
Nagłówki wiadomości Kafka jako mapa klucz–wartość
key
string
Klucz wiadomości Kafka. Może być null, jeśli nie został uzupełniony.
topic
string
Nazwa topiku Kafka, z którego pochodzi wiadomość
partition
number
Numer partycji topiku, z której pochodzi wiadomość
offset
number
Znacznik czasu (epoch ms) utworzenia wiadomości
timestamp
number
Czas utworzenia wiadomości
Należy mieć na uwadze, że:
context.getMessage()- pobiera cały obiekt wiadomości wraz z metadanymi,context.getMessage().value- pobiera samą treść wiadomości. Najczęściej będziemy korzystać właśnie z tej formy.
Ostatnia aktualizacja
Czy to było pomocne?
