Kafka Topic usuwający rekordy w bazie

0

Cześć.
Mam serwis, który odczytuje dane z topicu kafki. Następnie, na podstawie odczytanych danych, wykonuje typowe operacje CRUD na encjach w bazie danych. Encje w bazie są odwzorowaniem rekordów na topicu. Update oraz Create odbywa się sprawnie. Mam problem z Delete. Z chęcią usłyszę pomysły, jak można to zaimplementować w serwisie (SpringBoot, Java).
Z góry dzięki

Ps uprzedzając odpowiedzi typu: czemu to robisz ---> nie jest to zależne ode mnie. Przedstawiono mnie przed faktem dokonanym, że tak ma być.

0

Ale jaki jest problem z Deletem? Jakieś błędy? Czy po prostu działa wolno? I mniej więcej jak często to polecenie Deleta przychodzi (normalnie delete raczej rzadko się wykonuje)?

0
Pinek napisał(a):

Ale jaki jest problem z Deletem? Jakieś błędy? Czy po prostu działa wolno? I mniej więcej jak często to polecenie Deleta przychodzi (normalnie delete raczej rzadko się wykonuje)?

Delete np opóźnione w warstwie obiektowej (odłożone do finalizacji) ma nieco inny model wykonania / rytm życia od operacji "pozytywnych". Ale to moje subiektywne mniemanie nt mglistego posta

thisIsntAnotherCamelCaseNick napisał(a):

Mam problem z Delete.

A jaki to problem, proszpana ?

0
ZrobieDobrze napisał(a):

A jaki to problem, proszpana ?

Zastanawiam się jak do tego podejść. Np dostałem rekord, posiadający id z topica. Zapisuje ten rekord z tym samym id w bazie (takie wymaganie). Update leci łatwo, bo jest to samo id. Ale przy usunięciu danych z topica, zamiast id jest null (jest faktyczne usuwanie, a nie archiwyzacja).

Myślałem by pobrać wszystkie id z bazy, po czym wszystkie id z topiców i zrobić porównanie. Ale jest to nieeleganckie oraz nieoptymalne

2
thisIsntAnotherCamelCaseNick napisał(a):

przy usunięciu danych z topica, zamiast id jest null

To jak masz zrobić deleta, skoro nie wiesz nawet czego? xD musisz dostać id. Skąd w ogóle idzie ten event polecający zrobienia deleta? On już zrobił jakiś delete "swojej" encji i w ten sposób robicie propagację wsród serwisów? No bo do operacji "delete" potrzebny jest konkretny id, bez tego ani rusz (ewentualnie coś na kształt usuń wszystkie nieaktywne, starsze niż 1 miesiąc, ale raczej to nie ten case).

Myślałem by pobrać wszystkie id z bazy, po czym wszystkie id z topiców i zrobić porównanie. Ale jest to nieeleganckie oraz nieoptymalne

Grubo xd kreatywny jesteś, to na plus. Ale lepiej nie mów tego pomysłu swojemu TLowi.

0

Wyślij po prostu w topicu jakiś identyfikator do zasobu który chcesz usunąć, a potem w consumerze go usuń xd

0
Pinek napisał(a):

To jak masz zrobić deleta, skoro nie wiesz nawet czego? xD musisz dostać id. Skąd w ogóle idzie ten event polecający zrobienia deleta? On już zrobił jakiś delete "swojej" encji i w ten sposób robicie propagację wsród serwisów? No bo do operacji "delete" potrzebny jest konkretny id, bez tego ani rusz (ewentualnie coś na kształt usuń wszystkie nieaktywne, starsze niż 1 miesiąc, ale raczej to nie ten case).

Ja sobie z tego wszystkiego zdaje sprawe. To jest właśnie powód dla którego powstał ten temat :) Gdybym było inaczej nie byłoby problemu.

Escanor16 napisał(a):

Wyślij po prostu w topicu jakiś identyfikator do zasobu który chcesz usunąć, a potem w consumerze go usuń xd

to kompletnie nie ten case.

1

Po przeczytaniu wątku wciąż nie rozumiem jaki masz problem z tym deletem xD

0
RequiredNickname napisał(a):

Po przeczytaniu wątku wciąż nie rozumiem jaki masz problem z tym deletem xD

