{"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\/et\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","title":{"rendered":"Kafka ja mikroteenused: \u00fclevaade","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kafka ja mikroteenused: \u00fclevaade\" src=\"\/wp-content\/uploads\/2019\/09\/ab0534ad5d28b3c3aa03e4e0b2d3101b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tere k\u00f5igile. Selles artiklis r\u00e4\u00e4gin, miks me Avitos valisime Kafka dev olla kuus kuud tagasi ja mida see endast kujutab. Jagame \u00fchte kasutusjuhtu \u2014 s\u00f5numite vahetaja. L\u00f5puks r\u00e4\u00e4gime, milliseid eeliseid oleme saanud Kafka as a Service l\u00e4henemisest.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"problema\">Probleem<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka ja mikroteenused: \u00fclevaade\" src=\"\/wp-content\/uploads\/2019\/09\/dfa5e231847cee67259da17867a11812.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alustuseks natuke konteksti. M\u00f5ni aeg tagasi hakkasime loobuma monoliitsest arhitektuurist ja n\u00fc\u00fcd on Avitos juba mitu sada erinevat teenust. Neil on oma andmehoidlad, oma tehnoloogia stack ja nad vastutavad oma osa \u00e4riloogika eest. <\/p>\n<p><\/p>\n<p>\u00dcks probleem suure arvu teenustega on suhtlemine. Teenus A soovib sageli teada teavet, mis teenusel B on. Sel juhul p\u00f6\u00f6rdub teenus A teenuse B poole s\u00fcnkrone API kaudu. Teenus B tahab teada, mis toimub teenustes G ja D, ning need, omakorda, huvituvad teenustest A ja B. Kui selliseid \"uudishimulikke\" teenuseid on palju, muutuvad sidemed nende vahel segaseks klambriks.<\/p>\n<p><\/p>\n<p>Sel juhul v\u00f5ib teenus A igal hetkel olla k\u00e4ttesaamatu. Mida teha teenusele B ja k\u00f5igile teistele selle teenuse otseselt s\u00f5ltuvatele teenustele? Kui \u00e4riprotsessi jaoks on vajalik j\u00e4rjestikuste s\u00fcnkroonsete kutsungite ahel, suureneb kogu operatsiooni nurjumise t\u00f5en\u00e4osus veelgi (ja mida pikem on see ahel, seda suurem on t\u00f5en\u00e4osus). <\/p>\n<p><\/p>\n<h1 id=\"vybor-tehnologii\">Tehnoloogia valik<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka ja mikroteenused: \u00fclevaade\" src=\"\/wp-content\/uploads\/2019\/09\/3acd7bcf3dded8093bdef6d627eb4071.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Olgu, probleemid on selged. Need on likvideeritavad, luues teenuste vahel keskustavate s\u00f5numite\u017ei. N\u00fc\u00fcd piisab, kui iga teenus tunneb ainult selle s\u00f5numite s\u00fcsteemi. Lisaks peab see s\u00fcsteem olema talitlush\u00e4irekindel ja horisontaalselt skaleeritav, ning h\u00e4daolukordade korral peab see koguma enda sisse puhvri edasi t\u00f6\u00f6tlemiseks. <\/p>\n<p><\/p>\n<p>Valime n\u00fc\u00fcd tehnoloogia, millel s\u00f5numite edastamine p\u00f5hineb. Selleks peame esmalt aru saama, mida me temalt ootame:<\/p>\n<p><\/p>\n<ul>\n<li>teenuste vahel ei tohi s\u00f5numid kaduma minna;<\/li>\n<li>s\u00f5numid v\u00f5ivad duplitseerida;<\/li>\n<li>s\u00f5numid v\u00f5ivad olla salvestatud ja loetavad mitu p\u00e4eva (p\u00fcsiv puhver);<\/li>\n<li>teenused saavad tellida huvitavaid andmeid;<\/li>\n<li>mitmed teenused saavad lugeda samu andmeid;<\/li>\n<li>teated v\u00f5ivad sisaldada p\u00f5hjalikku, mahukat payload'i (event-carried state transfer);<\/li>\n<li>m\u00f5nikord on vajalik s\u00f5numite j\u00e4rjekorra tagamine.<\/li>\n<\/ul>\n<p><\/p>\n<p>Samuti oli meil kriitiliselt oluline valida maksimaalselt skaleeritav ja usaldusv\u00e4\u00e4rne s\u00fcsteem k\u00f5rge l\u00e4bilaskev\u00f5imega (v\u00e4hemalt 100k s\u00f5numit m\u00f5ne kilobaidi sekundis).<\/p>\n<p><\/p>\n<p>Selles etapis j\u00e4tsime h\u00fcvasti RabbitMQ'ga (raskesti stabiilsena hoida k\u00f5rgetel rps-del), PGQ'ga SkyTools'ist (liialt aeglane ja halvasti skaleeritav) ning NSQ'ga (mitte p\u00fcsiv). K\u00f5iki neid tehnoloogiaid kasutatakse meie firmas, kuid antud \u00fclesande jaoks nad ei sobinud. <\/p>\n<p><\/p>\n<p>Edasi hakkasime vaatama meie jaoks uusi tehnoloogiaid \u2014 Apache Kafka, Apache Pulsar ja NATS Streaming.<\/p>\n<p><\/p>\n<p>Esimese asjana loobusime Pulsarist. Otsustasime, et Kafka ja Pulsar on omavahel \u00fcsna sarnased lahendused. Ja hoolimata sellest, et Pulsar on suurtelt ettev\u00f5tetelt testitud, on see uuem ja pakub teoreetiliselt madalamat latentsust, otsustasime nendest kahest j\u00e4tta Kafka, kui de facto standard nende \u00fclesannete jaoks. T\u00f5en\u00e4oliselt naaseme Apache Pulsari juurde tulevikus. <\/p>\n<p><\/p>\n<p>Ja j\u00e4id alles kaks kandidaati: NATS Streaming ja Apache Kafka. Oleme m\u00f5lemat lahendust k\u00fcllalt p\u00f5hjalikult uurinud ja m\u00f5lemad sobisid meie vajadustele. Kuid l\u00f5puks kartisime NATS Streaming'i suhtelist nooruslikkust (ning seda, et \u00fcks peamistest arendajatest, Tyler Treat, otsustas projektist lahkuda ja alustada oma ettev\u00f5tet \u2014 Liftbridge). Samuti ei pakkunud NATS Streaming'i r\u00fchmitamise re\u017eiim head horisontaalset skaleeritavust (t\u00f5en\u00e4oliselt pole see enam probleem, kuna partitioning re\u017eiim lisati 2017. aastal).<\/p>\n<p><\/p>\n<p>Sellegipoolest on NATS Streaming erakordne tehnoloogia, mis on kirjutatud Go keeles ja mida toetab Cloud Native Computing Foundation. Erinevalt Apache Kafka'st ei vajata selle t\u00f6\u00f6ks Zookeeper'it (v\u00f5ib-olla, <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Managed+Metadata+Quorum\">peagi saab sama \u00f6elda ka Kafka<\/a><\/noindex>), kuna see rakendab sisemiselt RAFT'i. NATS Streaming on samas lihtsam haldamisel. Me ei v\u00e4lista, et tulevikus tuleme sellele tehnoloogiale veel tagasi. <\/p>\n<p><\/p>\n<p>Ja, ja, ja, aga t\u00e4naseks p\u00e4evaks on meie v\u00f5itja Apache Kafka. Meie testides n\u00e4itas see end piisavalt kiirelt (\u00fcle miljoni s\u00f5numi sekundis lugemise ja kirjutamise puhul, s\u00f5numite suuruseks 1 kilobait), piisavalt usaldusv\u00e4\u00e4rselt, h\u00e4sti skaleeritavalt ja suurte ettev\u00f5tete kogemusega t\u00f5estatud. Lisaks toetab Kafka v\u00e4hemalt mitmeid suuri kaubanduslikke ettev\u00f5tteid (me kasutame n\u00e4iteks Confluent versiooni), samuti on Kafka'l v\u00e4lja arendatud \u00f6kos\u00fcsteem.<br \/>\n<br clear=\"left\">\n <\/p>\n<p><\/p>\n<h1 id=\"obzor-kafka\">Kafka \u00fclevaade<\/h1>\n<p><\/p>\n<p>Enne kui alustada, soovitan kohe suurep\u00e4rast raamatut \u2014 <em>\u201eKafka: The Definitive Guide\u201c<\/em> (t\u00f5lge on saadaval, aga terminid v\u00f5ivad natuke keeruliseks osutuda). Siit leiate teavet, mis on vajalik Kafka p\u00f5hit\u00f5dede m\u00f5istmiseks ja isegi rohkem. Apache'i enda dokumentatsioon ja Confluenti blogi on samuti suurep\u00e4raselt kirjutatud ja kergesti loetavad. <\/p>\n<p><\/p>\n<p>Nii et vaatame, kuidas Kafka linnulennult v\u00e4lja n\u00e4eb. Kafka p\u00f5histruktuur koosneb tootjatest (producer), tarbijatest (consumer), vahendajatest (broker) ja zookeeperist.<\/p>\n<p><\/p>\n<h3 id=\"broker\">Vahendaja (Broker)<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka ja mikroteenused: \u00fclevaade\" src=\"\/wp-content\/uploads\/2019\/09\/82f34b5a1aadcdc07eef58eb5414b553.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teie andmete s\u00e4ilitamise eest vastutab vahendaja (broker). K\u00f5ik andmed salvestatakse binaarses vormingus ning vahendaja ei tea nende struktuurist ega sisust suurt midagi. <\/p>\n<p><\/p>\n<p>Iga s\u00fcndmuste loogiline t\u00fc\u00fcp asub tavaliselt oma eraldi teemas (topic). N\u00e4iteks v\u00f5ib kuulutuse loomise s\u00fcndmus kuuluda teema item.created alla, muutmise s\u00fcndmus aga item.changed alla. Teemasid v\u00f5ib k\u00e4sitleda s\u00fcndmuste klassifikaatoritena. Teema tasemel saab m\u00e4\u00e4rata selliseid konfiguratsiooniparameetreid nagu: <\/p>\n<p><\/p>\n<ul>\n<li>salvestatava andmemaht ja\/v\u00f5i nende vanus (retention.bytes, retention.ms); <\/li>\n<li>andmete redundantssuse faktor (replication factor);<\/li>\n<li>\u00fche s\u00f5numi maksimaalne suurus (max.message.bytes);<\/li>\n<li>minimaalne arvu n\u00f5utud koopiaid, mille juures saab teemasse andmeid kirjutada (min.insync.replicas);<\/li>\n<li>v\u00f5imalus viia l\u00e4bi failover mitte-s\u00fcnkroonsele mahaj\u00e4\u00e4nud koopiale, millega v\u00f5ib kaasneda andmete kadu (unclean.leader.election.enable);<\/li>\n<li>ja veel palju muud (<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>Igal juhul jaguneb iga teema \u00fcheks v\u00f5i mitmeks partitsiooniks (partition). Just partitsioonidesse j\u00f5uavad l\u00f5puks s\u00fcndmused. Kui klastris on rohkem kui \u00fcks maakler, jaotatakse partitsioonid k\u00f5ikide maaklerite vahel \u00fchtlaselt (kui see on v\u00f5imalik), mis v\u00f5imaldab koormust kirjutamisel ja lugemisel \u00fchte teema korraga jagada mitme maakleri vahel.<\/p>\n<p><\/p>\n<p>Ketaste andmed iga partitsiooni kohta s\u00e4ilitatakse failide segmentidena, mille vaikimisi suurus on \u00fcks gigabait (kontrollitakse l\u00e4bi log.segment.bytes). Oluline omadus on see, et andmete eemaldamine partitsioonidest (retention'i toimimisel) toimub just segmentide kaupa (ei saa eemaldada \u00fchte s\u00fcndmust partitsioonist, saab eemaldada ainult kogu segmenti, kuid ainult mitteaktiivset).<\/p>\n<p><\/p>\n<h3 id=\"zookeeper\">Zookeeper<\/h3>\n<p><\/p>\n<p>Zookeeper toimib metaandmete ladustamise ja koordinaatorina. Just tema suudab \u00f6elda, kas maaklerid on elus (seda saab vaadata zookeeper'i kaudu, kasutades k\u00e4sku <code>ls \/brokers\/ids<\/code>), milline maakler on kontroller (<code>get \/controller<\/code>), kas partitsioonid on oma koopiatega s\u00fcnkroonis (<code>get \/brokers\/topics\/topic_name\/partitions\/partition_number\/state<\/code>). Samuti l\u00e4hevad tootjad ja tarbijad esmalt zookeeper'i, et teada saada, millisel maakleril millised teemad ja partitsioonid on. Juhul kui teema jaoks on m\u00e4\u00e4ratud replikatsiooni tegur suurem kui 1, n\u00e4itab zookeeper, millised partitsioonid on liidrid (sellesse kirjutatakse ja sealt loetakse). Kui maakler kukub, kantakse zookeeper'i kirja teave uute liidri-partitsioonide kohta (alates versioonist 1.1.0 as\u00fcnkroonselt, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.confluent.io\/blog\/apache-kafka-supports-200k-partitions-per-cluster\">ja see on oluline<\/a><\/noindex>).<\/p>\n<p><\/p>\n<p>Vanemates versioonides vastutas Kafka zookeeper ka ofsetite hoidmise eest, kuid n\u00fc\u00fcd s\u00e4ilitatakse need eraldi teemas. <code>__consumer_offsets<\/code> brokeris (kuigi saate nende eesm\u00e4rkide jaoks endiselt zookeeperit kasutada). <\/p>\n<p><\/p>\n<p>Lihtsaim viis oma andmed k\u00f5rvitsaks muuta on kaotada teave zookeeperiga. Sellises stsenaariumis on v\u00e4ga raske m\u00f5ista, mida ja kust lugeda. <\/p>\n<p><\/p>\n<h3 id=\"producer\">Producer<\/h3>\n<p><\/p>\n<p>Producer on enamasti teenus, mis kirjutab andmeid otse Apache Kafka-sse. Producer valib teema, kuhu tal on plaanis salvestada oma teemakohased s\u00f5numid, ja hakkab sinna teavet sisestama. N\u00e4iteks v\u00f5ib producer olla reklaamiteenus, mis saadab teemadesse selliseid s\u00fcndmusi nagu \u201ereklaam loodud\u201c, \u201ereklaam uuendatud\u201c, \u201ereklaam kustutatud\u201c jne. Iga s\u00fcndmus esindab v\u00f5tme-v\u00e4\u00e4rtuse paari.<\/p>\n<p><\/p>\n<p>Vaikimisi jaotatakse k\u00f5ik s\u00fcndmused teema vahel round-robin meetodil, kui v\u00f5tme ei ole m\u00e4\u00e4ratud (kaotades j\u00e4rjestuse), ja MurmurHashi kaudu (v\u00f5tme) korral, kui v\u00f5tme olemasolu on. (j\u00e4rjestus \u00fche partitsiooni raames).<\/p>\n<p><\/p>\n<p>Siinkohal tasub m\u00e4rkida, et Kafka tagab s\u00fcndmuste j\u00e4rjekorra ainult \u00fche partitsiooni raames. Kuid tegelikult ei ole see sageli probleem. N\u00e4iteks saab k\u00f5ik sama kuulutuse muudatused j\u00e4rjekindlalt \u00fchte partitsiooni lisada (hoides seel\u00e4bi nende muudatuste j\u00e4rjekorda kuulutuse raames). Samuti saab s\u00fcndmuste \u00fches v\u00e4ljas edastada j\u00e4rjestusnumber.<\/p>\n<p><\/p>\n<h3 id=\"consumer\">Consumer<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka ja mikroteenused: \u00fclevaade\" src=\"\/wp-content\/uploads\/2019\/09\/1f69a53dc19bb6c587883b8754cde29f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Consumer vastutab andmete vastuv\u00f5tmise eest Apache Kafka'st. Kui naasta eelneva n\u00e4ite juurde, v\u00f5ib consumer olla modereerimisteenus. See teenus registreerib end kuulutuste teenuse teemale, ja kui ilmub uus kuulutus, saab see selle ja anal\u00fc\u00fcsib selle vastavust teatud m\u00e4\u00e4ratud poliitikatele.<\/p>\n<p><\/p>\n<p>Apache Kafka salvestab, millised olid viimased s\u00fcndmused, mille consumer sai (selleks kasutatakse teenusteemade teenust <code>__consumer__offsets<\/code>), tagades sellega, et p\u00e4rast eduka lugemise korral ei saa consumer sama s\u00f5numit kaks korda. Siiski, kui kasutada suvandit enable.auto.commit = true ja t\u00e4ielikult usaldada consumer'i positsiooni j\u00e4lgimist teemal Kafkele, v\u00f5ib <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.newrelic.com\/engineering\/kafka-consumer-config-auto-commit-data-loss\/\">andmeid kaotada.<\/a><\/noindex>. Tootmisprotsessis juhitakse tarbija asukohta enamasti k\u00e4sitsi (arendaja haldab hetke, mil kirjedatud s\u00fcndmus peab toimuma).<\/p>\n<p><\/p>\n<p>Situatsioonides, kus \u00fcks tarbija ei piisa (n\u00e4iteks kui uusi s\u00fcndmusi saabub v\u00e4ga palju), on v\u00f5imalik lisada veel mitu tarbijat, sidudes need tarbijagruppi. Tarbijagrupp esindab loogiliselt sama tarbijat, kuid andmete jaotamisega grupi liikmete vahel. See v\u00f5imaldab igal liikmel v\u00f5tta oma osa s\u00f5numitest, skaleerides seel\u00e4bi lugemise kiirus. <\/p>\n<p><\/p>\n<h1 id=\"rezultaty-testirovaniya\">Testimise tulemused<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka ja mikroteenused: \u00fclevaade\" src=\"\/wp-content\/uploads\/2019\/09\/f7abe4bcf34fdb0d762c8a928bd873ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Siin ei hakka ma palju selgitusi andma, jagan lihtsalt saadud tulemusi. Testimine viidi l\u00e4bi 3 f\u00fc\u00fcsilisel masinal (12 CPU, 384GB RAM, 15k SAS DISK, 10GBit\/s Net), vahendajad ja zookeeper olid juurutatud lxc-is. <\/p>\n<p><\/p>\n<p><strong>J\u00f5udluse testimine<\/strong><\/p>\n<p><\/p>\n<p>Testimise k\u00e4igus saadi j\u00e4rgmised tulemused.<\/p>\n<p><\/p>\n<ul>\n<li>1KB suuruste s\u00f5numite kirjutamise kiirus 9 tootjaga \u2014 1300000 s\u00fcndmust sekundis.<\/li>\n<li>1KB suuruste s\u00f5numite lugemise kiirus 9 tarbijaga \u2014 1500000 s\u00fcndmust sekundis.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>K\u00e4tkestustaluvuse testimine<\/strong><\/p>\n<p><\/p>\n<p>Testimise k\u00e4igus saadi j\u00e4rgmised tulemused (3 vahendajat, 3 zookeeperi).<\/p>\n<p><\/p>\n<ul>\n<li>\u00dcksikute brokerite ootamatu sulgemine ei p\u00f5hjusta klastrite seiskumist v\u00f5i k\u00e4ttesaamatust. T\u00f6\u00f6 j\u00e4tkub tavap\u00e4raselt, kuid \u00fclej\u00e4\u00e4nud brokeritele lasub suurem koormus.<\/li>\n<li>Kaks brokerit ootamatu sulgemise korral kolmest brokerist klastris ja min.isr = 2 toob kaasa klastrite kirjutusv\u00f5ime k\u00e4ttesaamatuse, kuid lugemise k\u00e4ttesaadavuse. Kui min.isr = 1, j\u00e4\u00e4b klaster k\u00e4ttesaadavaks nii lugemiseks kui ka kirjutamiseks. Siiski on see re\u017eiim vastuolus k\u00f5rge andmekaitse n\u00f5udega.<\/li>\n<li>\u00dcksikute Zookeeperi serverite ootamatu sulgemine ei p\u00f5hjusta klastrite seiskumist ega k\u00e4ttesaamatust. T\u00f6\u00f6 j\u00e4tkub tavap\u00e4raselt.<\/li>\n<li>Kaks Zookeeperi serveri ootamatut sulgemist toob kaasa klastrite k\u00e4ttesaamatuse kuni v\u00e4hemalt \u00fche Zookeeperi serveri t\u00f6\u00f6 taastamiseni. See v\u00e4ide kehtib kolme serveriga Zookeeperi klastrite kohta. Uuringute tulemusena otsustati Zookeeperi klastrit suurendada viie serverini, et suurendada talitlush\u00e4iret taluvust. <br clear=\"left\">\n <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"kafka-as-a-service\">Kafka as a service<\/h1>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kafka ja mikroteenused: \u00fclevaade\" src=\"\/wp-content\/uploads\/2019\/09\/19b2356131203cefbadfd90a25ae9674.png\" style=\"display:block;margin: 0 auto;\" \/> <\/p>\n<p><\/p>\n<p>Oleme veendunud, et Kafka on suurep\u00e4rane tehnoloogia, mis v\u00f5imaldab lahendada meie \u00fclesande (s\u00f5numite vahendaja rakendamine). Siiski otsustasime keelata teenustel Kafka otsene kasutamine ja sulgesime selle data-bus teenuse taha. Miks me seda tegime? Tegelikult on mitmeid p\u00f5hjuseid.<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Data-bus on enda peale v\u00f5tnud k\u00f5ik Kafka integreerimisega seotud \u00fclesanded (tarvitsiate ja tootjate rakendamine ja seadistamine, j\u00e4lgimine, h\u00e4ired, logimine, skaleerimine jne). Seega toimub s\u00f5numivahendajaga integreerimine v\u00f5imalikult lihtsalt. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus v\u00f5imaldas abstrakteerida v\u00e4lja konkreetse keele v\u00f5i teegi, millega Kafka t\u00f6\u00f6tada. <\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus v\u00f5imaldas teistel teenustel abstrakteerida salvestuskiht. V\u00f5ib-olla vahetame kunagi Kafka Pulsari vastu, ja keegi ei m\u00e4rkagi (k\u00f5ik teenused tunnevad ainult data-bus API-d).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus v\u00f5ttis enda peale s\u00fcndmuste skeemide valideerimise.<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus abil on rakendatud autentimine.<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-busi kaudu saame ilma seisakuteta ja m\u00e4rkamatult uuendada Kafka versioone, hallata keskselt tootjate, tarvitsiate, vahendajate jm konfiguratsioone.<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus v\u00f5imaldab lisada vajalikud funktsioonid, mida Kafka ei paku (n\u00e4iteks teema auditeerimine, anomaaliate j\u00e4lgimine klastris, DLQ loomine jne).<\/p>\n<p>\n<\/li>\n<li>\n<p>Data-bus v\u00f5imaldab tsentraliseeritult rakendada k\u00f5igi teenuste failover'it.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Praegu piisab, kui \u00fchendate oma teenuse koodi v\u00e4ikese teegiga, et alustada s\u00fcndmuste saatmist s\u00f5numibrokerisse. Ja see on k\u00f5ik. Teil on v\u00f5imalus kirjutada, lugeda ja skaleerida \u00fche koodireaga. Terve teostus on teie eest varjatud, v\u00e4ljapoole paisatakse vaid m\u00f5ned k\u00e4sud, n\u00e4iteks partii suurus. Tagaplaanil t\u00f5stab teenus data-bus Kuberneteses vajalikud producer'ite ja consumer'ite instantsid ning varustab need vajaliku konfigureerimisega, kuid k\u00f5ik see on teie teenuse jaoks l\u00e4bipaistev. <\/p>\n<p><\/p>\n<p>Muidugi, h\u00f5bedaseid kuule ei ole ja sellel l\u00e4henemisel on omad piirangud.<\/p>\n<p><\/p>\n<ul>\n<li>Data-bus'i peate ise toetama, erinevalt kolmandate osapoolte teekidest.<\/li>\n<li>Data-bus suurendab teenuste ja s\u00f5numibrokeri vaheliste interaktsioonide arvu, mis toob kaasa madalama j\u00f5udluse v\u00f5rreldes puhta Kafka'ga.<\/li>\n<li>K\u00f5ike ei saa teenustelt nii lihtsalt peita, me ei sooviks KSQL v\u00f5i Kafka Streams funktsionaalsust data-bus'is dubleerida, seega vahel on kohustus lubada teenustel otse \u00fchendust v\u00f5tta. <\/li>\n<\/ul>\n<p><\/p>\n<p>Meie puhul kaaluvad plussid rohkem kui miinused ja otsus sulgeda s\u00f5numite vahendaja eraldi teenusena oli \u00f5igustatud. \u00dche aasta jooksul pole meil olnud t\u00f5siseid \u00f5nnetusi ega probleeme.<\/p>\n<p><\/p>\n<p>P.S. Ait\u00e4h mu t\u00fcdruks\u00f5brale, Jekaterina Obalajevale, artikli \u00e4gedate piltide eest. Kui need teile meeldivad, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.instagram.com\/o.k_o.k_\/\">siin<\/a><\/noindex> leidub veel rohkem illustratsioone.<\/p>\n<p>Allikas: <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.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/et\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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 ja mikroteenused: \u00fclevaade | ProHoster","description":"Tere k\u00f5igile. Selles artiklis r\u00e4\u00e4gin, miks valisime Avitos seitse kuud tagasi Kafka, ja mis see endast kujutab. Jagame \u00fchte kasutusjuhtumit \u2014 s\u00f5numite vahendaja. Ja l\u00f5puks arutame, milliseid eeliseid oleme saanud Kafka as a Service l\u00e4henemise rakendamisest. Probleemiks on alguses pisut konteksti. M\u00f5ni aeg tagasi","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kafka-i-mikroservisy-obzor","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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. \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","og:url":"https:\/\/prohoster.info\/et\/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\/et\/wp-json\/wp\/v2\/posts\/37849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=37849"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/37849\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/28406"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=37849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=37849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=37849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}