{"id":590,"date":"2023-04-02T12:00:00","date_gmt":"2023-04-02T10:00:00","guid":{"rendered":"https:\/\/blog.lantkowiak.pl\/?p=590"},"modified":"2023-04-02T01:05:39","modified_gmt":"2023-04-01T23:05:39","slug":"co-w-kafce-piszczy","status":"publish","type":"post","link":"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/","title":{"rendered":"Co w Kafce piszczy?"},"content":{"rendered":"\n<p>Dzisiaj zajmiemy si\u0119 <a href=\"https:\/\/kafka.apache.org\/\">Kafk\u0105<\/a>, czyli jednym z broker\u00f3w wiadomo\u015bci. Na pierwszy rzut oka mo\u017ce by\u0107 podobny do RabbitMQ czy ActiveMQ, ale szczeg\u00f3\u0142y robi\u0105 tutaj du\u017c\u0105 r\u00f3\u017cnice. W tym wpisie nie b\u0119dziemy kodowa\u0107 i patrze\u0107 jak wysy\u0142a\u0107 czy odbiera\u0107 wiadomo\u015bci, a om\u00f3wimy sobie troch\u0119 architektur\u0119 Kafki oraz jak jest zaimplementowana.  <\/p>\n\n\n\n<p>Zaczniemy sobie patrze\u0107 na to wszystko z g\u00f3ry i postaramy si\u0119 zag\u0142\u0119bia\u0107 w poszczeg\u00f3lne elementy Kafki.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">G\u0142\u00f3wne elementy uk\u0142adanki<\/h3>\n\n\n\n<p>Przyjrzymy si\u0119 najpierw g\u0142\u00f3wny elementom, kt\u00f3re b\u0119d\u0105 wyst\u0119powa\u0107 w ka\u017cdym \u015brodowisku gdzie jest Kafka.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"466\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-1024x466.png\" alt=\"\" class=\"wp-image-614\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-1024x466.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-300x136.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-768x349.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-1536x698.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-2048x931.png 2048w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-973x442.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/kafka_ecosystem-508x231.png 508w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Producenci<\/h4>\n\n\n\n<p>Producenci s\u0105 to aplikacje, kt\u00f3re tworz\u0105 wiadomo\u015bci oraz je wysy\u0142aj\u0105 do Kafki.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Konsumenci<\/h4>\n\n\n\n<p>Konsumerami nazywamy aplikacje, kt\u00f3re maj\u0105 za zadanie odbieranie wiadomo\u015bci wcze\u015bniej wys\u0142anych przez Producent\u00f3w.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ekosystem Kafki<\/h4>\n\n\n\n<p>Przez ekosystem Kafki powinni\u015bmy rozumie\u0107 Klaster Kafki, na kt\u00f3ry sk\u0142adaj\u0105 si\u0119 Brokerzy, oraz Zookeepera.<\/p>\n\n\n\n<p>Opis zaczniemy od opisu Ekosystemu Kafki, \u017ceby\u015bmy mogli zapozna\u0107 si\u0119 z g\u0142\u00f3wnymi poj\u0119ciami, kt\u00f3rych b\u0119dziemy u\u017cywa\u0107 przy opisywaniu Producent\u00f3w i Konsument\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Topic<\/h3>\n\n\n\n<p>Topic jest kluczowym poj\u0119ciem w kwestii zrozumienia jak dzia\u0142a Kafka. Jest on odpowiednikiem kolejki w innych brokerach wiadomo\u015bci. Czyli jest to miejsce gdzie wiadomo\u015bci s\u0105 wysy\u0142ane, a nast\u0119pnie odbierane.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2-1024x315.png\" alt=\"\" class=\"wp-image-595\" width=\"402\" height=\"123\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2-1024x315.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2-300x92.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2-768x236.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2-1536x472.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2-973x299.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2-508x156.png 508w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_1-2.png 1834w\" sizes=\"auto, (max-width: 402px) 100vw, 402px\" \/><\/figure><\/div>\n\n\n\n<p>Najpierw zacznijmy od tego, jak wiadomo\u015bci s\u0105 przechowywane przez Kafk\u0119. Kafk\u0105 tworzy plik log\u00f3w (dlatego czasami mo\u017cemy si\u0119 spotka\u0107 z uzyciem poj\u0119cia log\u00f3w w kontek\u015bcie Kafki), do kt\u00f3rego kolejne wiadomo\u015bci s\u0105 dopisywane na koniec tego pliku. Na powy\u017cszym obrazku mo\u017cemy zobaczy\u0107 prosty przyk\u0142ad Topica, kt\u00f3ry przechowuje obecnie 8 otrzymanych wiadomo\u015bci zapisanych w ten kolejno\u015bci, w kt\u00f3rej zosta\u0142y otrzymane. Kolejna wiadomo\u015b\u0107, w naszym przyk\u0142adzie 9, b\u0119dzie zapisana na ko\u0144cu tego pliku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Partycje<\/h3>\n\n\n\n<p>Kafka zapewnia nam skalowalno\u015b\u0107, wysok\u0105 wydajno\u015b\u0107 czy odporno\u015b\u0107 na b\u0142\u0119dy. Na naszym  ostatnim przyk\u0142adzie mo\u017cemy zauwa\u017cy\u0107, \u017ce mog\u0142oby to by\u0107 ci\u0119\u017ckie do osi\u0105gni\u0119cia gdyby budowa Topica, by\u0142a taka prosta. Z pomoc\u0105 tutaj przychodz\u0105 partycje.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2-1024x612.png\" alt=\"\" class=\"wp-image-597\" width=\"425\" height=\"254\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2-1024x612.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2-300x179.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2-768x459.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2-1536x918.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2-973x582.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2-508x304.png 508w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_2.png 1818w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><\/figure><\/div>\n\n\n\n<p>Ka\u017cdy Topic jest podzielony na 1 lub wi\u0119cej partycji. Nasz pierwszy przyk\u0142ad pokazywa\u0142 Topic, w kt\u00f3rym by\u0142a tylko jedna partycja. W naszym obecnym przyk\u0142adzie mo\u017cemy zauwa\u017cy\u0107, \u017ce nasz Topic obecnie posiada 3 partycje. Ka\u017cda z partycji jest osobnym plikiem log\u00f3w, do kt\u00f3rego zapisywane s\u0105 kolejne wiadomo\u015bci. Architektura ta wymusza, \u017ce <strong>kolejno\u015b\u0107 wys\u0142anych wiadomo\u015bci jest zachowana tylko w obr\u0119bie jednej partycji, a nie ca\u0142ego Topicu<\/strong>.<\/p>\n\n\n\n<p>Jak wida\u0107, dzi\u0119ki zastotowaniu partycji Kafka zyskuje na skalowalno\u015bci oraz wydajno\u015bci przetwarzania event\u00f3w. Do odporno\u015bci na b\u0142\u0119dy wr\u00f3cimy za kilka chwil. Najpierw powiedzmy sobie jeszcze na jakiej podstawie jest wybierana partycja dla wys\u0142anej wiadomo\u015bci.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Wyb\u00f3r partycji<\/h4>\n\n\n\n<p>Partycja dla wysy\u0142anej wiadomo\u015bci jest wybierana na jeden z poni\u017cszych sposob\u00f3w<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Round-Robin<\/h5>\n\n\n\n<p>Domy\u015blnym algorytmem wybory partycji jest algorytm Round-Robin. Oznacza to, \u017ce kolejne wiadomo\u015bci b\u0119d\u0119 trafia\u0142y do kolejnych partycji. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-1024x484.png\" alt=\"\" class=\"wp-image-599\" width=\"452\" height=\"214\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-1024x484.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-300x142.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-768x363.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-1536x725.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-2048x967.png 2048w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-973x460.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_1-508x240.png 508w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/figure><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Partition Key<\/h5>\n\n\n\n<p>Kolejnym sposobem wyboru partcji jest tak zwany Partition Key. Przy wysy\u0142aniu wiadomo\u015bci Procudent mo\u017ce zdefiniowa\u0107 klucz, d\u0142a kt\u00f3rego zostanie wyliczony hash, a nast\u0119pnie na tej podstawie wiadomo\u015b\u0107 trafi do konkretnej partycji. Zasada dzia\u0142ania jest tutaj podobna do mechanizmu, kt\u00f3ry jest w HashMapie.<\/p>\n\n\n\n<p>Algorytm ten jest przydatny wtedy, kiedy zale\u017cy nam na zachowaniu kolejno\u015bci przetwarzanych wiadomo\u015bci  dla event\u00f3w wygenerowanych na przyk\u0142ad dla tego samego usera.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-1024x348.png\" alt=\"\" class=\"wp-image-600\" width=\"515\" height=\"175\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-1024x348.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-300x102.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-768x261.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-1536x522.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-2048x696.png 2048w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-973x331.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/partition_algorithm_2-508x173.png 508w\" sizes=\"auto, (max-width: 515px) 100vw, 515px\" \/><\/figure><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Custom Partitioner<\/h5>\n\n\n\n<p>Ostatnim sposobem wybory partycji jest customowy partitioner napisany przez deweloper\u00f3w uwzgledniaj\u0105cy logik\u0119 biznesow\u0105 aplikacji.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Replikacja<\/h4>\n\n\n\n<p>I teraz wracamy do wspomnianej wcze\u015bniej odporno\u015bci na b\u0142\u0119dy i tego jak Kafka sobie z nimi radzi. Kafka posiada mechanizm replikacji, kt\u00f3ry tworzy repliki danych, dzi\u0119ki kt\u00f3rym nawet gdy jeden z broker\u00f3w padnie to \u017cadne dane nie s\u0105 tracone oraz wci\u0105\u017c pozostaj\u0105 dost\u0119pne.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-1024x591.png\" alt=\"\" class=\"wp-image-602\" width=\"-262\" height=\"-151\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-1024x591.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-300x173.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-768x443.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-1536x887.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-2048x1183.png 2048w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-973x562.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2022\/12\/topic_replication-508x293.png 508w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Na powy\u017cszym przyk\u0142adzie mo\u017cemy zobaczyc sytuacje gdzie dla jednego Topica mamy 3 partycje. Ka\u017cda z partycji ma dodatkowo jedn\u0119 replike, kt\u00f3ra jest na innym brokerze. Ka\u017cda z partycji ma swojego lidera, kt\u00f3ry odpowiada za zapis danych oraz za ich replikacje do innych broker\u00f3w. W przypadku awarii lidera jedna z replik (follower) przejmuje jego rol\u0119. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zookeeper<\/h3>\n\n\n\n<p>Jednym z element\u00f3w ekosystemu Kafki jest Zookeeper. Zookeeper jest odpowidzialny mi\u0119dzy innymi za:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>wyb\u00f3r lidera partycji &#8211; w przypadku awarii brokera, kt\u00f3ry zawiera Lidera partycji wybierany jest nowy Lider<\/li><li>konfiguracje Topic\u00f3w &#8211; zawiera informacje o wszystkich Topicach, liczbie replik, liderach, itp.<\/li><li>konfiguracje Broker\u00f3w &#8211; zawiera informacje o wszystkich Brokerach, kt\u00f3re wchodz\u0105 w sk\u0142ad naszego klastra<\/li><li>ustawienia kontroli dost\u0119pu<\/li><\/ul>\n\n\n\n<p>Warto tutaj zaznaczy\u0107 r\u00f3wnie\u017c, \u017ce od wersji 3.2.0 Kafka nie wymaga Zookeepera do prawid\u0142owego dzia\u0142ania.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Producent<\/h3>\n\n\n\n<p>Producent, czyli aplikacja odpowiadaj\u0105ca za wysy\u0142anie wiadomo\u015bci, publikuje wiadomo\u015b\u0107 na jeden z Topic\u00f3w.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Wiadomo\u015b\u0107<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/01\/kafka_message.png\" alt=\"\" class=\"wp-image-606\" width=\"151\" height=\"201\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/01\/kafka_message.png 757w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/01\/kafka_message-225x300.png 225w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/01\/kafka_message-508x677.png 508w\" sizes=\"auto, (max-width: 151px) 100vw, 151px\" \/><\/figure><\/div>\n\n\n\n<p>Ka\u017cda wiadomo\u015b\u0107 mo\u017ce sk\u0142ada\u0107 si\u0119 z nast\u0119puj\u0105cych cz\u0119\u015bci:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>klucz (opcjonalnie) &#8211; je\u017celi klucz jest podany wtedy jest u\u017cywany do wyboru partycji, na kt\u00f3ry trafia wiadomo\u015b\u0107 (czyli wszystkie wiadomo\u015bci opublikowane z tym samym kluczem trafi\u0105 na te sam\u0105 partycj\u0119, a co za tym idzie b\u0119dzie zachowana ich kolejno\u015b\u0107 wys\u0142ania w obr\u0119bie w\u0142a\u015bnie tej partycji); je\u017celi klucz nie jest podany to wiadomo\u015b\u0107 b\u0119dzie opublikowana w partycji zgodnie ze wspomnianym algorytmem Round-Robin lub przy u\u017cyciu Custom Partitionera, je\u017celi taki jest zaimplementowany.<\/li><li>warto\u015b\u0107 &#8211; cz\u0119\u015b\u0107 wiadomo\u015bci, zawieraj\u0105ca dane biznesowe<\/li><li>nag\u0142owki (opcjonalnie) &#8211; dowolne nag\u0142\u00f3wki, kt\u00f3re mo\u017cey ustawi\u0107, a nast\u0119pnie wykorzysta\u0107 przy obieraniu wiadomo\u015bci<\/li><li>timestamp &#8211; po prostu znacznik czasu \ud83d\ude42 <\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Wysy\u0142ka<\/h4>\n\n\n\n<p>Gdy producent ma ju\u017c przygotowan\u0105 wiadomo\u015b\u0107 to nie pozostaje mu nic innego jak jak wys\u0142anie jej na wybrany <strong>Topic<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Konsument<\/h3>\n\n\n\n<p>Ostatnim elementem w naszej uk\u0142adance s\u0105 konsumenci. Na pocz\u0105tku musimy zaznaczy\u0107, \u017ce Kafka w odr\u00f3\u017cnienia od innych implementacji kolejek nie wypycha wiadomo\u015bci do konsument\u00f3w. W Kafce to konsumenci musz\u0105 odczytywa\u0107 wiadomo\u015bci z poszczeg\u00f3lnych partycji w ramach wybranego tematu.<\/p>\n\n\n\n<p>Ka\u017cdy Konsument posiada sw\u00f3j kursor, kt\u00f3ry wskazuje na kolejn\u0105 wiadomo\u015b\u0107 w partycji, kt\u00f3ra b\u0119dzie odczytana. Po odczytaniu wiadomo\u015bci rol\u0105 Konsumenta jest przesuni\u0119cie kursora, na kolejn\u0105 wiadomo\u015b\u0107. Mechanizm ten zapewnia, \u017ce wiadomo\u015bci z danej partycji s\u0105 odczytywane dok\u0142adnie w tej kolejno\u015bci w jakiej zota\u0142y na ni\u0105 zapisane.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumers-1024x786.png\" alt=\"\" class=\"wp-image-616\" width=\"255\" height=\"195\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumers-1024x786.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumers-300x230.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumers-768x590.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumers-973x747.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumers-508x390.png 508w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumers.png 1353w\" sizes=\"auto, (max-width: 255px) 100vw, 255px\" \/><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Grupa Konsument\u00f3w<\/h4>\n\n\n\n<p>Consumer groups to mechanizm w Kafce, kt\u00f3ry umo\u017cliwia wielu klientom jednoczesne odbieranie danych z temat\u00f3w. Grupa konsument\u00f3w to logiczna jednostka, kt\u00f3ra sk\u0142ada si\u0119 z jednego lub wi\u0119cej konsument\u00f3w, kt\u00f3rzy odbieraj\u0105 wiadomo\u015bci z tematu. Ka\u017cdy konsument mo\u017ce odbiera\u0107 wiadomo\u015bci z dowolnej liczby partycji. Natomiast z jednej partycji mo\u017ce wiadomo\u015bci odbiera\u0107 maksymalnie jeden Konsument w ramach jednej Grupy Konsument\u00f3w. Mo\u017ce to brzmie\u0107 troch\u0119 zawile, ale jak zerkniemy na poni\u017csze przyk\u0142ady to wszystko powinno sta\u0107 si\u0119 jasne.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1-1024x888.png\" alt=\"\" class=\"wp-image-618\" width=\"-390\" height=\"-338\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1-1024x888.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1-300x260.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1-768x666.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1-1536x1332.png 1536w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1-973x844.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1-508x441.png 508w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_1.png 1788w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Na powy\u017cszym przyk\u0142adzie widzimy 3 Grupy Konsument\u00f3w, kt\u00f3re odczytuj\u0105 wiadomo\u015bci z jednego Tematu. Jak mo\u017cemy zauwa\u017cy\u0107 ka\u017cda z Grup ma inn\u0105 liczb\u0119 Konsument\u00f3w, a ka\u017cdy z nich ma przypisany jedn\u0105 lub wi\u0119cej partycji do odczytu.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_2-1024x570.png\" alt=\"\" class=\"wp-image-619\" width=\"444\" height=\"246\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_2-1024x570.png 1024w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_2-300x167.png 300w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_2-768x427.png 768w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_2-973x541.png 973w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_2-508x283.png 508w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/04\/consumer_groups_2.png 1522w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/figure><\/div>\n\n\n\n<p>Na powy\u017cszym obrazku mamy z kolei przyk\u0142ad gdzie Grupa Konsument\u00f3w, zawiera wi\u0119cej Konsument\u00f3w ni\u017c jest partycji w danym Temacie. W takim przypadku jeden z Konsument\u00f3w pozostaje nieaktywny i nie wykonuje \u017cadnej pracy zwi\u0105zanej z odczytywaniem wiadomo\u015bci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>W tym wpisie przeanalizowali\u015bmy z jakich element\u00f3w sk\u0142ada si\u0119 Ekosystem Kafki. Poznali\u015bmy r\u00f3wnie\u017c jakie elementy powoduj\u0105 to, \u017ce Kafka mo\u017ce byc tak wydajna, w jaki spos\u00f3b si\u0119 skaluje oraz dzi\u0119ki czemu jest zapewniona trwa\u0142o\u015b\u0107 danych w Kafce.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj zajmiemy si\u0119 Kafk\u0105, czyli jednym z broker\u00f3w wiadomo\u015bci. Na pierwszy rzut oka mo\u017ce by\u0107 podobny do RabbitMQ czy ActiveMQ, ale szczeg\u00f3\u0142y robi\u0105 tutaj du\u017c\u0105 r\u00f3\u017cnice. W tym&#8230;<\/p>\n","protected":false},"author":1,"featured_media":609,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[44,45],"class_list":["post-590","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kafka","tag-kafka","tag-kolejka"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Co w Kafce piszczy? - Lukasz Antkowiak&#039;s blog<\/title>\n<meta name=\"description\" content=\"W tym wpisie opiszemy z jakich komponent\u00f3w sk\u0142ada si\u0119 Kafka\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Co w Kafce piszczy? - Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"W tym wpisie opiszemy z jakich komponent\u00f3w sk\u0142ada si\u0119 Kafka\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-02T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-01T23:05:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/03\/kafka.png\" \/>\n\t<meta property=\"og:image:width\" content=\"6800\" \/>\n\t<meta property=\"og:image:height\" content=\"3200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"\u0141ukasz Antkowiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0141ukasz Antkowiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/\",\"name\":\"Co w Kafce piszczy? - Lukasz Antkowiak&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\"},\"datePublished\":\"2023-04-02T10:00:00+00:00\",\"dateModified\":\"2023-04-01T23:05:39+00:00\",\"author\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\"},\"description\":\"W tym wpisie opiszemy z jakich komponent\u00f3w sk\u0142ada si\u0119 Kafka\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.lantkowiak.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Co w Kafce piszczy?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\",\"url\":\"https:\/\/blog.lantkowiak.pl\/\",\"name\":\"Lukasz Antkowiak&#039;s blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\",\"name\":\"\u0141ukasz Antkowiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"caption\":\"\u0141ukasz Antkowiak\"},\"description\":\"dd\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Co w Kafce piszczy? - Lukasz Antkowiak&#039;s blog","description":"W tym wpisie opiszemy z jakich komponent\u00f3w sk\u0142ada si\u0119 Kafka","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/","og_locale":"pl_PL","og_type":"article","og_title":"Co w Kafce piszczy? - Lukasz Antkowiak&#039;s blog","og_description":"W tym wpisie opiszemy z jakich komponent\u00f3w sk\u0142ada si\u0119 Kafka","og_url":"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/","og_site_name":"Lukasz Antkowiak&#039;s blog","article_published_time":"2023-04-02T10:00:00+00:00","article_modified_time":"2023-04-01T23:05:39+00:00","og_image":[{"width":6800,"height":3200,"url":"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2023\/03\/kafka.png","type":"image\/png"}],"author":"\u0141ukasz Antkowiak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"\u0141ukasz Antkowiak","Szacowany czas czytania":"9 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/","url":"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/","name":"Co w Kafce piszczy? - Lukasz Antkowiak&#039;s blog","isPartOf":{"@id":"https:\/\/blog.lantkowiak.pl\/#website"},"datePublished":"2023-04-02T10:00:00+00:00","dateModified":"2023-04-01T23:05:39+00:00","author":{"@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6"},"description":"W tym wpisie opiszemy z jakich komponent\u00f3w sk\u0142ada si\u0119 Kafka","breadcrumb":{"@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2023\/04\/02\/co-w-kafce-piszczy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.lantkowiak.pl\/"},{"@type":"ListItem","position":2,"name":"Co w Kafce piszczy?"}]},{"@type":"WebSite","@id":"https:\/\/blog.lantkowiak.pl\/#website","url":"https:\/\/blog.lantkowiak.pl\/","name":"Lukasz Antkowiak&#039;s blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6","name":"\u0141ukasz Antkowiak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","caption":"\u0141ukasz Antkowiak"},"description":"dd","url":"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/comments?post=590"}],"version-history":[{"count":17,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/590\/revisions"}],"predecessor-version":[{"id":623,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/590\/revisions\/623"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media\/609"}],"wp:attachment":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media?parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/categories?post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/tags?post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}