{"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\/hr\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","title":{"rendered":"Kafka i mikrousluge: pregled","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kafka i mikrousluge: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/ab0534ad5d28b3c3aa03e4e0b2d3101b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pozdrav svima. U ovom \u010dlanku \u0107u vam re\u0107i za\u0161to smo u Avitu prije devet mjeseci odabrali Kafka i \u0161to ona zapravo predstavlja. Podijelit \u0107u jedan od slu\u010dajeva upotrebe \u2014 poslu\u017eitelj poruka. Na kraju \u0107emo razgovarati o tome koje prednosti smo stekli primjenom pristupa Kafka as a Service.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"problema\">Problem<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka i mikrousluge: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/dfa5e231847cee67259da17867a11812.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za po\u010detak malo konteksta. Prije neko vrijeme po\u010deli smo se udaljavati od monolitne arhitekture, a sada u Avitu ve\u0107 imamo nekoliko stotina razli\u010ditih usluga. Svaka od njih ima svoje skladi\u0161te, svoj tehnolo\u0161ki okvir i odgovara za svoj dio poslovne logike. <\/p>\n<p><\/p>\n<p>Jedan od problema s velikim brojem usluga je komunikacija. Usluga A \u010desto \u017eeli saznati informacije koje ima usluga B. U tom slu\u010daju usluga A se obra\u0107a usluzi B putem sinkronog API-ja. Usluga C \u017eeli znati \u0161to se doga\u0111a kod usluga G i D, a one, zauzvrat, interesiraju usluge A i B. Kada tako 'radoznalih' usluga postane mnogo, veze me\u0111u njima postaju zamr\u0161en splet.<\/p>\n<p><\/p>\n<p>Pri tome, usluga A mo\u017ee u bilo kojem trenutku postati nedostupna. I \u0161to u tom slu\u010daju raditi usluzi B i svim ostalim uslugama koje su na nju vezane? A ako je za izvr\u0161enje poslovne operacije potrebno napraviti niz uzastopnih sinkronih poziva, vjerojatnost neuspjeha cijele operacije postaje jo\u0161 ve\u0107a (i ve\u0107a je \u0161to je taj niz dulji). <\/p>\n<p><\/p>\n<h1 id=\"vybor-tehnologii\">Izbor tehnologije<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka i mikrousluge: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/3acd7bcf3dded8093bdef6d627eb4071.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U redu, problemi su jasni. Mo\u017ee ih se eliminirati uspostavljanjem centraliziranog sustava razmjene poruka me\u0111u uslugama. Sada svakoj usluzi dovoljno je samo da zna za ovaj sustav razmjene poruka. U dodatku, sam sustav treba biti otporan na gre\u0161ke i horizontalno skalabilan, a u slu\u010daju kvara akumulirati potrebne zahtjeve za naknadnu obradu. <\/p>\n<p><\/p>\n<p>Sada odaberimo tehnologiju na kojoj \u0107e se realizirati dostava poruka. Za to prvo trebamo razumjeti \u0161to od nje o\u010dekujemo:<\/p>\n<p><\/p>\n<ul>\n<li>poruke ne smiju biti izgubljene;<\/li>\n<li>poruke se mogu duplicirati;<\/li>\n<li>poruke se mogu pohranjivati i \u010ditati u razdoblju od nekoliko dana (postojani spremnik);<\/li>\n<li>usluge se mogu pretplatiti na podatke koji ih zanimaju;<\/li>\n<li>vi\u0161e usluga mo\u017ee \u010ditati iste podatke;<\/li>\n<li>poruke mogu sadr\u017eavati detaljan, opse\u017ean payload (event-carried state transfer);<\/li>\n<li>ponekad je potrebna garancija redoslijeda poruka.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tako\u0111er, bilo nam je od klju\u010dne va\u017enosti odabrati \u0161to skalabilniji i pouzdaniji sustav s visokom propusno\u0161\u0107u (najmanje 100k poruka po nekoliko kilobajta u sekundi).<\/p>\n<p><\/p>\n<p>U ovoj fazi oprostili smo se od RabbitMQ (te\u0161ko je odr\u017eati stabilnim pri visokim rps), PGQ iz SkyTools (nedovoljno brz i lo\u0161e skalabilan) i NSQ (nepersistentan). Sve ove tehnologije koristimo u na\u0161oj tvrtki, ali za zadatak koji smo imali nisu bile prikladne. <\/p>\n<p><\/p>\n<p>Nakon toga, po\u010deli smo gledati nove tehnologije za nas \u2014 Apache Kafka, Apache Pulsar i NATS Streaming.<\/p>\n<p><\/p>\n<p>Prvo smo odbacili Pulsar. Odlu\u010dili smo da su Kafka i Pulsar prili\u010dno sli\u010dna rje\u0161enja. Iako je Pulsar provjeren od strane velikih tvrtki, noviji je i teoretski nudi ni\u017eu latenciju, odlu\u010dili smo zadr\u017eati Kafku kao de facto standard za ove zadatke. Vjerojatno \u0107emo se u budu\u0107nosti vratiti Apache Pulsaru. <\/p>\n<p><\/p>\n<p>I tako su ostala dva kandidata: NATS Streaming i Apache Kafka. Oba rje\u0161enja smo detaljno prou\u010dili, i oba su se uklapala u zadatak. No na kraju smo se bojali relativne mladosti NATS Streaming (i toga \u0161to je jedan od glavnih developera, Tyler Treat, odlu\u010dio napustiti projekt i zapo\u010deti vlastiti \u2014 Liftbridge). Uz to, Clustering na\u010din rada NATS Streaming nije omogu\u0107avao sna\u017eno horizontalno skaliranje (vjerojatno to vi\u0161e nije problem nakon uvo\u0111enja partitioning re\u017eima 2017. godine).<\/p>\n<p><\/p>\n<p>Ipak, NATS Streaming je sjajna tehnologija napisana u Go i ima podr\u0161ku Cloud Native Computing Foundation. Za razliku od Apache Kafke, ne treba mu Zookeeper za rad (mo\u017eda, <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Managed+Metadata+Quorum\">uskoro \u0107emo isto mo\u0107i re\u0107i i za Kafku<\/a><\/noindex>), jer unutar koristi RAFT. Pritom je NATS Streaming jednostavniji za administraciju. Ne isklju\u010dujemo mogu\u0107nost da se opet vratimo ovoj tehnologiji. <\/p>\n<p><\/p>\n<p>Ipak, na\u0161 dana\u0161nji pobjednik je Apache Kafka. Na\u0161im testovima pokazala se dovoljno brza (vi\u0161e od milijun poruka u sekundi pri \u010ditanju i pisanju sa veli\u010dinom poruka od 1 kilobajta), dovoljno pouzdana, dobro skalabilna i provjerena iskustvom u proizvodnji od strane velikih tvrtki. Osim toga, Kafka podr\u017eava najmanje nekoliko velikih komercijalnih tvrtki (mi, na primjer, koristimo Confluent verziju), a tako\u0111er ima razvijen ekosustav.<br \/>\n<br clear=\"left\">\n <\/p>\n<p><\/p>\n<h1 id=\"obzor-kafka\">Pregled Kafke<\/h1>\n<p><\/p>\n<p>Prije nego \u0161to po\u010dnemo, odmah preporu\u010dujem odli\u010dnu knjigu \u2014 <em>\u00abKafka: The Definitive Guide\u00bb<\/em> (ima i na ruskom prijevodu, ali termini pomalo zbunjuju). U njemu se mo\u017ee prona\u0107i informacija potrebna za osnovno razumijevanje Kafke i \u010dak ne\u0161to vi\u0161e. Sama dokumentacija od Apache i blog od Confluent tako\u0111er su odli\u010dno napisani i lako se \u010ditaju. <\/p>\n<p><\/p>\n<p>Dakle, pogledajmo kako Kafka funkcionira iz pti\u010dje perspektive. Osnovna topologija Kafke sastoji se od producer, consumer, broker i zookeeper.<\/p>\n<p><\/p>\n<h3 id=\"broker\">Broker<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka i mikrousluge: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/82f34b5a1aadcdc07eef58eb5414b553.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za pohranu va\u0161ih podataka odgovoran je broker. Svi podaci pohranjuju se u binarnom obliku, a broker malo zna o tome \u0161to predstavljaju i kakva im je struktura. <\/p>\n<p><\/p>\n<p>Svaki logi\u010dki tip doga\u0111aja obi\u010dno se nalazi u svom zasebnom topiku. Na primjer, doga\u0111aj stvaranja oglasa mo\u017ee oti\u0107i u topik item.created, dok doga\u0111aj njegove promjene ide u item.changed. Topici se mogu smatrati klasifikatorima doga\u0111aja. Na razini topika mogu se postaviti sljede\u0107i konfiguracijski parametri: <\/p>\n<p><\/p>\n<ul>\n<li>prostor pohranjenih podataka i\/ili njihova starost (retention.bytes, retention.ms); <\/li>\n<li>faktor redundancije podataka (replication factor);<\/li>\n<li>maksimalna veli\u010dina jedne poruke (max.message.bytes);<\/li>\n<li>minimalni broj uskla\u0111enih replika, pri \u010demu se podaci mogu zapisati u topik (min.insync.replicas);<\/li>\n<li>mogu\u0107nost prebacivanja na neusagla\u0161enu pro\u0161lu repliku s potencijalnim gubitkom podataka (unclean.leader.election.enable);<\/li>\n<li>i jo\u0161 mnogo drugih (<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>S druge strane, svaki topik se dijeli na jednu ili vi\u0161e particija. Upravo u particijama se na kraju nalaze doga\u0111aji. Ako je u klasteru vi\u0161e od jednog brokera, tada \u0107e se particije ravnomjerno rasporediti po svim brokerima (koliko je to mogu\u0107e), \u0161to \u0107e omogu\u0107iti skaliranje optere\u0107enja za pisanje i \u010ditanje u jedan topik odjednom na nekoliko brokera.<\/p>\n<p><\/p>\n<p>Na disku se podaci za svaku particiju pohranjuju u obliku datoteka segmenata, koji su prema zadanim postavkama jednaki jednom gigabajtu (kontrolira se putem log.segment.bytes). Va\u017ena zna\u010dajka \u2014 uklanjanje podataka iz particija (pri aktivaciji retention) doga\u0111a se upravo segmenatima (ne mo\u017ee se ukloniti jedan doga\u0111aj iz particije, mo\u017ee se ukloniti samo cijeli segment, i to samo neaktivni).<\/p>\n<p><\/p>\n<h3 id=\"zookeeper\">Zookeeper<\/h3>\n<p><\/p>\n<p>Zookeeper djeluje kao skladi\u0161te metapodataka i koordinator. On mo\u017ee re\u0107i jesu li brokeri \u017eivi (na ovo se mo\u017ee gledati kroz zookeeper pomo\u0107u zookeeper-shell naredbe <code>ls \/brokers\/ids<\/code>), koji od brokera je kontroler (<code>get \/controller<\/code>), jesu li particije u sinhronom stanju sa svojim replikama (<code>get \/brokers\/topics\/topic_name\/partitions\/partition_number\/state<\/code>). Tako\u0111er, upravo \u0107e prema zookeeperu prvo i\u0107i producer i consumer kako bi saznali na kojem brokeru se nalaze koje teme i particije. U slu\u010dajevima kada je za temu postavljen faktor replikacije ve\u0107i od 1, zookeeper \u0107e pokazati koje particije su vo\u0111e (u njih \u0107e se vr\u0161iti zapisivanje i iz njih \u0107e se \u010ditati). U slu\u010daju pada brokera, upravo \u0107e u zookeeperu biti zabilje\u017eene informacije o novim vo\u0111ama-particijama (od verzije 1.1.0 asinkrono, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.confluent.io\/blog\/apache-kafka-supports-200k-partitions-per-cluster\">i to je va\u017eno<\/a><\/noindex>).<\/p>\n<p><\/p>\n<p>U starijim verzijama Kafke zookeeper je bio odgovoran i za pohranu ofseta, no sada se oni pohranjuju u posebnu temu <code>__consumer_offsets<\/code> na brokeru (iako jo\u0161 uvijek mo\u017eete koristiti zookeeper u te svrhe). <\/p>\n<p><\/p>\n<p>Najjednostavniji na\u010din da va\u0161e podatke pretvorite u bundeve je upravo gubitak informacija sa zookeepera. U takvom scenariju bit \u0107e jako te\u0161ko razumjeti \u0161to i odakle treba \u010ditati. <\/p>\n<p><\/p>\n<h3 id=\"producer\">Producer<\/h3>\n<p><\/p>\n<p>Producer je naj\u010de\u0161\u0107e servis koji vr\u0161i neposredno zapisivanje podataka u Apache Kafku. Producer odabire temu u kojoj \u0107e se pohranjivati njegove tematske poruke i po\u010dinje zapisivati informacije u nju. Na primjer, producer mo\u017ee biti servis za oglase. U tom slu\u010daju, slat \u0107e u tematske teme doga\u0111aje poput \u201eoglas kreiran\u201c, \u201eoglas a\u017euriran\u201c, \u201eoglas uklonjen\u201c i sl. Svaki doga\u0111aj pritom predstavlja par klju\u010d-vrijednost.<\/p>\n<p><\/p>\n<p>Po defaultu, svi se doga\u0111aji raspore\u0111uju po particijama teme round-robinom ako klju\u010d nije zadan (gube\u0107i redosljed), a putem MurmurHash (klju\u010d) ako klju\u010d postoji (redoslijed unutar jedne particije).<\/p>\n<p><\/p>\n<p>Ovde odmah treba napomenuti da Kafka garantira redoslijed doga\u0111aja samo unutar jedne particije. No, zapravo to \u010desto nije problem. Na primjer, mo\u017ee se zagarantirati da \u0107e se sve promjene jednog te istog oglasa dodavati u jednu particiju (time se \u010duva redoslijed tih promjena unutar oglasa). Tako\u0111er se mo\u017ee slati redni broj u jednom od polja doga\u0111aja.<\/p>\n<p><\/p>\n<h3 id=\"consumer\">Consumer<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka i mikrousluge: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/1f69a53dc19bb6c587883b8754cde29f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Korisnik je odgovoran za preuzimanje podataka iz Apache Kafke. Ako se vratimo na prethodni primjer, korisnik mo\u017ee biti usluga za moderaciju. Ova usluga \u0107e biti pretpla\u0107ena na temu usluge oglasa i prilikom pojave novog oglasa primit \u0107e ga i analizirati u skladu s odre\u0111enim zadanim politikama.<\/p>\n<p><\/p>\n<p>Apache Kafka pamti koja su posljednja doga\u0111anja primili korisnici (za to se koristi pomo\u0107na tema <code>__consumer__offsets<\/code>), \u010dime se osigurava da prilikom uspje\u0161nog \u010ditanja korisnik ne primi istu poruku dva puta. Ipak, ako koristite opciju enable.auto.commit = true i potpuno predate pra\u0107enje polo\u017eaja korisnika Kafki, mo\u017ee do\u0107i do <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.newrelic.com\/engineering\/kafka-consumer-config-auto-commit-data-loss\/\">gubitka podataka<\/a><\/noindex>. U produkcijskom kodu polo\u017eaj korisnika se naj\u010de\u0161\u0107e kontrolira ru\u010dno (programer upravlja trenutkom kada se obavezno mora dogoditi commit pro\u010ditane poruke).<\/p>\n<p><\/p>\n<p>U slu\u010dajevima kada jedan korisnik nije dovoljan (na primjer, kada je pritisak novih doga\u0111aja vrlo velik), mo\u017eete dodati jo\u0161 nekoliko korisnika povezivanjem u grupu korisnika. Grupa korisnika logi\u010dki predstavlja iste korisnike, ali s raspodjelom podataka me\u0111u \u010dlanovima grupe. To omogu\u0107uje svakom \u010dlanstvu da preuzme svoj dio poruka, \u010dime se pove\u0107ava brzina \u010ditanja. <\/p>\n<p><\/p>\n<h1 id=\"rezultaty-testirovaniya\">Rezultati testiranja<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka i mikrousluge: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/f7abe4bcf34fdb0d762c8a928bd873ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ovdje ne\u0107u pisati mnogo obja\u0161njenja, samo \u0107u podijeliti dobivene rezultate. Testiranje je provedeno na 3 fizi\u010dke ma\u0161ine (12 CPU, 384GB RAM, 15k SAS DISK, 10GBit\/s Net), brokeri i zookeeper su implementirani u lxc. <\/p>\n<p><\/p>\n<p><strong>Testiranje performansi<\/strong><\/p>\n<p><\/p>\n<p>Tijekom testiranja dobiveni su sljede\u0107i rezultati.<\/p>\n<p><\/p>\n<ul>\n<li>Brzina zapisivanja poruka veli\u010dine 1KB s 9 proizvo\u0111a\u010da istovremeno \u2014 1300000 doga\u0111aja u sekundi.<\/li>\n<li>Brzina \u010ditanja poruka veli\u010dine 1KB s 9 korisnika istovremeno \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>Tijekom testiranja dobiveni su sljede\u0107i rezultati (3 brokera, 3 zookeepers).<\/p>\n<p><\/p>\n<ul>\n<li>Nepredvi\u0111eno zaustavljanje jednog od brokera ne dovodi do zaustavljanja ili nedostupnosti klastera. Rad se nastavlja u normalnom re\u017eimu, ali preostali brokeri imaju ve\u0107u optere\u0107enost.<\/li>\n<li>Nepredvi\u0111eno isklju\u010divanje dva brokera u klasteru od tri brokera s min.isr = 2 dovodi do nedostupnosti klastera za pisanje, ali dostupnosti za \u010ditanje. U slu\u010daju da je min.isr = 1, klaster ostaje dostupan i za \u010ditanje i za pisanje. Ipak, ovaj re\u017eim je u suprotnosti s zahtjevom za visokom sigurno\u0161\u0107u podataka.<\/li>\n<li>Nepredvi\u0111eno isklju\u010divanje jednog od Zookeeper poslu\u017eitelja ne dovodi do zaustavljanja ili nedostupnosti klastera. Rad nastavlja te\u0107i normalno.<\/li>\n<li>Nepredvi\u0111eno isklju\u010divanje dva Zookeeper poslu\u017eitelja dovodi do nedostupnosti klastera sve dok se ne obnovi rad barem jednog od Zookeeper poslu\u017eitelja. Ova tvrdnja vrijedi za Zookeeper klaster sa 3 poslu\u017eitelja. U rezultatu istra\u017eivanja odlu\u010deno je pove\u0107ati Zookeeper klaster na 5 poslu\u017eitelja kako bi se pove\u0107ala otpornost na gre\u0161ke. <br clear=\"left\">\n <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"kafka-as-a-service\">Kafka kao usluga<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka i mikrousluge: pregled\" src=\"\/wp-content\/uploads\/2019\/09\/19b2356131203cefbadfd90a25ae9674.png\" style=\"display:block;margin: 0 auto;\" \/> <\/p>\n<p><\/p>\n<p>Uvjerili smo se da je Kafka odli\u010dna tehnologija koja rje\u0161ava zadatak koji je pred nama (implementacija poslu\u017eitelja poruka). Ipak, odlu\u010dili smo zabraniti uslugama izravan pristup Kafki i zatvorili smo je iznad uslugom data-bus. Za\u0161to smo to u\u010dinili? Uistinu postoji nekoliko razloga.<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Data-bus je preuzeo sve zadatke povezane s integracijom s Kafkom (implementacija i konfiguracija potro\u0161a\u010da i proizvo\u0111a\u010da, nadzor, obavje\u0161tavanje, bilje\u017eenje, skaliranje itd.). Tako se integracija s poslu\u017eiteljem poruka odvija maksimalno jednostavno. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus omogu\u0107uje apstrahiranje od specifi\u010dnog jezika ili biblioteke za rad s Krakom. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus omogu\u0107uje drugim uslugama da se apstrahiraju od sloja skladi\u0161tenja. Mo\u017eda \u0107emo u nekom trenutku zamijeniti Kafku s Pulsarom, a da to nitko ne primijeti (sve usluge znaju samo za API data-bus).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus je preuzeo validaciju shema doga\u0111aja.<\/p>\n<p>\n<\/li>\n<li>\n<p>Uz pomo\u0107 data-bus-a implementirana je autentifikacija.<\/p>\n<p>\n<\/li>\n<li>\n<p>Pod okriljem data-bus-a mo\u017eemo bez zastoja, neprimjetno a\u017eurirati verzije Kafke, centralizirano upravljati konfiguracijama proizvo\u0111a\u010da, potro\u0161a\u010da, brokera itd.<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus je omogu\u0107io dodavanje potrebnih zna\u010dajki koje nedostaju u Kafki (poput revizije tema, nadzora anomalija u klasteru, stvaranja DLQ itd.).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus omogu\u0107uje centralizirano upravljanje prebacivanjem svih usluga.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Trenutno je dovoljno povezati mali biblioteku u kod svojeg servisa da biste zapo\u010deli s slanjem doga\u0111aja u brokersku uslugu. To je to. Imate mogu\u0107nost pisanja, \u010ditanja i skaliranja s jednom linijom koda. Cjela implementacija je skrivena od vas, vani se nalaze samo nekoliko rukohvata tipa veli\u010dine paketa. Iza kulisa servis data-bus podi\u017ee u Kubernetesu potrebni broj instanci proizvo\u0111a\u010da i potro\u0161a\u010da i daje im potrebnu konfiguraciju, ali sve to je transparentno za va\u0161 servis. <\/p>\n<p><\/p>\n<p>Naravno, ne postoji zlatna sredina, i ovaj pristup ima svoja ograni\u010denja.<\/p>\n<p><\/p>\n<ul>\n<li>Data-bus se treba odr\u017eavati vlastitim snagama, za razliku od vanjskih biblioteka.<\/li>\n<li>Data-bus pove\u0107ava broj interakcija izme\u0111u servisa i brokerske usluge, \u0161to dovodi do smanjenja performansi u odnosu na golu Kafku.<\/li>\n<li>Nije uvijek jednostavno sakriti sve od servisa, ne \u017eelimo duplicirati funkcionalnosti KSQL-a ili Kafka Streams-a u data-bus, stoga ponekad moramo dopustiti servisima da direktno pristupaju. <\/li>\n<\/ul>\n<p><\/p>\n<p>U na\u0161em slu\u010daju, prednosti su prevagnule nad nedostacima, i odluka da za\u0161titimo brokersku uslugu kao zaseban servis se opravdala. Tijekom godine eksploatacije nismo imali ozbiljnih kvarova ili problema.<\/p>\n<p><\/p>\n<p>P.S. Hvala mojoj djevojci, Ekaterini Obaljajev, za super slike uz ovaj \u010dlanak. Ako vam se svi\u0111aju, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.instagram.com\/o.k_o.k_\/\">ovdje<\/a><\/noindex> prona\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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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":"Pozdrav svima.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/37849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=37849"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/37849\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/28406"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=37849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=37849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=37849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}