Conas a tháinig Kafka réaltacht

Conas a tháinig Kafka réaltacht

Hey Habr!

Oibrím ar fhoireann Tinkoff, atá ag forbairt a lárionad fógra féin. Forbraím i Java den chuid is mó ag baint úsáide as Spring boot agus réitíonn mé fadhbanna teicniúla éagsúla a thagann chun cinn i dtionscadal.

Déanann an chuid is mó dár micreasheirbhísí cumarsáid lena chéile go neamhshioncronach trí bhróicéir teachtaireachtaí. Roimhe seo, d'úsáidamar IBM MQ mar bhróicéir, rud nach bhféadfadh sé dul i ngleic leis an ualach a thuilleadh, ach ag an am céanna bhí ráthaíochtaí seachadta ard.

Mar ionadach, tairgeadh Apache Kafka dúinn, a bhfuil acmhainneacht ardscála aige, ach, ar an drochuair, éilíonn cur chuige beagnach aonair maidir le cumraíocht do chásanna éagsúla. Ina theannta sin, níor cheadaigh an meicníocht seachadta uair amháin ar a laghad a oibríonn i Kafka de réir réamhshocraithe an leibhéal comhsheasmhachta riachtanach a choinneáil amach as an mbosca. Ansin, roinnfidh mé ár dtaithí ar chumraíocht Kafka, go háirithe, inseoidh mé duit conas a chumrú agus maireachtáil leis go díreach uair amháin a sheachadadh.

Seachadadh ráthaithe agus níos mó

Cabhróidh na socruithe a phléitear thíos le roinnt fadhbanna a chosc leis na socruithe réamhshocraithe ceangail. Ach ar dtús ba mhaith liom aird a thabhairt ar pharaiméadar amháin a éascóidh dífhabhtú féideartha.

Cabhróidh sé seo cliant.id don Táirgeoir agus Tomhaltóir. Ar an gcéad amharc, is féidir leat ainm an iarratais a úsáid mar luach, agus i bhformhór na gcásanna oibreoidh sé seo. Cé go mbíonn an rabhadh seo a leanas mar thoradh ar chás ina n-úsáideann feidhmchlár roinnt Tomhaltóirí agus go dtugann tú an cliant céanna dóibh.

org.apache.kafka.common.utils.AppInfoParser — Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0

Más mian leat JMX a úsáid in iarratas le Kafka, d'fhéadfadh sé seo a bheith ina fhadhb. Sa chás seo, is fearr meascán d'ainm an iarratais agus, mar shampla, ainm an ábhair a úsáid mar luach client.id. Is féidir toradh ár gcumraíochta a fheiceáil san aschur ordaithe kafka-grúpaí tomhaltóirí ó fhóntais ó Confluent:

Conas a tháinig Kafka réaltacht

Breathnaímid anois ar an gcás le haghaidh seachadadh teachtaireachtaí ráthaithe. Tá paraiméadar ag Léiritheoir Kafka aiceanna, a ligeann duit a chumrú tar éis cé mhéad admhaíonn go gcaithfidh an ceannaire braisle an teachtaireacht a scríobh go rathúil a mheas. Is féidir leis an bparaiméadar seo na luachanna seo a leanas a ghlacadh:

  • 0 — ní bhreithneofar admháil.
  • Is é 1 an paraiméadar réamhshocraithe, ní gá ach 1 macasamhail a admháil.
  • −1 — tá admháil ó gach macasamhail sioncronaithe ag teastáil (socrú braisle macasamhla.min.insync).

Ó na luachanna liostaithe tá sé soiléir go dtugann acks comhionann le −1 an ráthaíocht is láidre nach gcaillfear an teachtaireacht.

