{"id":37849,"date":"2019-10-31T22:20:09","date_gmt":"2019-10-31T19:20:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kafka-i-mikroservisy-obzor\/"},"modified":"2019-10-31T22:20:09","modified_gmt":"2019-10-31T19:20:09","slug":"kafka-i-mikroservisy-obzor","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","title":{"rendered":"Kafka in mikroservisi: pregled","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kafka in mikroservisi: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/ab0534ad5d28b3c3aa03e4e0b2d3101b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hallo zusammen. In diesem Artikel werde ich erl\u00e4utern, warum wir bei Avito vor neun Monaten Kafka ausgew\u00e4hlt haben und was diese Technologie ausmacht. Ich teile einen Anwendungsfall \u2014 den Nachrichtenaustausch. Und zum Schluss sprechen wir dar\u00fcber, welche Vorteile wir durch den Einsatz von Kafka as a Service erhalten haben.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"problema\">Te\u017eava<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka in mikroservisi: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/dfa5e231847cee67259da17867a11812.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zun\u00e4chst etwas Kontext. Vor einiger Zeit haben wir begonnen, von einer monolithischen Architektur abzur\u00fccken, und jetzt gibt es bei Avito bereits mehrere Hundert verschiedene Services. Diese haben ihre eigenen Speicher, ihren eigenen Technologie-Stack und sind f\u00fcr ihren Teil der Gesch\u00e4ftlogik verantwortlich. <\/p>\n<p><\/p>\n<p>Eines der Probleme mit einer gro\u00dfen Anzahl von Services sind die Kommunikationen. Service A m\u00f6chte oft Informationen von Service B erhalten. In diesem Fall wendet sich Service A \u00fcber eine synchrone API an Service B. Service C m\u00f6chte wissen, was bei den Services G und D passiert, w\u00e4hrend diese wiederum an den Services A und B interessiert sind. Wenn es viele solcher \"neugierigen\" Services gibt, verwandeln sich die Verbindungen zwischen ihnen in ein verworrenes Kn\u00e4uel.<\/p>\n<p><\/p>\n<p>Gleichzeitig kann Service A jederzeit nicht verf\u00fcgbar sein. Was sollen in diesem Fall Service B und alle anderen, die von ihm abh\u00e4ngen, tun? Und wenn f\u00fcr die Durchf\u00fchrung einer Gesch\u00e4ftsoperation eine Kette von aufeinanderfolgenden synchronen Aufrufen erforderlich ist, steigt die Wahrscheinlichkeit, dass die gesamte Operation fehlschl\u00e4gt, noch weiter (und je l\u00e4nger diese Kette ist, desto h\u00f6her ist die Wahrscheinlichkeit). <\/p>\n<p><\/p>\n<h1 id=\"vybor-tehnologii\">Technologiewahl<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka in mikroservisi: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/3acd7bcf3dded8093bdef6d627eb4071.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Okay, die Probleme sind klar. Man kann sie beheben, indem man ein zentrales Nachrichtenaustauschsystem zwischen den Services einrichtet. Jetzt reicht es aus, wenn jeder Service nur \u00fcber dieses System Bescheid wei\u00df. Zudem sollte das System ausfallsicher und horizontal skalierbar sein und im Falle eines Ausfalls einen Puffer f\u00fcr sp\u00e4tere Verarbeitung der Anfragen speichern. <\/p>\n<p><\/p>\n<p>Lassen Sie uns nun die Technologie ausw\u00e4hlen, auf der die Nachrichten\u00fcbermittlung realisiert wird. Zun\u00e4chst m\u00fcssen wir verstehen, was wir von ihr erwarten:<\/p>\n<p><\/p>\n<ul>\n<li>Nachrichten zwischen den Services d\u00fcrfen nicht verloren gehen;<\/li>\n<li>Nachrichten d\u00fcrfen dupliziert werden;<\/li>\n<li>Nachrichten k\u00f6nnen f\u00fcr mehrere Tage gespeichert und abgerufen werden (persistenter Puffer);<\/li>\n<li>Services k\u00f6nnen sich f\u00fcr die Daten, die sie interessieren, anmelden;<\/li>\n<li>Mehrere Services k\u00f6nnen dieselben Daten lesen;<\/li>\n<li>Nachrichten k\u00f6nnen einen detaillierten, umfangreichen Payload enthalten (event-carried state transfer);<\/li>\n<li>Manchmal ist eine Garantie f\u00fcr die Reihenfolge der Nachrichten erforderlich.<\/li>\n<\/ul>\n<p><\/p>\n<p>Prav tako nam je bilo izredno pomembno izbrati \u010dim bolj skalabilen in zanesljiv sistem z visoko prepustnostjo (vsaj 100k sporo\u010dil pri nekaj kilobajtih na sekundo).<\/p>\n<p><\/p>\n<p>V tej fazi smo se poslovili od RabbitMQ (te\u017eko ga je ohranjati stabilnega pri visokih rps), PGQ od SkyTools (ni dovolj hiter in slabo skalabilen) in NSQ (ni preto\u010den). Vse te tehnologije imamo v podjetju, a niso ustrezale re\u0161itvi, ki smo jo iskali. <\/p>\n<p><\/p>\n<p>Nato smo za\u010deli raziskovati nove za nas tehnologije \u2014 Apache Kafka, Apache Pulsar in NATS Streaming.<\/p>\n<p><\/p>\n<p>Najprej smo odvrgli Pulsar. Odlo\u010dili smo se, da sta Kafka in Pulsar precej podobni re\u0161itvi. In \u010deprav je Pulsar preizku\u0161en s strani velikih podjetij, je novej\u0161i in teoreti\u010dno ponuja bolj\u0161o latenco, smo se odlo\u010dili obdr\u017eati Kafko kot de facto standard za tovrstne naloge. Verjetno se bomo v prihodnosti vrnili na Apache Pulsar. <\/p>\n<p><\/p>\n<p>In tako sta ostala dva kandidata: NATS Streaming in Apache Kafka. Oba re\u0161itve smo temeljito preu\u010dili in oboji so se izkazali za primerne za nalogo. A na koncu smo se balili relativne mladosti NATS Streaming (in dejstva, da je eden od glavnih razvijalcev, Tyler Treat, opustil projekt in za\u010del svojega \u2014 Liftbridge). Hkrati na\u010din zdru\u017eevanja NATS Streaming ni omogo\u010dal mo\u010dnega horizontalnega skaliranja (morda to ni ve\u010d te\u017eava po dodajanju na\u010dina particioniranja leta 2017).<\/p>\n<p><\/p>\n<p>Kljub temu je NATS Streaming odli\u010dna tehnologija, napisana v Go in ima podporo Cloud Native Computing Foundation. Za razliko od Apache Kafke ne potrebuje Zookeeperja za delovanje (morda, <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Managed+Metadata+Quorum\">kmalu bomo lahko rekli isto za Kafko<\/a><\/noindex>), saj znotraj implementira RAFT. Hkrati je NATS Streaming preprostej\u0161i za administracijo. Ne izklju\u010dujemo mo\u017enosti, da se bomo v prihodnosti \u0161e vrnili k tej tehnologiji. <\/p>\n<p><\/p>\n<p>Kljub temu je na dana\u0161nji dan na\u0161a zmagovalka Apache Kafka. V na\u0161ih testih se je izkazala za dovolj hitro (ve\u010d kot milijon sporo\u010dil na sekundo pri branju in pisanju pri velikosti sporo\u010dil 1 kilobajt), dovolj zanesljivo, dobro skalabilno in preizku\u0161eno v praksi s strani velikih podjetij. Poleg tega Kafka podpira vsaj nekaj velikih komercialnih podjetij (na primer, mi uporabljamo razli\u010dico Confluent), pa tudi Kafka ima razvit ekosistem.<br \/>\n<br clear=\"left\">\n <\/p>\n<p><\/p>\n<h1 id=\"obzor-kafka\">Pregled Kafke<\/h1>\n<p><\/p>\n<p>Preden za\u010dnete, takoj priporo\u010dam odli\u010dno knjigo \u2014 <em>\u00abKafka: The Definitive Guide\u00bb<\/em> (je tudi v ru\u0161\u010dini, vendar termini nekoliko zmedejo). V njej lahko najdete informacije, potrebne za osnovno razumevanje Kafke in \u0161e malo ve\u010d. Sama dokumentacija Apache in blog Confluent sta prav tako odli\u010dno napisani in enostavno berljivi. <\/p>\n<p><\/p>\n<p>Torej, poglejmo, kako izgleda Kafka z pti\u010dje perspektive. Osnovna topologija Kafke sestavljajo producer, consumer, broker in zookeeper.<\/p>\n<p><\/p>\n<h3 id=\"broker\">Broker<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka in mikroservisi: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/82f34b5a1aadcdc07eef58eb5414b553.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za shranjevanje va\u0161ih podatkov je odgovoren broker. Vsi podatki so shranjeni v binarni obliki, broker pa malo ve o tem, kaj ti podatki predstavljajo in kak\u0161na je njihova struktura. <\/p>\n<p><\/p>\n<p>Vsaka logi\u010dna vrsta dogodkov se obi\u010dajno nahaja v svojem lo\u010denem topiku. Na primer, dogodek o ustvarjanju oglasa lahko pade v topik item.created, medtem ko dogodek o njegovi spremembi pride v item.changed. Topike lahko obravnavamo kot klasifikatorje dogodkov. Na ravni topika lahko nastavite tak\u0161ne konfiguracijske parametre, kot so: <\/p>\n<p><\/p>\n<ul>\n<li>koli\u010dina shranjenih podatkov in\/ali njihova starost (retention.bytes, retention.ms); <\/li>\n<li>faktor redundance podatkov (replication factor);<\/li>\n<li>najve\u010dja velikost enega sporo\u010dila (max.message.bytes);<\/li>\n<li>najmanj\u0161e \u0161tevilo usklajenih replik, pri katerih lahko v topik zapi\u0161ete podatke (min.insync.replicas);<\/li>\n<li>mo\u017enost preklopa na nesinkrono \u0161ibko repliko s potencialno izgubo podatkov (unclean.leader.election.enable);<\/li>\n<li>in \u0161e mnoge druge (<noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/#topicconfigs\">https:\/\/kafka.apache.org\/documentation\/#topicconfigs<\/a><\/noindex>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Po drugi strani pa se vsak topik razdeli na eno ali ve\u010d particij. Prav v particijah kon\u010dajo dogodki. \u010ce v gru\u010di obstaja ve\u010d brokerjev, se bodo particije enakomerno porazdelile po vseh brokerjih (kolikor je to mogo\u010de), kar bo omogo\u010dilo raz\u0161iritev obremenitve pri pisanju in branju v en topik na ve\u010d brokerjev hkrati.<\/p>\n<p><\/p>\n<p>Na disku so podatki za vsak del v obliki datotek segmentov, ki so po privzetku en gigabajt (to se nadzira s preko log.segment.bytes). Pomembna zna\u010dilnost je, da se odstranitev podatkov iz particij (ko se spro\u017ei retention) zgodi prav v segmentih (ni mogo\u010de odstraniti enega dogodka iz particije, lahko pa odstranite samo celoten segment, pri \u010demer le neaktiven).<\/p>\n<p><\/p>\n<h3 id=\"zookeeper\">Zookeeper<\/h3>\n<p><\/p>\n<p>Zookeeper deluje kot shramba metapodatkov in koordinator. Prav on lahko pove, ali so brokerji \u017eivi (to si lahko ogledate z o\u010dmi zookeperja preko ukaza zookeeper-shell: <code>ls \/brokers\/ids<\/code>), kateri broker je kontroler (<code>get \/controller<\/code>), ali ali particije v sinhronem stanju s svojimi replikami (<code>get \/brokers\/topics\/topic_name\/partitions\/partition_number\/state<\/code>). Prav tako se producer in consumer najprej pove\u017eeta z zookeeperjem, da ugotovita, kateri broker hrani katere teme in particije. V primerih, ko je za temo nastavljen faktor replikacije ve\u010dji od 1, bo zookeeper navedel, katere particije so vodilne (v njih se bo izvajalo zapisovanje in iz njih bo potekalo branje). V primeru napake brokerja bo v zookeeperju zapisana informacija o novih vodilnih particijah (od razli\u010dice 1.1.0 naprej asinhrono, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.confluent.io\/blog\/apache-kafka-supports-200k-partitions-per-cluster\">in to je pomembno<\/a><\/noindex>).<\/p>\n<p><\/p>\n<p>V starej\u0161ih razli\u010dicah Kafke je zookeeper odgovarjal tudi za shranjevanje offsetov, vendar se ti zdaj hranijo v posebni temi <code>__consumer_offsets<\/code> na brokerju (\u010deprav lahko \u0161e vedno uporabljate zookeeper za te namene). <\/p>\n<p><\/p>\n<p>Najla\u017eji na\u010din, da spremenite svoje podatke v bu\u010do, je pravzaprav izguba informacij z zookeeperjem. V takem scenariju bo zelo te\u017eko razumeti, kaj in od kje brati. <\/p>\n<p><\/p>\n<h3 id=\"producer\">Producer<\/h3>\n<p><\/p>\n<p>Producer je najpogosteje storitev, ki neposredno zapisuje podatke v Apache Kafka. Producer izbere temo, v kateri se bodo shranjevala njegova tematska sporo\u010dila, in za\u010dne v njej zapisovati informacije. Na primer, producer je lahko storitev za oglase. V takem primeru bo po\u0161iljal v tematske teme dogodke, kot so 'oglas ustvarjen', 'oglas posodobljen', 'oglas izbrisan' itd. Vsak dogodek pri tem predstavlja par klju\u010d-vrednost.<\/p>\n<p><\/p>\n<p>Privzeto so vse dogodke porazdeljene po particijah teme round-robin, \u010de klju\u010d ni dolo\u010den (ob izgubi urejenosti), in preko MurmurHash (klju\u010d), \u010de je klju\u010d prisoten (urejenost v okviru ene particije).<\/p>\n<p><\/p>\n<p>Tukaj je takoj treba omeniti, da Kafka zagotavlja red dogodkov samo v okviru ene particije. Vendar to pogosto ni problem. Na primer, lahko zagotovo dodajate vse spremembe istega oglasa v eno particijo (s tem ohranjate red teh sprememb v okviru oglasa). Prav tako lahko posredujete zaporedno \u0161tevilko v enem od polj dogodka.<\/p>\n<p><\/p>\n<h3 id=\"consumer\">Consumer<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka in mikroservisi: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/1f69a53dc19bb6c587883b8754cde29f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Consumer je odgovoren za preuzimanje podataka iz Apache Kafke. Ako se vratimo na prethodni primer, consumer mo\u017ee biti servis za moderiranje. Ovaj servis \u0107e biti prijavljen na temu servisa sa oglasima, i kada se pojavi nova objava, dobi\u0107e je i analizirati u skladu sa nekim postavljenim politikama.<\/p>\n<p><\/p>\n<p>Apache Kafka pamti koje su poslednje doga\u0111aje primili consumeri (za to se koristi servisna tema __consumer__offsets), <code>__consumer__offsets<\/code>\u010dime se garantuje da pri uspe\u0161nom \u010ditanju consumer ne dobije istu poruku dva puta. Ipak, ako se koristi opcija enable.auto.commit = true i potpuno poverite pra\u0107enje polo\u017eaja consumera Kafki, mo\u017ee do\u0107i do gubitka podataka. <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.newrelic.com\/engineering\/kafka-consumer-config-auto-commit-data-loss\/\">gubitak podataka<\/a><\/noindex>. U proizvodnom kodu, polo\u017eaj consumera se obi\u010dno kontroli\u0161e ru\u010dno (programer upravlja trenutkom kada mora do\u0107i do commit-a pro\u010ditane poruke).<\/p>\n<p><\/p>\n<p>U onim slu\u010dajevima kada jedan consumer nije dovoljan (na primer, kada je protok novih doga\u0111aja veoma veliki), mo\u017ee se dodati jo\u0161 nekoliko consumer-a, povezuju\u0107i ih u consumer group. Consumer group logi\u010dki predstavlja isti takav consumer, ali s raspodelom podataka me\u0111u \u010dlanovima grupe. Ovo omogu\u0107ava svakom u\u010desniku da uzme svoj deo poruka, \u010dime se pove\u0107ava brzina \u010ditanja. <\/p>\n<p><\/p>\n<h1 id=\"rezultaty-testirovaniya\">V\u00fdsledky testov\u00e1n\u00ed<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka in mikroservisi: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/f7abe4bcf34fdb0d762c8a928bd873ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne\u0107u pisati mnogo obja\u0161njavaju\u0107eg teksta, samo \u0107u podeliti dobijene rezultate. Testiranje je provedeno na 3 fizi\u010dke ma\u0161ine (12 CPU, 384GB RAM, 15k SAS DISK, 10GBit\/s Net), brokeri i zookeeper su raspore\u0111eni u lxc. <\/p>\n<p><\/p>\n<p><strong>Testiranje performansi<\/strong><\/p>\n<p><\/p>\n<p>Tokom testiranja, dobijeni su slede\u0107i rezultati.<\/p>\n<p><\/p>\n<ul>\n<li>Brzina upisa poruka veli\u010dine 1KB istovremeno od 9 producer-a \u2014 1300000 doga\u0111aja u sekundi.<\/li>\n<li>Brzina \u010ditanja poruka veli\u010dine 1KB istovremeno od 9 consumer-a \u2014 1500000 doga\u0111aja u sekundi.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Testiranje otpornosti na gre\u0161ke<\/strong><\/p>\n<p><\/p>\n<p>Tokom testiranja, dobijeni su slede\u0107i rezultati (3 brokera, 3 zookeeper-a).<\/p>\n<p><\/p>\n<ul>\n<li>Neplanirano ga\u0161enje jednog od brokera ne dovodi do zaustavljanja ili nedostupnosti klastera. Rad se nastavlja u normalnom re\u017eimu, ali preostalim brokerima dolazi ve\u0107e optere\u0107enje.<\/li>\n<li>Nepri\u010dakovano zaklju\u010ditev dveh posrednikov v primeru grozda treh posrednikov in min.isr = 2 pripelje do nedostopnosti grozda za pisanje, a dostopnosti za branje. V primeru, ko je min.isr = 1, grozd ostaja dostopen tako za branje kot tudi za pisanje. Kljub temu ta na\u010din nasprotuje zahtevam po visoki ohranjanju podatkov.<\/li>\n<li>Nepri\u010dakovano zaklju\u010ditev enega od stre\u017enikov Zookeeper ne privede do ustavitve ali nedostopnosti grozda. Delo se nadaljuje v obi\u010dajnem re\u017eimu.<\/li>\n<li>Nepri\u010dakovano zaklju\u010ditev dveh stre\u017enikov Zookeeper vodi do nedostopnosti grozda do trenutka, ko se obnovi delovanje vsaj enega od stre\u017enikov Zookeeper. To trditev velja za grozd Zookeeper s 3 stre\u017eniki. Kot rezultat po raziskavah je bilo odlo\u010deno, da se grozd Zookeeper pove\u010da na 5 stre\u017enikov za pove\u010danje odpornosti na napake. <br clear=\"left\">\n <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"kafka-as-a-service\">Kafka kot storitev<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka in mikroservisi: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/19b2356131203cefbadfd90a25ae9674.png\" style=\"display:block;margin: 0 auto;\" \/> <\/p>\n<p><\/p>\n<p>Prepri\u010dani smo, da je Kafka odli\u010dna tehnologija, ki nam omogo\u010da re\u0161evanje naloge, ki smo si jo zastavili (implementacija posrednika sporo\u010dil). Kljub temu smo se odlo\u010dili, da storitvam prepovemo neposreden dostop do Kafke in jo zaprli z zgornjo plastjo data-bus. Zakaj smo to storili? Dejansko je ve\u010d razlogov.<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Data-bus je prevzel vse naloge, povezane z integracijo s Kafko (implementacija in nastavitev potro\u0161nikov in proizvajalcev, spremljanje, opozarjanje, bele\u017eenje, raz\u0161irjanje itd.). Tako integracija s posrednikom sporo\u010dil poteka kar najpreprosteje. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus je omogo\u010dil odmik od konkretnega jezika ali knji\u017enice za delo s Kafko. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus je drugim storitvam omogo\u010dil odmik od sloja shranjevanja. Morda bomo v nekem trenutku zamenjali Kafko s Pulsarjem in pri tem nih\u010de ne bo opazil (vse storitve vedo le za API data-bus).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus je prevzel validacijo shem dogodkov.<\/p>\n<p>\n<\/li>\n<li>\n<p>Z uporabo data-bus je bila omogo\u010dena avtentikacija.<\/p>\n<p>\n<\/li>\n<li>\n<p>Pod okriljem data-bus lahko brez izpadov, neopazno posodabljamo razli\u010dice Kafke, centralizirano upravljamo konfiguracije proizvajalcev, potro\u0161nikov, posrednikov itd.<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus je omogo\u010dil dodajanje funkcij, ki jih Kafka nima (kot so revizija tem, nadzor anomalij v grozdu, ustvarjanje DLQ itd.).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus omogo\u010da centralizirano izvajanje failover za vse storitve.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Trenutno je dovoljno povezati malu biblioteku u kod svog servisa za po\u010detak slanja doga\u0111aja u brokersku poruku. To je to. Dobijate mogu\u0107nost pisanja, \u010ditanja i skaliranja jednim redom koda. Cela implementacija je skrivena od vas, spolja izlaze samo nekoliko ru\u010dki poput veli\u010dine paketa. Ispod haube servis data-bus podi\u017ee potrebnu koli\u010dinu instanci proizvo\u0111a\u010da i potro\u0161a\u010da u Kubernetesu i pru\u017ea im potrebnu konfiguraciju, ali sve to je transparentno za va\u0161 servis. <\/p>\n<p><\/p>\n<p>Naravno, ne postoji srebrna kugla, i ovaj pristup ima svoja ograni\u010denja.<\/p>\n<p><\/p>\n<ul>\n<li>Data-bus treba odr\u017eavati vlastitim snagama, za razliku od spolja\u0161njih biblioteka.<\/li>\n<li>Data-bus pove\u0107ava broj interakcija izme\u0111u servisa i brokerske poruke, \u0161to dovodi do smanjenja performansi u pore\u0111enju sa golim Kafka-om.<\/li>\n<li>Nije sve tako lako skloniti od servisa, ne \u017eelimo da dupliciramo funkcionalnost KSQL ili Kafka Streams u data-bus-u, pa ponekad moramo dopustiti servisima da idu direktno. <\/li>\n<\/ul>\n<p><\/p>\n<p>U na\u0161em slu\u010daju prednosti su nadma\u0161ile nedostatke, i re\u0161enje da se brokerska poruka sakrije kao poseban servis se isplatilo. Tokom godine eksploatacije nismo imali ozbiljnijih kvarova i problema.<\/p>\n<p><\/p>\n<p>P.S. Hvala mojoj devojci, Ekaterini Obalyaevoj, za sjajne slike u ovom \u010dlanku. Ako su vam se svideli, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.instagram.com\/o.k_o.k_\/\">tukaj<\/a><\/noindex> na\u0107i \u0107e se jo\u0161 vi\u0161e ilustracija.<\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/465315\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0432 \u0410\u0432\u0438\u0442\u043e \u0434\u0435\u0432\u044f\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 Kafka, \u0438 \u0447\u0442\u043e \u043e\u043d\u0430 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442. \u041f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u0435\u0439\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u043f\u043b\u044e\u0441\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 Kafka as a Service. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043c\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28406,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37849","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Kafka \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b: \u043e\u0431\u0437\u043e\u0440 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:20:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:20:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kafka i mikroservisi: pregled | ProHoster","description":"Hello everyone.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Kafka \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b: \u043e\u0431\u0437\u043e\u0440 | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:20:09+00:00","article:modified_time":"2019-10-31T19:20:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37849","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 19:31:03","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:19:23","updated":"2026-01-23 19:31:03","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/37849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=37849"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/37849\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/28406"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=37849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=37849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=37849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}