Mar a thàinig Kafka gu bhith na fhìrinn

Mar a thàinig Kafka gu bhith na fhìrinn

Hi Habr!

Tha mi ag obair air sgioba Tinkoff, a tha a’ leasachadh an ionad fios aca fhèin. Bidh mi a’ leasachadh ann an Java sa mhòr-chuid a’ cleachdadh Spring boot agus a’ fuasgladh diofar dhuilgheadasan teicnigeach a thig am bàrr ann am pròiseact.

Bidh a’ mhòr-chuid de na meanbh-sheirbheisean againn a’ conaltradh ri chèile gu neo-sheasmhach tro broker teachdaireachd. Roimhe sin, chleachd sinn IBM MQ mar broker, nach b’ urrainn dèiligeadh ris an luchd tuilleadh, ach aig an aon àm bha barrantasan lìbhrigidh àrd.

Mar neach eile, chaidh Apache Kafka a thabhann dhuinn, aig a bheil comas sgèileachaidh àrd, ach, gu mì-fhortanach, tha feum air dòigh-obrach cha mhòr fa leth a thaobh rèiteachadh airson diofar shuidheachaidhean. A bharrachd air an sin, cha do leig an uidheamachd lìbhrigidh co-dhiù aon uair a tha ag obair ann an Kafka gu bunaiteach leis an ìre cunbhalachd riatanach a chumail a-mach às a ’bhogsa. An ath rud, roinnidh mi ar n-eòlas ann an rèiteachadh Kafka, gu sònraichte, innsidh mi dhut mar a nì thu rèiteachadh agus fuireach leis dìreach aon uair ‘s gu bheil an lìbhrigeadh.

Lìbhrigeadh cinnteach agus barrachd

Cuidichidh na roghainnean air an deach beachdachadh gu h-ìosal gus casg a chuir air grunn dhuilgheadasan leis na roghainnean ceangail bunaiteach. Ach an toiseach bu mhath leam aire a thoirt do aon paramadair a chuidicheas le deasbad a dh’ fhaodadh a bhith ann.

Cuidichidh seo cliant.id airson Riochdaire agus Luchd-cleachdaidh. Aig a’ chiad sealladh, faodaidh tu ainm an tagraidh a chleachdadh mar luach, agus sa mhòr-chuid de chùisean obraichidh seo. Ged a tha an suidheachadh nuair a bhios tagradh a’ cleachdadh grunn Luchd-cleachdaidh agus a bheir thu dhaibh an aon client.id, thig an rabhadh a leanas:

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

Ma tha thu airson JMX a chleachdadh ann an tagradh le Kafka, dh ’fhaodadh seo a bhith na dhuilgheadas. Airson a 'chùis seo, tha e nas fheàrr measgachadh de ainm an tagraidh a chleachdadh agus, mar eisimpleir, ainm a' chuspair mar luach client.id. Chithear toradh ar rèiteachaidh ann an toradh an àithne kafka-buidhnean luchd-cleachdaidh bho ghoireasan bho Confluent:

Mar a thàinig Kafka gu bhith na fhìrinn

A-nis leig dhuinn sùil a thoirt air an t-suidheachadh airson lìbhrigeadh teachdaireachd cinnteach. Tha paramadair aig Kafka Producer aic, a leigeas leat rèiteachadh às deidh cia mheud a tha ag aideachadh gum feum an stiùiriche brabhsair beachdachadh air an teachdaireachd a chaidh a sgrìobhadh gu soirbheachail. Faodaidh am paramadair seo na luachan a leanas a ghabhail:

  • 0 - cha tèid beachdachadh air aideachadh.
  • Is e 1 am paramadair bunaiteach, chan fheumar ach 1 mac-samhail aithneachadh.
  • −1 - feumar aideachadh bho gach mac-samhail sioncronaich (suidheachadh cnuasachadh mion.insync.mac-samhail).

Bho na luachan clàraichte tha e soilleir gu bheil acasan co-ionann ri −1 a’ toirt seachad a’ ghealladh as làidire nach tèid an teachdaireachd a chall.

