Czy Apache Kafka nadaje się do użycia jako Kolejka zadań?

Kafka dzieli przychodzące wiadomości na partycje, zgodnie z partycją przypisaną przez producenta. Wiadomości z partycji są następnie konsumowane przez konsumentów w różnych grupach konsumentów.

Ta architektura uwrażliwia mnie na używanie Kafki jako kolejki zadań/pracy, ponieważ muszę określić partycję w czasie produkcji, co pośrednio ogranicza możliwość pracy nad nią przez konsumentów, ponieważ partycja jest wysyłana tylko do jednego konsumenta w grupie konsumentów. Wolałbym nie określać partycji z wyprzedzeniem, tak, że każdy konsument jest dostępny do podjęcia tego zadania może to zrobić. Czy istnieje sposób na strukturę partycji / producentów w architekturze Kafka, gdzie zadania mogą być ciągnięte przez następnego dostępnego konsumenta, bez konieczności dzielenia pracy z wyprzedzeniem, wybierając partycję, gdy praca jest produkowana?

Użycie tylko jednej partycji dla tego tematu spowodowałoby umieszczenie wszystkich zadań w tej samej kolejce, ale wtedy liczba konsumentów jest ograniczona do 1 na grupę konsumentów, więc każda konsument musiałby być w innej grupie. Następnie wszystkie zadania są rozprowadzane do każdej grupy konsumentów, co nie jest rodzajem kolejki pracy, której szukam.

Czy Apache Kafka nadaje się do użycia jako Kolejka zadań?

Author: nephets, 2016-03-24

4 answers

Używanie Kafki w kolejce zadań to zły pomysł. Zamiast tego użyj RabbitMQ, robi to znacznie lepiej i bardziej elegancko.

Chociaż możesz użyć Kafki do kolejki zadań - pojawią się pewne problemy: Kafka nie pozwala na konsumpcję pojedynczej partycji przez wielu konsumentów (według projektu), więc jeśli na przykład pojedyncza partycja zostanie wypełniona wieloma zadaniami, a konsument, który jest właścicielem partycji, będzie zajęty, zadania w tej partycji będą "głodowe". Oznacza to również, że kolejność konsumpcji zadania w temacie nie będą identyczne z kolejnością, w jakiej zostały stworzone zadania, co może powodować poważne problemy, jeśli zadania muszą być zużywane w określonej kolejności (w Kafce aby w pełni to osiągnąć, musisz mieć tylko jednego konsumenta i jedną partycję - co oznacza seryjne zużycie przez tylko jeden węzeł. Jeśli masz wielu konsumentów i wiele partycji kolejność zadań zużycie nie będzie gwarantowana w poziomie tematu).

Faktycznie-tematy Kafki nie są kolejkami w Informatyka. Kolejka oznacza najpierw pierwsze wyjście - to nie jest to, co dostajesz w Kafce na poziomie tematu.

Kolejną kwestią jest to, że trudno jest dynamicznie zmieniać liczbę partycji. Dodawanie lub usuwanie nowych pracowników powinno być dynamiczne. Jeśli chcesz mieć pewność, że nowi pracownicy otrzymają zadania w Kakfie, musisz ustawić numer partycji na maksymalną możliwą liczbę pracowników. To nie jest wystarczająco eleganckie.

Więc podsumowując-użyj RabbitMQ lub innych kolejek zamiast tego.

Powiedziawszy to wszystko-Samza (przez linkedin) używa Kafki jako pewnego rodzaju kolejki zadań opartych na streamingu: Samza

 21
Author: Ofer Eliassaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-31 08:15:43

Powiedziałbym, że to zależy od skali. Ile zadań przewidujesz w jednostce czasu?