Ok to może inaczej. Input do serwisu to topici kafka. Output leci do bazy danych. Serwis bierze id z topicu i robi create jeśli w bazie nie ma takiego id. Update jeśli id istnieje. Jak dane na topicu się zmienią i jakiś rekord na topicu zostanie usunięty, nie wiem jak zrobić delete w bazie. Nie znam id usuniętego rekordu. Nie mam jak dostać informacje co usnuąć z bazy.

1

no to idź do tego kogoś kto śle te eventy na kafkę i mu powiedź żeby zaczął dorzucać jakieś unikalne id. No sorry ale z g***a bata nie ukręcisz.

1

Możesz też zrobić drugi topic, na którym będą wysyłane id do usunięcia

0
Black007 napisał(a):

Możesz też zrobić drugi topic, na którym będą wysyłane id do usunięcia

To byłby fajny pomysł, ale nie mogę tego zrobić. Moja kontrola zaczyna się od odebrania danych z topiców istniejących.

3

No to eskaluj ze to kupa nie do wykonania. No chyba ze macie jakies inne unikalne dane w encji po ktorych mozna rozniznic

2

Ale @Black007 zadał w komentarzu słuszne pytanie. Dlaczego ktoś miałby fizycznie usuwać coś z topica? Da się w ogóle tak zrobić?

Jak dla mnie to na topicu powinna się pojawić nowa wiadomość, która dotyczy usunięcia, a już istniejące na topicu wiadomości nie są dotykane.

1

Zakładając, że masz 'compacted topic' to możesz usunąć konkretny rekord po kluczu wysyłając 'tombstone' tj. ten sam klucz i wartość null. Problemem, jest to, że igrasz z ogniem, jeżeli chodzi o to czy Twój consumer zdąży przeczytać tombstone. Jest to konfigurowalne, jednak to jest trochę ryzykowne i wg. mnie zbyt skomplikowane.

0
thisIsntAnotherCamelCaseNick napisał(a):
Black007 napisał(a):

Możesz też zrobić drugi topic, na którym będą wysyłane id do usunięcia

To byłby fajny pomysł, ale nie mogę tego zrobić. Moja kontrola zaczyna się od odebrania danych z topiców istniejących.

Ziemiak napisał(a):

No to eskaluj ze to kupa nie do wykonania. No chyba ze macie jakies inne unikalne dane w encji po ktorych mozna rozniznic

Zlecenie kasowania, na przykład w topicu kolejki, jest głęboko odmienne od zlecenia insert / update. Ma tam być "jakaś" identyfikacja przedmiotu kasowania, jeśli przedmiot "podobno" już gdzies został "jakby" skasowany, znullowany czy jak mu tam. Jak to czuję intuicyjnie, nie umiem jakoś bardziej przystępnie zapodać.
W moim wyobrażeniu rozumie to każdy powyżej juniora, kto nie jest wklejaczem randomowych adnotacji. Widocznie twój topik zasila ktoś na tym poziomie, zasila oczywiście kupą jak @Ziemiak pisze.

0

Przepraszam, ale mam wrażenie, że poza odpowiedzią @Black007 są tu pisane straszne oczywistości z nieznajomych mi powodów.

1

Co Ty właściwie chcesz osiągnąć? Odwzorować stan topicu w bazie danych usługi? Nie rozumiem o co chodzi w tej integracji. Wytłumacz mi sens „biznesowy”, po co to robisz, co chcesz osiągnąć.

1

Dorzuciłbym apkę na Kafka Streams API (może też być jakiś springowy odpowiednik), która będzie łapała takie rekordy i wrzucała ID rekordów do usunięcia na inny topic.
Czyli na wejściu dostaje jakieś info o rekordach (np. BusinessData) -> na wyjściu ma np. DeleteRecord(id). To, w jaki sposób sobie ogarniesz te mapowanie to zależy już od ciebie.

Zaletą takiego podejścia jest to, że będziesz miał informacje, które rekordy wyleciały z powodu Kafki.

0

Zakładam po komentarzach, że faktycznie jest to niewykonalne inaczej niż zakładałem od początku. Dziękuje za zaangażowanie każdemu :)

0

Czemu niektorzy pisza o jakims usuwaniu z topicu kafkowego skoro w pierwszym poscie jest wyraznie napisane ze operacje crud op wykonuje na BAZIE??

1 użytkowników online, w tym zalogowanych: 0, gości: 1