
Dia duit gach duine. San Airteagal seo inseoidh mé duit cén fáth ar roghnaigh muid ag Avito Kafka naoi mí ó shin agus cad é. Roinnfidh mé ceann de na cásanna úsáide - bróicéir teachtaireachtaí. Agus ar deireadh, déanaimis labhairt faoi na buntáistí a bhain linn as an Kafka a úsáid mar chur chuige Seirbhíse.
fadhb

Gcéad dul síos, comhthéacs beag. Tamall ó shin thosaigh muid ag bogadh ar shiúl ón ailtireacht monolithic, agus anois tá na céadta seirbhísí éagsúla ag Avito cheana féin. Tá a stórtha féin acu, a gcruach teicneolaíochta féin agus tá siad freagrach as a gcuid de loighic an ghnó.
Ceann de na fadhbanna a bhaineann le líon mór seirbhísí ná cumarsáid. Is minic gur mian le Seirbhís A eolas a fháil atá ag Seirbhís B. Sa chás seo, faigheann Seirbhís A rochtain ar Sheirbhís B trí API sioncronach. Teastaíonn ó Sheirbhís B a fháil amach cad atá ar siúl le seirbhísí D agus D, agus tá suim acu, ar a seal, i seirbhísí A agus B. Nuair a bhíonn go leor seirbhísí “aisteacha” den sórt sin ann, iompaíonn na naisc eatarthu ina gcloigeann tangled.
Ag an am céanna, d’fhéadfadh sé nach mbeadh seirbhís A ar fáil am ar bith. Agus cad ba cheart do sheirbhís B agus do na seirbhísí eile go léir a bhaineann leis a dhéanamh sa chás seo? Agus má tá gá le slabhra de ghlaonna sioncrónacha seicheamhach chun oibríocht ghnó a chomhlánú, éiríonn an dóchúlacht go dteipfidh ar an oibríocht iomlán níos airde fós (agus an níos faide an slabhra, is airde é).
Roghnú teicneolaíochta