Mar a tha fios againn uile, tha siostaman sgaoilte neo-earbsach. Gus dìon an aghaidh sgàinidhean gluasadach, tha Riochdaire Kafka a ’toirt seachad an roghainn feuchainn a-rithist, a leigeas leat an àireamh de dh’ oidhirpean ath-chuir a-staigh a shuidheachadh ùine lìbhrigidh.ms. Leis gu bheil luach bunaiteach Integer.MAX_VALUE (2147483647) aig a' pharameter ath-dheuchainn (XNUMX), faodar an àireamh ath-chuingean teachdaireachd atharrachadh le bhith ag atharrachadh lìbhrigeadh.timeout.ms a-mhàin.

Tha sinn a 'gluasad a dh'ionnsaigh dìreach aon uair lìbhrigeadh

Leigidh na roghainnean clàraichte leis an Riochdaire againn teachdaireachdan a lìbhrigeadh le gealltanas àrd. Nach bruidhinn sinn a-nis mu mar a nì sinn cinnteach nach tèid ach aon leth-bhreac de theachdaireachd a sgrìobhadh gu cuspair Kafka? Anns a 'chùis as sìmplidh, gus seo a dhèanamh, feumaidh tu am paramadair a shuidheachadh air Riochdaire comas.idempotence gu fìor. Tha idempotency a’ gealltainn nach tèid ach aon teachdaireachd a sgrìobhadh gu roinn sònraichte de aon chuspair. Is e an ro-chùmhnant airson neo-chomasachd a chomasachadh na luachan acs = uile, feuch a-rithist> 0, max.in.flight.requests.per.connection ≤ 5. Mura h-eil na paramadairean sin air an sònrachadh leis an leasaiche, thèid na luachan gu h-àrd a shuidheachadh gu fèin-ghluasadach.

Nuair a tha idempotency air a rèiteachadh, feumar dèanamh cinnteach gu bheil na h-aon teachdaireachdan a’ tighinn gu crìch anns na h-aon earrannan a h-uile turas. Faodar seo a dhèanamh le bhith a 'suidheachadh an partitioner.class key agus paramadair gu Riochdaire. Feuch an tòisich sinn leis an iuchair. Feumaidh e a bhith mar an ceudna airson gach tagradh. Faodar seo a choileanadh gu furasta le bhith a’ cleachdadh gin de na IDan gnìomhachais bhon phost thùsail. Tha luach bunaiteach aig paramadair partitioner.class - DefaultPartitioner. Leis an ro-innleachd sgaradh seo, gu bunaiteach bidh sinn ag obair mar seo:

  • Ma tha an sgaradh air a shònrachadh gu soilleir nuair a chuireas sinn an teachdaireachd, bidh sinn ga chleachdadh.
  • Mura h-eil an sgaradh air a shònrachadh, ach gu bheil an iuchair air a shònrachadh, tagh an sgaradh le hash na h-iuchrach.
  • Mura h-eil an sgaradh agus an iuchair air a shònrachadh, tagh na h-earrainnean aon ri aon (robin cruinn).

Cuideachd, a 'cleachdadh iuchair agus cur gu neo-chomasach le paramadair max.in.flight.requests.per.connection = 1 a’ toirt dhut giullachd theachdaireachdan sgiobalta air an Neach-cleachdaidh. Is fhiach cuimhneachadh cuideachd ma tha smachd ruigsinneachd air a rèiteachadh air a’ bhuidheann agad, feumaidh tu còraichean airson sgrìobhadh gu cuspair gun fhiosta.

Mura h-eil na comasan agad gu h-obann airson cur air falbh le iuchair no ma tha an loidsig air taobh an Riochdaire ag iarraidh cunbhalachd dàta a chumail eadar diofar phàirtean, thig gnothaichean gu teasairginn. A bharrachd air an sin, le bhith a ’cleachdadh malairt slabhraidh, faodaidh tu clàr ann an Kafka a shioncronachadh gu cumhach, mar eisimpleir, le clàr san stòr-dàta. Gus leigeil le gnìomhachd a chuir chun Riochdaire, feumaidh e a bhith neo-chomasach agus a bharrachd air a shuidheachadh malairt.id. Ma tha smachd ruigsinneachd aig a’ bhuidheann Kafka agad air a rèiteachadh, feumaidh clàr gnìomh, leithid clàr neo-chomasach, ceadan sgrìobhaidh, a dh’ fhaodar a thoirt seachad le masg a’ cleachdadh an luach a tha air a stòradh ann an transactional.id.