To, co opisujesz jako cel końcowy, to w zasadzie domyślne działanie Kafki. Gdy tworzysz wiadomości, domyślną (najczęściej używaną) opcją jest użycie losowego partycjonera, który wybiera partycje w sposób round robin, zachowując ich równomierne użycie (więc można uniknąć podania partycji).
Głównym celem partycji jest równoległe przetwarzanie wiadomości, więc powinieneś go używać w taki sposób.
Inną powszechnie używaną "rzeczą", do której używane są partycje, jest zapewnienie, że niektóre wiadomości są zużywane w tej samej kolejności, w jakiej są produkowane (następnie określasz klucz partycjonowania w taki sposób, że wszystkie takie wiadomości kończą się na tej samej partycji. Np. użycie userId jako klucza zapewniłoby, że wszyscy użytkownicy są przetwarzani w taki sposób).

 5
Author: Marko Bonaci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-24 20:07:56

Istnieją dwie główne przeszkody w używaniu Kafki jako kolejki komunikatów:

  1. Jak opisano w Ofer ' s answer , można konsumować tylko jedną partycję od jednego konsumenta, a kolejność przetwarzania jest gwarantowana tylko wewnątrz partycji. Więc jeśli nie możesz sprawiedliwie rozdzielić zadań na partycje, może to być problem

  2. Domyślnie możesz potwierdzić przetwarzanie wszystkich wiadomości do określonego punktu (offset). W przeciwieństwie do tradycyjnych kolejki wiadomości, nie można zrobić selektywnego potwierdzenia, a w przypadku awarii, selektywne powtórzenia. Może to być adres za pomocą kmq, który dodaje indywidualne możliwości ACK za pomocą dodatkowego tematu(zastrzeżenie: jestem autorem kmq).

RabbitMQ jest oczywiście alternatywą, ale daje również inne (niższe) Gwarancje wydajności i replikacji. W skrócie, dokumenty RabbitMQ stwierdzają, że broker nie jest tolerancyjny na partycje . Zobacz także nasze porównanie z kolejek komunikatów z replikacją danych, mqperf .

 2
Author: adamw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-27 13:54:12

W tym temacie jest wiele dyskusji wokół kolejności wykonywania zadań w pracy lub kolejce zadań. Wysunąłbym pogląd, że kolejność wykonania nie powinna być cechą kolejki pracy.

Kolejka robocza jest sposobem kontrolowania wykorzystania zasobów poprzez zastosowanie kontrolowanej liczby wątków roboczych w celu wykonania różnych zadań. Egzekwowanie zlecenia przetwarzania zadań w kolejce oznacza również egzekwowanie zlecenia realizacji zadań w kolejce, które efektywnie oznacza, że zadania w kolejce będą zawsze przetwarzane kolejno, a następne zadanie będzie przetwarzane dopiero po zakończeniu poprzedniego zadania. To skutecznie oznacza, że masz jedną kolejkę zadań z wątkiem.

Jeśli kolejność wykonania jest ważna w niektórych zadaniach, to zadania te powinny dodać kolejne zadanie w kolejności do kolejki zadań po jej zakończeniu. Albo To, albo obsługujesz sekwencyjny Typ zadania, który po przetworzeniu faktycznie przetwarza listę zadań kolejno na jednym pracowniku.

W żaden sposób Kolejka zadań nie powinna porządkować żadnej ze swoich prac - następny dostępny procesor powinien zawsze wykonywać następne zadanie bez względu na to, co wydarzyło się przed lub po zakończeniu zadania.

Patrzyłem też na Kafkę jako podstawę kolejki do pracy, ale im bardziej ją badam, tym mniej wygląda na pożądaną platformę.

Widzę, że jest używany głównie jako środek synchronizacji różnych zasobów i nie tyle jako środek wykonywanie różnych zapytań o pracę.

Innym obszarem, który moim zdaniem jest ważny w kolejce pracy, jest wsparcie priorytetyzacji zadań. Na przykład, jeśli w kolejce jest 20 zadań, a pojawi się nowe zadanie o wyższym priorytecie, chcę, aby to zadanie przeskoczyło na początek linii, która zostanie odebrana przez następnego dostępnego workera. Kafka by na to nie pozwoliła.

 0
Author: Rodney P. Barbati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-15 21:47:25