Ceart go leor, tá na fadhbanna soiléir. Is féidir deireadh a chur leo trí chóras teachtaireachtaí láraithe a chruthú idir seirbhísí. Anois ní gá go mbeadh a fhios ag gach ceann de na seirbhísí ach faoin gcóras teachtaireachtaí seo. Ina theannta sin, ní mór don chóras féin a bheith fabhtach agus inscálaithe go cothrománach, agus freisin, i gcás tionóiscí, maolán rochtana a charnadh lena phróiseáil ina dhiaidh sin.
Roghnóimid anois an teicneolaíocht ar a gcuirfear seachadadh teachtaireachta i bhfeidhm. Chun seo a dhéanamh, tuigfimid ar dtús cad a bhfuil súil againn uaidh:
- níor cheart teachtaireachtaí idir seirbhísí a chailleadh;
- is féidir teachtaireachtaí a mhacasamhlú;
- is féidir teachtaireachtaí a stóráil agus a léamh go dtí doimhneacht de roinnt laethanta (maolán leanúnach);
- is féidir le seirbhísí liostáil leis na sonraí a bhfuil suim acu iontu;
- is féidir le seirbhísí iolracha na sonraí céanna a léamh;
- is féidir pálasta mionsonraithe toirtiúil a bheith sna teachtaireachtaí (aistriú stáit arna iompar ag imeacht);
- Uaireanta ní mór duit ordú na dteachtaireachtaí a ráthú.
Bhí sé ríthábhachtach freisin dúinn an córas is inscálaithe agus iontaofa a roghnú le tréchur ard (ar a laghad 100k teachtaireacht de roinnt cilibheart in aghaidh an tsoicind).
Ag an bpointe seo, dúirt muid slán le RabbitMQ (deacair a choinneáil cobhsaí ag rps ard), PGQ ó SkyTools (gan a bheith tapa go leor agus nach bhfuil scála maith) agus NSQ (gan a bheith leanúnach). Bainimid úsáid as na teicneolaíochtaí seo go léir inár gcuideachta, ach ní raibh siad oiriúnach don fhadhb a bhí á réiteach.
Ansin, thosaigh muid ag féachaint ar theicneolaíochtaí a bhí nua dúinn - Apache Kafka, Apache Pulsar agus NATS Streaming.
Ba é Pulsar an chéad duine a cuireadh i leataobh. Shocraigh muid go bhfuil Kafka agus Pulsar réitigh cosúil go leor. Agus in ainneoin go ndearna cuideachtaí móra tástáil ar Pulsar, go bhfuil sé níos nuaí agus go dtugann sé latency níos ísle (go teoiriciúil), shocraigh muid Kafka den dá cheann seo a fhágáil mar chaighdeán de facto le haghaidh tascanna den sórt sin. Is dócha go bhfillfimid ar Apache Pulsar amach anseo.
Agus anois tá beirt iarrthóirí fágtha: NATS Streaming agus Apache Kafka. Rinneamar staidéar go mion ar an dá réiteach, agus bhí an dá cheann acu oiriúnach don tasc. Ach sa deireadh, bhí eagla orainn roimh óige coibhneasta NATS Streaming (agus ar an bhfíric gur chinn ceann de na príomhfhorbróirí, Tyler Treat, an tionscadal a fhágáil agus a chuid féin a thosú - Liftbridge). Ag an am céanna, níor sholáthair an modh braisliú de shruthú NATS an fhéidearthacht go ndéanfaí scálaithe cothrománach láidir (is dócha nach fadhb é seo a thuilleadh tar éis an modh deighilte a chur leis in 2017).
Mar sin féin, is teicneolaíocht fionnuar é NATS Streaming atá scríofa in Go agus a fhaigheann tacaíocht ón Cloud Native Computing Foundation. Murab ionann agus Apache Kafka, ní gá Zookeeper a bheith ag obair (b'fhéidir ), ós rud é go gcuireann sé RAFT i bhfeidhm go hinmheánach. Ag an am céanna, is fusa Sruthú NATS a riar. Ní chuirimid riail amach go bhfillfimid ar an teicneolaíocht seo amach anseo.
Agus fós, inniu is é Apache Kafka ár mbuaiteoir. Inár dtástálacha, bhí sé sách tapa (níos mó ná milliún teachtaireacht in aghaidh an tsoicind le léamh agus le scríobh le méid teachtaireachtaí 1 cilibheart), iontaofa go leor, thar a bheith inscálaithe agus cruthaithe ag taithí i dtáirgeadh cuideachtaí móra. Ina theannta sin, tacaíonn Kafka le roinnt cuideachtaí móra tráchtála ar a laghad (bainimid úsáid as an leagan Confluent, mar shampla), agus tá éiceachóras forbartha ag Kafka freisin.
Forbhreathnú Kafka
Sula dtosaímid, ba mhaith liom leabhar den scoth a mholadh láithreach - "Kafka: An Treoir Dheiridh" (tá aistriúchán Rúisise ann freisin, ach tá na téarmaí rud beag aigne-boggling). Tá an t-eolas atá uait chun tuiscint bhunúsach a fháil ar Kafka agus fiú beagán eile ann. Tá doiciméadú Apache agus blag Confluent dea-scríofa agus éasca le léamh freisin.
Mar sin, déanaimis radharc na súl a fháil ar conas a oibríonn Kafka. Is éard atá i topology bunúsach Kafka ná táirgeoir, tomhaltóir, bróicéir agus coimeádaí zú.
bróicéir

Tá an bróicéir freagrach as do shonraí a stóráil. Stóráiltear na sonraí go léir i bhfoirm dhénártha, agus is beag a fhios ag an bróicéir cad iad agus cad é a struchtúr.
Is gnách go mbíonn gach cineál imeacht loighciúil suite ina ábhar ar leith féin. Mar shampla, d’fhéadfadh an teagmhas ina gcruthaítear fógra titim isteach san ábhar item.created, agus d’fhéadfadh imeacht a athraithe titim isteach i item.changed. Is féidir topaicí a mheas mar aicmitheoirí imeachtaí. Ag leibhéal an ábhair, is féidir leat paraiméadair cumraíochta a shocrú mar:
- an méid sonraí atá stóráilte agus/nó a aois (bearta coinneála, coinneáil.ms);
- fachtóir iomarcaíochta sonraí (fachtóir macasamhlaithe);
- uasmhéid teachtaireacht amháin (max.message.bytes);
- an t-íoslíon macasamhla comhsheasmhacha ar féidir sonraí a scríobh chuig topaic (min.insync.replicas);
- an cumas mainneachtain a dhéanamh ar mhacasamhail lagging neamhshioncrónach a bhféadfadh caillteanas sonraí a bheith ann (unclean.leader.election.enable);
- agus go leor eile ().
Ina dhiaidh sin, roinntear gach topaic i ndeighiltí amháin nó níos mó. Is sna páirtithe a thiteann imeachtaí ar deireadh thiar. Má tá níos mó ná bróicéir amháin sa bhraisle, ansin déanfar na deighiltí a dháileadh go cothrom ar na bróicéirí go léir (chomh fada agus is féidir), rud a fhágann gur féidir an t-ualach ar scríobh agus léamh in aon ábhar amháin a scála ar fud roinnt bróicéirí ag an am céanna.
Ar diosca, stóráiltear sonraí do gach deighilt i bhfoirm comhaid deighleog, de réir réamhshocraithe comhionann le gigabyte amháin (arna rialú trí log.segment.bytes). Gné thábhachtach is ea go scriostar sonraí ó dheighiltí (nuair a spreagtar coinneáil) i ndeighleoga (ní féidir leat imeacht amháin a scriosadh as críochdheighilt, ní féidir leat ach teascán iomlán a scriosadh, agus gan ach an ceann neamhghníomhach).
Coimeádaí Zooke
Feidhmíonn Zookeeper mar stór meiteashonraí agus mar chomhordaitheoir. Is é an té atá in ann a rá an bhfuil bróicéirí beo (is féidir leat breathnú air seo trí shúile an zookeeper ag baint úsáide as zookeeper-shell leis an ordú ls /brokers/ids), cén bróicéir atá ina rialtóir (get /controller), cibé an bhfuil na deighiltí i sioncrónaithe lena macasamhla (get /brokers/topics/topic_name/partitions/partition_number/state). Chomh maith leis sin, is chuig an zookeeper a rachaidh an táirgeoir agus an tomhaltóir chun a fháil amach ar dtús cén bróicéir cé na hábhair agus na landairí a stóráiltear. I gcásanna ina sonraítear fachtóir macasamhlaithe níos mó ná 1 do thopaic, léireoidh an zú-choimeád cé na landairí atá ina gceannairí (scríobhfar chucu agus léifear uathu iad). I gcás teipe bróicéir, déanfar faisnéis faoi dheighiltí ceannaire nua a thaifeadadh i zookeeper (ó leagan 1.1.0 go neamhshioncronach, ).
I leaganacha níos sine de Kafka, bhí zookeeper freagrach freisin as fritháirimh a stóráil, ach anois tá siad stóráilte in ábhar speisialta __consumer_offsets ar an mbróicéir (cé gur féidir leat zookeeper a úsáid fós chun na gcríoch sin).
Is é an bealach is éasca chun do shonraí a iompú isteach i bpumpkin ná faisnéis a chailleadh ó zookeeper. I gcás den sórt sin, beidh sé an-deacair a thuiscint cad atá le léamh agus cá háit.
Léiritheoir
Is minic gur seirbhís é an léiritheoir a scríobhann sonraí go díreach chuig Apache Kafka. Roghnaíonn an Léiritheoir topaic chun a chuid teachtaireachtaí topaicí a stóráil agus tosaíonn sé ag scríobh faisnéise chuige. Mar shampla, d'fhéadfadh an táirgeoir a bheith ina sheirbhís fógraíochta. Sa chás seo, seolfaidh sé imeachtaí ar nós “cruthaíodh fógra”, “shonraíodh fógra”, “scriosadh fógra”, etc. chuig ábhair théamacha. Is péire eochairluacha gach imeacht.
De réir réamhshocraithe, déantar gach imeacht a dháileadh i measc na ndeighiltí ábhar ag baint úsáide as babhta-robín mura bhfuil an eochair sonraithe (ordú a chailleadh), agus trí MurmurHash (eochair) má tá an eochair i láthair (ordú laistigh de dheighilt amháin).
Is fiú a thabhairt faoi deara láithreach nach ráthaíonn Kafka ord na n-imeachtaí ach laistigh de bhaisc amháin. Ach i ndáiríre ní fadhb é seo go minic. Mar shampla, is féidir leat a bheith cinnte gach athrú ar an dearbhú céanna a chur isteach in aon dheighilt amháin (dá bhrí sin ord na n-athruithe seo a chaomhnú laistigh den dearbhú). Is féidir leat seicheamh uimhir a sheoladh freisin i gceann de na réimsí imeachta.
Tomhaltóirí

Tá an tomhaltóir freagrach as sonraí a fháil ó Apache Kafka. Má fhilleann muid ar an sampla thuas, d'fhéadfadh an tomhaltóir a bheith ina sheirbhís measarthachta. Beidh an tseirbhís seo suibscríofa do thopaic na seirbhíse fógraí, agus nuair a thaispeánfar fógra nua, gheobhaidh sé é agus déanfaidh sé anailís air maidir le comhlíonadh roinnt beartas sonraithe.
Cuimhníonn Apache Kafka ar na himeachtaí a fuair an tomhaltóir le déanaí (úsáidtear ábhar seirbhíse chuige seo __consumer__offsets), rud a chinntíonn, má éiríonn leis an léamh, nach bhfaighidh an tomhaltóir an teachtaireacht chéanna faoi dhó. Mar sin féin, má úsáideann tú an enable.auto.commit = fíor-rogha agus má dhéanann tú an obair rianú suíomh an tomhaltóra san ábhar a tharmligean go Kafka go hiomlán, is féidir leat . Sa chód táirgthe, is minic a rialaítear suíomh an tomhaltóra de láimh (rialaíonn an forbróir an tráth a gcaithfidh tiomantas an imeachta léite a bheith ann).
I gcásanna nach leor tomhaltóir amháin (mar shampla, tá an sreabhadh imeachtaí nua an-mhór), is féidir leat níos mó tomhaltóirí a chur leis trína nascadh le chéile i ngrúpa tomhaltóirí. Go loighciúil tá grúpa tomhaltóirí díreach mar an gcéanna le tomhaltóir, ach déantar sonraí a dháileadh ar bhaill an ghrúpa. Ligeann sé seo do gach rannpháirtí a sciar de theachtaireachtaí a ghlacadh, agus mar sin an luas léitheoireachta a scála.
Torthaí tástála

Ní scríobhfaidh mé mórán téacs míniúcháin anseo, ní dhéanfaidh mé ach na torthaí a fuarthas a roinnt. Rinneadh tástáil ar 3 inneall fisiceacha (12 LAP, 384GB RAM, 15k SAS DISK, 10GBit/s Net), imscaradh bróicéirí agus coimeádaí zú i lxc.
Tástáil feidhmíochta
Le linn na tástála, fuarthas na torthaí seo a leanas.
- Is é luas taifeadta teachtaireachtaí 1KB ag an am céanna ag 9 léiritheoir ná 1300000 imeacht in aghaidh an tsoicind.
- Is é luas léamh teachtaireachtaí 1KB ag an am céanna ag 9 dtomhaltóir ná 1500000 imeacht in aghaidh an tsoicind.
Tástáil lamháltais locht
Le linn na tástála, fuarthas na torthaí seo a leanas (3 bróicéir, 3 zookeepers).
- Ní chuireann foirceannadh neamhghnácha ar cheann de na bróicéirí faoi deara go stopann an braisle nó nach mbíonn sé ar fáil. Leanann an obair ar aghaidh mar is gnách, ach tá ualach oibre trom ar na bróicéirí atá fágtha.
- Mar thoradh ar fhoirceannadh neamhghnácha dhá bhróicéir i gcás cnuasach de thrí bróicéir agus min.isr = 2 ní bhíonn an braisle ar fáil le haghaidh scríbhneoireachta, ach inrochtana le haghaidh léitheoireachta. Má tá min.isr = 1, leanann an cnuasach de bheith ar fáil don léitheoireacht agus don scríbhneoireacht araon. Mar sin féin, tá an modh seo ag teacht salach ar an gceanglas maidir le slándáil sonraí ard.
- Ní chuireann múchadh neamhghnácha ar cheann de na freastalaithe Zookeeper cúis leis an mbraisle stopadh nó a bheith ar fáil. Leanann an obair ar aghaidh mar is gnách.
- Mar thoradh ar mhúchadh neamhghnách de dhá fhreastalaí Zookeeper ní bhíonn an braisle ar fáil go dtí go ndéanfar ceann amháin ar a laghad de na freastalaithe Zookeeper a athchóiriú. Tá an ráiteas seo fíor i gcás braisle Zookeeper de 3 fhreastalaí. Mar thoradh air sin, tar éis taighde, socraíodh braisle Zookeeper a mhéadú go 5 fhreastalaí chun lamháltas locht a mhéadú.
Kafka mar sheirbhís

Táimid cinnte gur teicneolaíocht den scoth é Kafka a ligeann dúinn an tasc a shanntar dúinn a réiteach (bróicéir teachtaireachtaí a chur i bhfeidhm). Mar sin féin, bheartaíomar seirbhísí a thoirmeasc ó rochtain dhíreach a fháil ar Kafka agus dhúnamar é le seirbhís bus sonraí. Cén fáth a ndearna muid é seo? Go deimhin, tá go leor cúiseanna.
Ghlac an bus sonraí na tascanna go léir a bhain le comhtháthú le Kafka i bhfeidhm (tomhaltóirí agus táirgeoirí a chur i bhfeidhm agus a chumrú, faireachán, foláireamh, logáil, scálú, etc.). Mar sin, tá comhtháthú leis an mbróicéir teachtaireachtaí chomh simplí agus is féidir.
Cheadaigh bus sonraí dúinn a bheith ag tarraingt ar shiúl ó theanga nó leabharlann ar leith chun oibriú le Kafka.
Cheadaigh bus sonraí do sheirbhísí eile an ciseal stórála a bhaint. B'fhéidir ag pointe éigin go n-athróimid Kafka go Pulsar, agus ní thabharfaidh aon duine faoi deara rud ar bith (ní bhíonn a fhios ag gach seirbhís ach faoin API sonraí-bus).
Ghlac data-bus seilbh ar bhailíochtú scéimre imeachtaí.
Cuirtear fíordheimhniú i bhfeidhm trí úsáid a bhaint as sonraí-bus.
Faoi chlúdach an bhus sonraí, is féidir linn leaganacha Kafka a nuashonrú go ciúin gan aga neamhfhónaimh, cumraíochtaí táirgeoirí, tomhaltóirí, bróicéirí, srl a bhainistiú go lárnach.
Cheadaigh bus sonraí dúinn na gnéithe a theastaigh uainn nach bhfuil i Kafka a chur leis (cosúil le topaicí iniúchóireachta, monatóireacht a dhéanamh ar aimhrialtachtaí sa bhraisle, cruthú DLQ, etc.).
Ligeann bus sonraí duit teip a chur i bhfeidhm go lárnach do gach seirbhís.
I láthair na huaire, chun tús a chur le himeachtaí a sheoladh chuig an bróicéir teachtaireachtaí, ní mór duit ach leabharlann bheag a nascadh le do chód seirbhíse. Tá sé seo go léir. Tá an cumas agat scríobh, léamh agus scála a dhéanamh le líne amháin cód. Tá an cur i bhfeidhm iomlán i bhfolach uait, agus níl ach cúpla láimhseáil de mhéid baisce ag gobadh amach. Faoin gcochall, ardaíonn an tseirbhís bus sonraí an líon riachtanach cásanna táirgeoirí agus tomhaltóirí i Kubernetes agus soláthraíonn sé an chumraíocht riachtanach dóibh, ach tá sé seo go léir trédhearcach do do sheirbhís.
Ar ndóigh, níl aon piléar airgid ann, agus tá a theorainneacha ag an gcur chuige seo.
- Ní mór tacaíocht a thabhairt do bhus sonraí go hinmheánach, i gcomparáid le leabharlanna tríú páirtí.
- Méadaíonn sonraí-bus líon na n-idirghníomhaíochtaí idir seirbhísí agus an bróicéir teachtaireachtaí, rud a fhágann go mbíonn feidhmíocht níos ísle i gcomparáid le Kafka lom.
- Ní féidir gach rud a cheilt ó sheirbhísí chomh héasca sin; nílimid ag iarraidh feidhmiúlacht KSQL nó Kafka Streams a mhacasamhlú i mbus sonraí, mar sin uaireanta caithfimid ligean do sheirbhísí dul go díreach.
Inár gcás, ba mhó na buntáistí ná na míbhuntáistí, agus bhí údar leis an gcinneadh an bróicéir teachtaireachta a chlúdach le seirbhís ar leith. I rith na bliana oibríochta ní raibh aon timpistí tromchúiseacha nó fadhbanna tromchúiseacha againn.
PS Buíochas le mo chailín, Ekaterina Obalyaeva, as na pictiúir fionnuar don alt seo. Más maith leat iad, tá tuilleadh léaráidí le teacht.
Foinse: will.com