Gu foirmeil, faodar sreang sam bith, leithid ainm an tagraidh, a chleachdadh mar aithnichear malairt. Ach ma chuireas tu grunn shuidheachaidhean air bhog den aon iarrtas leis an aon malairt.id, thèid stad a chuir air a’ chiad chùis le mearachd, oir bidh Kafka ga mheas mar phrò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.

Gus an duilgheadas seo fhuasgladh, cuiridh sinn iar-leasachan ri ainm an tagraidh ann an cruth an ainm aoigheachd, a gheibh sinn bho chaochladairean àrainneachd.

Tha an riochdaire air a rèiteachadh, ach chan eil smachd aig gnothaichean air Kafka ach air farsaingeachd na teachdaireachd. A dh'aindeoin inbhe a 'ghnothaich, bidh an teachdaireachd a' dol chun chuspair sa bhad, ach tha feartan siostam a bharrachd aige.

Gus casg a chuir air na teachdaireachdan sin a bhith air an leughadh leis an neach-cleachdaidh ro-làimh, feumaidh e am paramadair a shuidheachadh aonaranachd.ìre gu luach read_committed. Bidh an leithid de neach-cleachdaidh comasach air teachdaireachdan neo-ghnìomhach a leughadh mar a bha iad roimhe, agus teachdaireachdan malairt dìreach às deidh gealltanas.
Ma tha thu air a h-uile suidheachadh a chaidh ainmeachadh roimhe a shuidheachadh, tha thu air a rèiteachadh dìreach aon uair ‘s gu bheil thu air a lìbhrigeadh. Mealaibh ur naidheachd!

Ach tha aon nuance eile ann. Is e Transactional.id, a shuidhich sinn gu h-àrd, an ro-leasachan malairt. Air a 'mhanaidsear malairt, thèid àireamh sreath a chur ris. Thèid an aithnichear a fhuaireadh a thoirt seachad gu malairt.id.deireadh.ms, a tha air a rèiteachadh air cruinneachadh Kafka agus aig a bheil luach bunaiteach de “7 latha”. Mura d’ fhuair an tagradh teachdaireachdan sam bith rè na h-ùine seo, an uairsin nuair a dh’ fheuchas tu ris an ath chuir malairt gheibh thu InvalidPidMappingException. Cuiridh an co-òrdanaiche malairt a-mach an uairsin àireamh sreath ùr airson an ath ghnothach. Ach, dh’ fhaodadh gun tèid an teachdaireachd a chall mura tèid an InvalidPidMappingException a làimhseachadh gu ceart.

An àite suimean

Mar a chì thu, chan eil e gu leòr dìreach teachdaireachdan a chuir gu Kafka. Feumaidh tu measgachadh de pharamadairean a thaghadh agus a bhith deiseil airson atharrachaidhean luath a dhèanamh. Anns an artaigil seo, dh’ fheuch mi ri sealltainn gu mionaideach an suidheachadh lìbhrigidh dìreach aon uair agus thug mi cunntas air grunn dhuilgheadasan leis na rèiteachaidhean client.id agus transactional.id ris an do choinnich sinn. Gu h-ìosal tha geàrr-chunntas de na roghainnean Riochdaire is Luchd-cleachdaidh.

Riochdaire:

  1. aic = uile
  2. feuchainn a-rithist > 0
  3. enable.idempotence = fìor
  4. max.in.flight.requests.per.connection ≤ 5 (1 airson a chuir gu òrdail)
  5. trafodtal.id = ${ainm an tagraidh} - ${ ainm an òstair}

Cleachdaiche:

  1. aonaranachd.level = read_committed

Gus mearachdan ann an tagraidhean san àm ri teachd a lughdachadh, rinn sinn ar còmhdach fhèin thairis air rèiteachadh an earraich, far a bheil luachan airson cuid de na paramadairean clàraichte air an suidheachadh mar-thà.

Seo cuid de stuthan airson fèin-ionnsachadh:

Source: www.habr.com

Cuir beachd ann