Wpis z mikrobloga

Czy ktoś ogarnia Kafkę w Quarkusie? Mam takie zagadnienie:

- serwis A wysyła komunikat "wykonaj_polecenie" na kolejkę "polecenia"
- serwis B pobiera ten komunikat i wywołuje zewnętrzną usługę, ale leci timeout
- połączenie z Kafką jest zrywane i cały serwis B wisi

Co bym chciał osiągnąć:

- jeśli nie uda się wykonać polecenia, to żeby połączenie z Kafką nie było zrywane i żeby kolejne komunikaty dochodziły, choć sam się zastanawiam, czy lepiej jednak nie zrestartować aplikacji (ale jak mam to wykryć?)
- a jeśli mamy zignorować błąd, to żeby nadawca się o tym dowiedział

https://quarkus.io/guides/kafka#error-handling - domyślnie jest 'fail', połączenie z Kafką zdycha i żaden komunikat nie przychodzi, cały wątek I/O wisi, ale apka dalej działa - jak mogę wykryć, że trzeba zrobić restart?

Jeśli w serwisie A wywołuję Emitter::send(), to ta rzekomo oczekuje na ACK lub NACK.

Przy czym jeśli wysyłam komunikat, to ACK/NACK oznacza tylko tyle, że udało się lub nie udało wystawić komunikat do Kafki, a nie, czy odbiorca zwrócił ACK czy NACK?

https://quarkus.io/guides/kafka#sending-messages-with-emitter

Tak więc póki co nie ma żadnego mechanizmu dwustronnej komunikacji?

#kafka #quarkus #java #programowanie
  • 3
  • Odpowiedz
@SendMeAnAngel: Skróć timeout wywołania zewnętrznej usługi albo wydłuż okienko procesowania eventu z kafki żeby zdążyć ten timeout złapać zanim kafka uzna cię za zawieszoną aplikację i w przypadku timeout albo daj znać kafce że nie przeprocesowałeś eventu - dostaniesz go jeszcze raz i przeprocesujesz ponownie - albo wrzuć go na jakieś DLQ i leć z następnym
  • Odpowiedz
@Myzreal: To chyba wszystko jedno, czy ręcznie zwrócę NACK, czy poleci Exception, jeśli pozostawię obecny tryb failure - połączenie z Kafką zostanie zerwane i nie wiadomo, co dalej z tym zrobić i czy mogę to jakoś przechwycić.

Czyli wychodzi na to, że zmniejszyć timeout dla usługi i jeśli poleci timeout, to wtedy podjąć jakąś akcję, np. zrestartować usługę lub całą aplikację.

DLQ to też może być dobry pomysł - nie
  • Odpowiedz
@SendMeAnAngel Da się to zrobić tak żeby nie było restartu, a od biedy można ustawić że tylko wątek się restartuje a nie cała apka, sam to ustawiałem kiedyś. Niestety nie pamiętam szczegółów
  • Odpowiedz