Mar is eol dúinn go léir, tá córais dáilte neamhiontaofa. Chun cosaint a dhéanamh i gcoinne lochtanna neamhbhuan, soláthraíonn Táirgeoir Kafka an rogha atriall, a ligeann duit líon na n-iarrachtaí athsheolta a shocrú laistigh am.ama seachadta.ms. Ós rud é go bhfuil luach réamhshocraithe Integer.MAX_VALUE (2147483647) ag an bparaiméadar atriail, is féidir líon na n-aistriarthaí teachtaireachta a choigeartú trí sheachadadh.timeout.ms amháin a athrú.

Táimid ag bogadh i dtreo an tseachadta díreach uair amháin

Ligeann na socruithe liostaithe dár Léiritheoir teachtaireachtaí a sheachadadh le ráthaíocht ard. Labhraímis anois faoi conas a chinntiú nach scríobhtar ach cóip amháin de theachtaireacht ar thopaic Kafka? Sa chás is simplí, chun é seo a dhéanamh, ní mór duit an paraiméadar a shocrú ar Léiritheoir chumas.idempotence go fíor. Cinntíonn neamhláithreacht nach scríobhtar ach teachtaireacht amháin chuig críochdheighilt ar leith d’ábhar amháin. Is é an réamhchoinníoll chun neamhláithreacht a chumasú na luachanna acks = all, atriail > 0, max.in.flight.requests.per.connection ≤ 5. Mura bhfuil na paraiméadair seo sonraithe ag an bhforbróir, socrófar na luachanna thuas go huathoibríoch.

Nuair a bhíonn idempotency cumraithe, is gá a chinntiú go deireadh na teachtaireachtaí céanna suas go dtí na Deighiltí céanna gach uair. Is féidir é seo a dhéanamh tríd an eochair partitioner.class agus paraiméadar a shocrú don Léiritheoir. Let tús leis an eochair. Caithfidh sé a bheith mar an gcéanna do gach aighneacht. Is féidir é seo a bhaint amach go héasca trí úsáid a bhaint as aon aitheantas gnó ón mbunphost. Tá luach réamhshocraithe ag paraiméadar partitioner.class − Rannpháirtí Réamhshocraithe. Leis an straitéis deighilte seo, gníomhaimid mar seo de réir réamhshocraithe:

  • Má shonraítear an deighilt go sainráite agus an teachtaireacht á seoladh, bainimid úsáid as.
  • Mura bhfuil an deighilt sonraithe, ach go bhfuil an eochair sonraithe, roghnaigh an deighilt le hash na heochrach.
  • Mura bhfuil an críochdheighilt agus an eochair sonraithe, roghnaigh na Deighiltí ceann ar cheann (cruinn-robin).

Chomh maith leis sin, ag baint úsáide as eochair agus a sheoladh idempotent le paraiméadar max.in.flight.requests.per.connection = 1 tugann sé próiseáil teachtaireachtaí sruthlínithe duit ar an Tomhaltóir. Is fiú a mheabhrú freisin má tá rialú rochtana cumraithe ar do bhraisle, beidh cearta ag teastáil uait chun scríobh chuig topaic gan mhoill.

Más rud é go tobann nach bhfuil na cumais agat maidir le seoladh dothuigthe le heochair nó má éilíonn an loighic ar thaobh an Táirgeora comhsheasmhacht sonraí a choinneáil idir deighiltí éagsúla, ansin beidh idirbhearta chun an tarrthála. Ina theannta sin, ag baint úsáide as idirbheart slabhra, is féidir leat taifead a shioncrónú go coinníollach i Kafka, mar shampla, le taifead sa bhunachar sonraí. Chun seoladh idirbheartaíochta chuig an Léiritheoir a chumasú, ní mór é a bheith neamhchumhachtach agus socraithe sa bhreis idirbhearta.id. Má tá rialú rochtana cumraithe ag do bhraisle Kafka, beidh ceadanna scríofa de dhíth ar thaifead idirbheartaíochta, cosúil le taifead neamhchumhachtach, ar féidir iad a dheonú le masc ag baint úsáide as an luach atá stóráilte in idirbheartaíochta.id.

Go foirmiúil, is féidir teaghrán ar bith, amhail ainm an fheidhmchláir, a úsáid mar aitheantóir idirbhirt. Ach má sheolann tú roinnt cásanna den iarratas céanna leis an idirbheartaíocht.id céanna, stopfar an chéad ásc le hearráid, toisc go measfaidh Kafka gur próiseas zombie é.

org.apache.kafka.common.errors.ProducerFencedException: Producer attempted an operation with an old epoch. Either there is a newer producer with the same transactionalId, or the producer's transaction has been expired by the broker.

Chun an fhadhb seo a réiteach, cuirimid iarmhír le hainm an fheidhmchláir i bhfoirm an óstainm, a fhaighimid ó athróga timpeallachta.

Tá an táirgeoir cumraithe, ach ní rialaíonn idirbhearta ar Kafka ach raon feidhme na teachtaireachta. Beag beann ar stádas an idirbhirt, téann an teachtaireacht láithreach chuig an ábhar, ach tá tréithe córais breise aige.

Chun teachtaireachtaí den sórt sin a chosc ó bheith á léamh ag an Tomhaltóir roimh an am, ní mór dó an paraiméadar a shocrú leithlis.leibhal le luach read_committed. Beidh a leithéid de Tomhaltóir in ann teachtaireachtaí neamh-idirbhearta a léamh mar a rinneadh roimhe seo, agus teachtaireachtaí idirbheartaíochta ach amháin tar éis gealltanas.
Má tá na socruithe go léir a liostaítear níos luaithe socraithe agat, ansin tá tú cumraithe go díreach nuair a sheachadadh. Comhghairdeachas!

Ach tá nuance amháin níos mó. Is é Transactional.id, a chumamar thuas, an réimír idirbhirt i ndáiríre. Ar an mbainisteoir idirbheart, cuirtear uimhir seicheamh leis. Eisítear an t-aitheantóir faighte chuig idirghníomh.id.éag.m, atá cumraithe ar bhraisle Kafka agus a bhfuil luach réamhshocraithe “7 lá”. Más rud é le linn an ama seo nach bhfuil an t-iarratas a fuarthas aon teachtaireachtaí, ansin nuair a dhéanann tú iarracht an chéad sheoladh idirbheartaíochta eile gheobhaidh tú InvalidPidMappingException. Eiseoidh an comhordaitheoir idirbheart ansin uimhir seichimh nua don chéad idirbheart eile. Seans go gcaillfear an teachtaireacht, áfach, mura láimhseáiltear an InvalidPidMappingException i gceart.

In ionad na hiomláin

Mar a fheiceann tú, ní leor teachtaireachtaí a sheoladh chuig Kafka. Ní mór duit meascán de pharaiméadair a roghnú agus a bheith ullamh chun athruithe tapa a dhéanamh. San Airteagal seo, rinne mé iarracht an socrú seachadta díreach uair amháin a thaispeáint go mion agus rinne mé cur síos ar roinnt fadhbanna leis na cumraíochtaí client.id agus idirbheartaíochta. Seo thíos achoimre ar na socruithe do Tháirgeoirí agus do Thomhaltóirí.

Léiritheoir:

  1. acks = uile
  2. atriallaíonn > 0
  3. enable.idempotence = fíor
  4. max.in.flight.requests.per.connection ≤ 5 (1 le seoladh ordúil)
  5. trafodal.id = ${ainm an fheidhmchláir} -${ óstainm}

Tomhaltóir:

  1. leithlisiú.level = read_tiomanta

Chun earráidí a íoslaghdú in iarratais sa todhchaí, rinneamar ár gcumhdach féin thar chumraíocht an earraigh, áit a bhfuil luachanna do chuid de na paraiméadair liostaithe socraithe cheana féin.

Seo cúpla ábhar le haghaidh féinstaidéir:

Foinse: will.com

Add a comment