Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 3. Kafka

Kontinwazzjoni tat-traduzzjoni ta' ktieb żgħir:
Nifhmu s-sensara tal-messaġġi
awtur: Jakub Korab, pubblikatur: O'Reilly Media, Inc., data tal-pubblikazzjoni: Ġunju 2017, ISBN: 9781492049296.

Parti tradotta preċedenti: Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 1 Introduzzjoni

KAPITOLU 3

Kafka

Kafka ġie żviluppat fuq LinkedIn biex jevita xi wħud mil-limitazzjonijiet tas-sensara tal-messaġġi tradizzjonali u jevita li jkollok iwaqqaf sensara ta' messaġġi multipli għal interazzjonijiet differenti minn punt għal punt, li huwa deskritt f'dan il-ktieb taħt "Scaling up and out" f'paġna 28 . Każijiet ta' użu LinkedIn fil-biċċa l-kbira bbażat ruħha fuq inġestjoni one-way ta' ammonti kbar ħafna ta' dejta, bħal klikks fuq il-paġni u logs ta' aċċess, filwaqt li xorta ppermettiet li dik id-dejta tintuża minn sistemi multipli mingħajr ma tħalli impatt fuq il-produttività tal-produtturi jew konsumaturi oħra. Fil-fatt, ir-raġuni li teżisti Kafka hija biex tikseb it-tip ta 'arkitettura ta' messaġġi li jiddeskrivi l-Universal Data Pipeline.

Minħabba dan l-għan aħħari, naturalment qamu rekwiżiti oħra. Kafka għandu:

  • Kun estremament mgħaġġel
  • Ipprovdi aktar bandwidth meta taħdem b'messaġġi
  • Appoġġ għall-Pubblikatur-Abbonat u l-mudelli minn Punt għal Punt
  • Tnaqqasx bil-mod biż-żieda tal-konsumaturi. Pereżempju, il-prestazzjoni kemm tal-kju kif ukoll tas-suġġett f'ActiveMQ tiddegrada hekk kif in-numru ta 'konsumaturi fid-destinazzjoni jikber.
  • Kun orizzontalment skalabbli; jekk sensar wieħed li jippersisti messaġġi jista 'jagħmel dan biss b'veloċità massima tad-disk, allura jagħmel sens li tmur lil hinn minn istanza ta' sensar wieħed biex tiżdied il-prestazzjoni
  • Illimita l-aċċess għall-ħażna u l-irkupru mill-ġdid tal-messaġġi

Biex tikseb dan kollu, Kafka adotta arkitettura li ddefiniet mill-ġdid ir-rwoli u r-responsabbiltajiet tal-klijenti u s-sensara tal-messaġġi. Il-mudell JMS huwa orjentat ħafna lejn is-sensar, fejn is-sensar huwa responsabbli biex iqassam messaġġi u l-klijenti għandhom joqogħdu jinkwetaw biss dwar li jibagħtu u jirċievu messaġġi. Kafka, min-naħa l-oħra, huwa ċċentrat fuq il-klijent, bil-klijent jieħu ħafna mill-karatteristiċi ta 'sensar tradizzjonali, bħal distribuzzjoni ġusta ta' messaġġi rilevanti lill-konsumaturi, bi skambju għal sensar estremament veloċi u skalabbli. Għal nies li ħadmu b'sistemi ta' messaġġi tradizzjonali, il-ħidma ma' Kafka teħtieġ bidla fundamentali fil-moħħ.
Din id-direzzjoni ta 'inġinerija wasslet għall-ħolqien ta' infrastruttura ta 'messaġġi li kapaċi żżid it-throughput b'ħafna ordnijiet ta' kobor meta mqabbla ma 'sensar konvenzjonali. Kif se naraw, dan l-approċċ jiġi ma 'kompromessi, li jfisser li Kafka mhux adattat għal ċerti tipi ta' xogħol u softwer installat.

Mudell tad-Destinazzjoni Unifikata

Biex tissodisfa r-rekwiżiti deskritti hawn fuq, Kafka għaqqad messaġġi ta' pubblikazzjoni-abbonament u minn punt għal punt taħt tip wieħed ta' destinazzjoni - suġġett. Dan huwa konfuż għal nies li ħadmu ma 'sistemi ta' messaġġi, fejn il-kelma "suġġett" tirreferi għal mekkaniżmu ta 'xandir li minnu (mis-suġġett) il-qari ma jdumx. Is-suġġetti Kafka għandhom jitqiesu bħala tip ta' destinazzjoni ibrida, kif definit fl-introduzzjoni għal dan il-ktieb.

Għall-bqija ta' dan il-kapitolu, sakemm ma nistqarrux mod ieħor b'mod espliċitu, it-terminu "suġġett" jirreferi għal suġġett Kafka.

Biex nifhmu bis-sħiħ kif is-suġġetti jaġixxu u x'garanziji jipprovdu, l-ewwel irridu nħarsu lejn kif huma implimentati f'Kafka.
Kull suġġett f'Kafka għandu l-ġurnal tiegħu stess.
Produtturi li jibagħtu messaġġi lil Kafka jiktbu f'dan ir-reġistru, u l-konsumaturi jaqraw mir-reġistru billi jużaw pointers li kontinwament jimxu 'l quddiem. Perjodikament, Kafka iħassar l-eqdem partijiet tar-reġistru, kemm jekk il-messaġġi f'dawk il-partijiet ikunu nqraw jew le. Parti ċentrali tad-disinn ta 'Kafka hija li s-sensar ma jimpurtax jekk il-messaġġi jinqrawx jew le - dik hija r-responsabbiltà tal-klijent.

It-termini "log" u "pointer" ma jidhrux fi Dokumentazzjoni Kafka. Dawn it-termini magħrufa sew jintużaw hawn biex jgħinu l-fehim.

Dan il-mudell huwa kompletament differenti minn ActiveMQ, fejn il-messaġġi mill-kjuwijiet kollha huma maħżuna fl-istess log, u s-sensar jimmarka l-messaġġi bħala mħassra wara li jkunu nqraw.
Ejja issa ħaffer ftit aktar fil-fond u nħarsu lejn il-log tas-suġġett f'aktar dettall.
Il-log Kafka jikkonsisti f'diversi diviżorji (Figura 3-1). Kafka jiggarantixxi ordni strett f'kull partizzjoni. Dan ifisser li messaġġi miktuba fil-partizzjoni f'ċerta ordni se jinqraw fl-istess ordni. Kull partizzjoni hija implimentata bħala rolling log file li fih subsett (sottosett) tal-messaġġi kollha mibgħuta lis-suġġett mill-produtturi tiegħu. Is-suġġett maħluq fih, awtomatikament, partizzjoni waħda. L-idea ta 'diviżorji hija l-idea ċentrali ta' Kafka għal skalar orizzontali.

Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 3. Kafka
Figura 3-1. Diviżorji Kafka

Meta produttur jibgħat messaġġ lil suġġett Kafka, jiddeċiedi għal liema partizzjoni jibgħat il-messaġġ. Se nħarsu lejn dan f'aktar dettall aktar tard.

Qari messaġġi

Il-klijent li jrid jaqra l-messaġġi jimmaniġġja pointer imsejjaħ imsejjaħ grupp tal-konsumaturi, li jindika offset messaġġi fil-partizzjoni. Offset hija pożizzjoni inkrementali li tibda minn 0 fil-bidu ta 'partizzjoni. Dan il-grupp tal-konsumaturi, referenzjat fl-API permezz tal-grupp_id definit mill-utent, jikkorrispondi għal konsumatur jew sistema loġika waħda.

Il-biċċa l-kbira tas-sistemi tal-messaġġi jaqraw id-dejta mid-destinazzjoni billi jużaw każijiet multipli u ħjut biex jipproċessaw messaġġi b'mod parallel. Għalhekk, normalment ikun hemm ħafna każijiet ta' konsumaturi li jaqsmu l-istess grupp ta' konsumaturi.

Il-problema tal-qari tista’ tiġi rappreżentata kif ġej:

  • Is-suġġett għandu diviżorji multipli
  • Gruppi multipli ta' konsumaturi jistgħu jużaw suġġett fl-istess ħin
  • Grupp ta' konsumaturi jista' jkollu diversi każijiet separati

Din hija problema ħafna għal ħafna mhux trivjali. Biex tifhem kif Kafka tittratta r-relazzjonijiet bejn gruppi ta’ konsumaturi, istanzi ta’ konsumaturi, u diviżorji, ejja nħarsu lejn serje ta’ xenarji ta’ qari progressivament aktar kumplessi.

Konsumaturi u gruppi tal-konsumaturi

Ejja nieħdu bħala punt tat-tluq suġġett b'partizzjoni waħda (Figura 3-2).

Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 3. Kafka
Figura 3-2. Il-konsumatur jaqra minn partizzjoni

Meta istanza tal-konsumatur tikkonnettja mal-group_id tagħha stess ma' dan is-suġġett, tiġi assenjata partizzjoni tal-qari u offset f'dik il-partizzjoni. Il-pożizzjoni ta 'dan l-offset hija kkonfigurata fil-klijent bħala pointer għall-pożizzjoni l-aktar reċenti (l-aktar messaġġ ġdid) jew l-aktar pożizzjoni bikrija (l-aktar messaġġ antik). Il-konsumatur jitlob (polls) messaġġi mis-suġġett, li jikkawża li jinqraw sekwenzjali mir-reġistru.
Il-pożizzjoni tal-offset hija regolarment kommessa lura lil Kafka u maħżuna bħala messaġġi f'suġġett intern _kumpens_tal-konsumatur. Il-messaġġi aqra għadhom ma jitħassrux, kuntrarjament għal sensar regolari, u l-klijent jista 'jiġbed lura l-offset biex jerġa' jipproċessa messaġġi li diġà rawhom.

Meta t-tieni konsumatur loġiku jgħaqqad billi juża group_id differenti, jiġġestixxi t-tieni pointer li huwa indipendenti mill-ewwel (Figura 3-3). Għalhekk, suġġett Kafka jaġixxi bħal kju fejn hemm konsumatur wieħed u bħal suġġett normali publish-subscribe (pub-sub) li konsumaturi multipli jabbonaw għalih, bil-benefiċċju miżjud li l-messaġġi kollha huma maħżuna u jistgħu jiġu pproċessati diversi drabi.

Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 3. Kafka
Figura 3-3. Żewġ konsumaturi fi gruppi ta' konsumaturi differenti jaqraw mill-istess partizzjoni

Konsumaturi fi grupp tal-konsumaturi

Meta istanza waħda tal-konsumatur taqra data minn partizzjoni, għandha kontroll sħiħ tal-pointer u tipproċessa messaġġi kif deskritt fit-taqsima preċedenti.
Jekk diversi każijiet ta' konsumaturi kienu konnessi mal-istess group_id ma' suġġett b'partizzjoni waħda, allura l-istanza li konnessa l-aħħar tingħata kontroll fuq il-pointer u minn dak il-mument se tirċievi l-messaġġi kollha (Figura 3-4).

Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 3. Kafka
Figura 3-4. Żewġ konsumaturi fl-istess grupp tal-konsumaturi jaqraw mill-istess partizzjoni

Dan il-mod ta 'proċessar, li fih in-numru ta' każijiet tal-konsumatur jaqbeż in-numru ta 'diviżorji, jista' jitqies bħala tip ta 'konsumatur esklussiv. Dan jista' jkun utli jekk ikollok bżonn ta' raggruppament "attiv-passiv" (jew "hot-sħun") tal-istanzi tal-konsumatur tiegħek, għalkemm it-tħaddim ta' konsumaturi multipli b'mod parallel ("attiv-attiv" jew "hot-hot") huwa ħafna aktar tipiku milli konsumaturi.Fi standby.

Din l-imġieba tad-distribuzzjoni tal-messaġġi deskritta hawn fuq tista 'tkun sorprendenti meta mqabbla ma' kif iġib ruħu kju JMS normali. F'dan il-mudell, il-messaġġi mibgħuta lill-kju se jitqassmu b'mod ugwali bejn iż-żewġ konsumaturi.

Ħafna drabi, meta noħolqu każijiet multipli ta 'konsumaturi, nagħmlu dan jew biex nipproċessaw messaġġi b'mod parallel, jew biex inżidu l-veloċità tal-qari, jew biex inżidu l-istabbiltà tal-proċess tal-qari. Peress li istanza waħda biss tal-konsumatur tista' jaqra d-dejta minn partizzjoni kull darba, dan kif jinkiseb f'Kafka?

Mod wieħed biex tagħmel dan huwa li tuża istanza waħda tal-konsumatur biex taqra l-messaġġi kollha u tgħaddihom lill-grupp tal-ħajt. Filwaqt li dan l-approċċ iżid it-throughput tal-ipproċessar, iżid il-kumplessità tal-loġika tal-konsumatur u ma jagħmel xejn biex iżid ir-robustezza tas-sistema tal-qari. Jekk kopja waħda tal-konsumatur tinżel minħabba nuqqas ta 'enerġija jew avveniment simili, allura t-tnaqqis jieqaf.

Il-mod kanoniku biex tissolva din il-problema f'Kafka huwa li tuża bОdiviżorji aktar.

Il-qsim

Il-ħitan huma l-mekkaniżmu ewlieni għall-parallelizzazzjoni tal-qari u l-iskala ta 'suġġett lil hinn mill-bandwidth ta' istanza ta 'sensar wieħed. Biex nifhmu aħjar dan, ejja nikkunsidraw sitwazzjoni fejn hemm suġġett b'żewġ diviżorji u konsumatur wieħed jissottoskrivi għal dan is-suġġett (Figura 3-5).

Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 3. Kafka
Figura 3-5. Konsumatur wieħed jaqra minn diviżorji multipli

F'dan ix-xenarju, il-konsumatur jingħata kontroll fuq il-pointers li jikkorrispondu mal-grupp_id tiegħu fiż-żewġ diviżorji u jibda jaqra messaġġi miż-żewġ diviżorji.
Meta konsumatur addizzjonali għall-istess group_id jiġi miżjud ma' dan is-suġġett, Kafka jerġa' jalloka waħda mill-ħitan mill-ewwel għat-tieni konsumatur. Wara dan, kull istanza tal-konsumatur se taqra minn partizzjoni waħda tas-suġġett (Figura 3-6).

Biex tiżgura li l-messaġġi jiġu pproċessati b'mod parallel f'20 ħajta, għandek bżonn mill-inqas 20 diviżorju. Jekk ikun hemm inqas diviżorji, titħalla b'konsumaturi li m'għandhom xejn x'jaħdmu, kif deskritt qabel fid-diskussjoni tal-konsumaturi esklussivi.

Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 3. Kafka
Figura 3-6. Żewġ konsumaturi fl-istess grupp tal-konsumaturi jaqraw minn diviżorji differenti

Din l-iskema tnaqqas ħafna l-kumplessità tas-sensar Kafka meta mqabbla mad-distribuzzjoni tal-messaġġi meħtieġa biex jinżamm il-kju JMS. Hawnhekk m'għandekx għalfejn tinkwieta dwar il-punti li ġejjin:

  • Liema konsumatur għandu jirċievi l-messaġġ li jmiss, ibbażat fuq l-allokazzjoni round-robin, il-kapaċità attwali tal-prefetch buffers, jew messaġġi preċedenti (bħal gruppi ta' messaġġi JMS).
  • Liema messaġġi jintbagħtu lil liema konsumaturi u jekk għandhomx jerġgħu jitwasslu f'każ ta' falliment.

Kull ma jrid jagħmel is-sensar Kafka hu li jgħaddi messaġġi sekwenzjali lill-konsumatur meta dan tal-aħħar jitlobhom.

Madankollu, ir-rekwiżiti għall-parallelizzazzjoni tal-qari tal-provi u r-ribagħtu mill-ġdid ta 'messaġġi falluti ma jmorrux - ir-responsabbiltà għalihom sempliċement tgħaddi mis-sensar lill-klijent. Dan ifisser li għandhom jitqiesu fil-kodiċi tiegħek.

Tibgħat messaġġi

Hija r-responsabbiltà tal-produttur ta' dak il-messaġġ li jiddeċiedi għal liema partizzjoni jibgħat messaġġ. Biex nifhmu l-mekkaniżmu li bih isir dan, l-ewwel irridu nikkunsidraw dak li qed nibgħatu eżattament.

Billi f'JMS nużaw struttura ta' messaġġ b'metadata (headers u proprjetajiet) u korp li fih it-tagħbija (tagħbija), f'Kafka il-messaġġ huwa par "key-value". It-tagħbija tal-messaġġ tintbagħat bħala valur. Iċ-ċavetta, min-naħa l-oħra, tintuża prinċipalment għall-qsim u għandu jkun fiha ċavetta speċifika tal-loġika tan-negozjubiex tpoġġi messaġġi relatati fl-istess partizzjoni.

Fil-Kapitolu 2, iddiskutejna x-xenarju tal-imħatri onlajn fejn l-avvenimenti relatati jeħtieġ li jiġu pproċessati sabiex minn konsumatur wieħed:

  1. Il-kont tal-utent huwa kkonfigurat.
  2. Il-flus jiġu kkreditati fil-kont.
  3. Issir imħatra li tirtira l-flus mill-kont.

Jekk kull avveniment huwa messaġġ mibgħut fuq suġġett, allura ċ-ċavetta naturali tkun l-ID tal-kont.
Meta jintbagħat messaġġ bl-użu tal-API tal-Produttur Kafka, dan jiġi mgħoddi għal funzjoni ta’ partizzjoni li, minħabba l-messaġġ u l-istat attwali tal-cluster Kafka, tagħti lura l-ID tal-partizzjoni li għaliha għandu jintbagħat il-messaġġ. Din il-karatteristika hija implimentata fil-Java permezz tal-interface Partitioner.

Din l-interface tidher bħal din:

interface Partitioner {
    int partition(String topic,
        Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
}

L-implimentazzjoni tal-Partitioner tuża l-algoritmu tal-hashing għal skopijiet ġenerali default fuq iċ-ċavetta biex tiddetermina l-partizzjoni, jew round-robin jekk ma tkun speċifikata l-ebda ċavetta. Dan il-valur default jaħdem tajjeb f'ħafna każijiet. Madankollu, fil-futur tkun trid tikteb tiegħek.

Tikteb l-istrateġija ta 'qsim tiegħek stess

Ejja nħarsu lejn eżempju fejn trid tibgħat metadata flimkien mat-tagħbija tal-messaġġ. It-tagħbija fl-eżempju tagħna hija struzzjoni biex tagħmel depożitu fil-kont tal-logħba. Istruzzjoni hija xi ħaġa li nixtiequ li nkunu ggarantiti li ma tiġix modifikata mat-trażmissjoni u rridu nkunu ċerti li biss sistema fdata upstream tista' tibda dik l-istruzzjoni. F'dan il-każ, is-sistemi li jibagħtu u li jirċievu jaqblu dwar l-użu ta 'firma biex jawtentika l-messaġġ.
F'JMS normali, aħna sempliċement niddefinixxu proprjetà "firma tal-messaġġ" u nżiduha mal-messaġġ. Madankollu, Kafka ma tagħtinax mekkaniżmu biex tgħaddi l-metadata, biss ċavetta u valur.

Peress li l-valur huwa payload ta 'trasferiment bankarju li l-integrità tagħha rridu nippreservaw, m'għandna l-ebda għażla ħlief li niddefinixxu l-istruttura tad-dejta li nużaw fiċ-ċavetta. Jekk nassumu li neħtieġu ID tal-kont għall-qsim, peress li l-messaġġi kollha relatati ma' kont iridu jiġu pproċessati fl-ordni, se noħorġu bl-istruttura JSON li ġejja:

{
  "signature": "541661622185851c248b41bf0cea7ad0",
  "accountId": "10007865234"
}

Minħabba li l-valur tal-firma se jvarja skont it-tagħbija, l-istrateġija tal-hashing default tal-interface tal-Partitioner ma tiġborx b'mod affidabbli messaġġi relatati. Għalhekk, ikollna bżonn niktbu l-istrateġija tagħna stess li se parse din iċ-ċavetta u jaqsam il-valur accountId.

Kafka jinkludi checksums biex jikxfu l-korruzzjoni ta 'messaġġi fil-maħżen u għandu sett sħiħ ta' karatteristiċi ta 'sigurtà. Anke hekk, xi drabi jidhru rekwiżiti speċifiċi għall-industrija, bħal dak ta 'hawn fuq.

L-istrateġija tal-qsim tal-utent għandha tiżgura li l-messaġġi kollha relatati jispiċċaw fl-istess partizzjoni. Filwaqt li dan jidher sempliċi, ir-rekwiżit jista 'jkun ikkumplikat mill-importanza li jiġu ordnati messaġġi relatati u kemm hu fiss in-numru ta' diviżorji f'suġġett.

In-numru ta 'diviżorji f'suġġett jista' jinbidel maż-żmien, peress li jistgħu jiżdiedu jekk it-traffiku jmur lil hinn mill-aspettattivi inizjali. Għalhekk, iċ-ċwievet tal-messaġġi jistgħu jiġu assoċjati mal-partizzjoni li oriġinarjament intbagħtu għaliha, li jimplika biċċa stat li għandha tinqasam bejn l-istanzi tal-produtturi.

Fattur ieħor li għandek tikkonsidra hija d-distribuzzjoni uniformi tal-messaġġi fuq il-ħitan. Tipikament, iċ-ċwievet ma jitqassmux b'mod ugwali bejn il-messaġġi, u l-funzjonijiet tal-hash ma jiggarantixxux distribuzzjoni ġusta tal-messaġġi għal sett żgħir ta 'ċwievet.
Huwa importanti li wieħed jinnota li madankollu tagħżel li taqsam il-messaġġi, is-separatur innifsu jista 'jkollu bżonn jerġa' jintuża.

Ikkunsidra r-rekwiżit li tiġi replikata d-dejta bejn raggruppamenti Kafka f'postijiet ġeografiċi differenti. Għal dan il-għan, Kafka jiġi b'għodda tal-linja tal-kmand imsejħa MirrorMaker, li tintuża biex taqra messaġġi minn cluster wieħed u tittrasferihom għal ieħor.

MirrorMaker għandu jifhem iċ-ċwievet tas-suġġett replikat sabiex iżomm ordni relattiva bejn il-messaġġi meta jirreplika bejn clusters, peress li n-numru ta 'diviżorji għal dak is-suġġett jista' ma jkunx l-istess f'żewġ clusters.

L-istrateġiji ta 'qsim personalizzati huma relattivament rari, peress li l-hashing default jew ir-round robin jaħdem tajjeb fil-biċċa l-kbira tax-xenarji. Madankollu, jekk teħtieġ garanziji b'saħħithom tal-ordni jew għandek bżonn tiġbed il-metadejta minn payloads, allura l-qsim huwa xi ħaġa li għandek tagħti ħarsa aktar mill-qrib lejn.

L-iskalabbiltà u l-benefiċċji tal-prestazzjoni ta 'Kafka ġejjin minn ċaqliq ta' wħud mir-responsabbiltajiet tas-sensar tradizzjonali lill-klijent. F'dan il-każ, tittieħed deċiżjoni biex jitqassmu messaġġi potenzjalment relatati fost diversi konsumaturi li jaħdmu b'mod parallel.

Is-sensara JMS jeħtieġ ukoll li jittrattaw ma 'dawn ir-rekwiżiti. Interessanti, il-mekkaniżmu biex jintbagħtu messaġġi relatati lill-istess konsumatur, implimentat permezz ta 'Gruppi ta' Messaġġi JMS (varjazzjoni fuq l-istrateġija tal-ibbilanċjar tat-tagħbija li twaħħal (SLB)), jeħtieġ ukoll li l-mittent jimmarka l-messaġġi bħala relatati. Fil-każ ta 'JMS, is-sensar huwa responsabbli biex jibgħat dan il-grupp ta' messaġġi relatati lil konsumatur wieħed minn ħafna, u jittrasferixxi s-sjieda tal-grupp jekk il-konsumatur jaqa '.

Ftehim tal-Produttur

Il-qsim mhuwiex l-unika ħaġa li għandek tikkonsidra meta tibgħat messaġġi. Ejja nagħtu ħarsa lejn il-metodi send() tal-klassi Producer fl-API Java:

Future < RecordMetadata > send(ProducerRecord < K, V > record);
Future < RecordMetadata > send(ProducerRecord < K, V > record, Callback callback);

Għandu jiġi nnutat immedjatament li ż-żewġ metodi jirritornaw il-Futur, li jindika li l-operazzjoni tibgħat ma titwettaqx immedjatament. Ir-riżultat huwa li messaġġ (ProducerRecord) jinkiteb fil-buffer tal-ibgħat għal kull partizzjoni attiva u jintbagħat lis-sensar bħala ħajt ta 'sfond fil-librerija tal-klijenti Kafka. Filwaqt li dan jagħmel l-affarijiet oerhört veloċi, dan ifisser li applikazzjoni mingħajr esperjenza tista 'titlef messaġġi jekk il-proċess tagħha jitwaqqaf.

Bħal dejjem, hemm mod kif l-operazzjoni tal-bgħit tkun aktar affidabbli għad-detriment tal-prestazzjoni. Id-daqs ta 'dan il-buffer jista' jiġi ssettjat għal 0, u l-ħajt tal-applikazzjoni li jibgħat ikun sfurzat jistenna sakemm jitlesta t-trasferiment tal-messaġġ lis-sensar, kif ġej:

RecordMetadata metadata = producer.send(record).get();

Aktar dwar il-qari tal-messaġġi

Il-qari tal-messaġġi għandu kumplessitajiet addizzjonali li jeħtieġ li jiġu spekulati dwarhom. B'differenza mill-API JMS, li tista 'tmexxi semmiegħa tal-messaġġ bi tweġiba għal messaġġ, il- Konsumatur Kafka jivvota biss. Ejja nagħtu ħarsa aktar mill-qrib lejn il-metodu poll()użat għal dan il-għan:

ConsumerRecords < K, V > poll(long timeout);

Il-valur tar-ritorn tal-metodu huwa struttura ta 'kontenitur li fiha oġġetti multipli rekord tal-konsumatur minn potenzjalment diversi diviżorji. rekord tal-konsumatur huwa nnifsu huwa oġġett detentur għal par ta' valur-ċavetta b'metadejta assoċjata, bħall-partizzjoni li minnha hija derivata.

Kif diskuss f'Kapitolu 2, irridu nżommu f'moħħna x'jiġri mill-messaġġi wara li jkunu ġew ipproċessati b'suċċess jew mingħajr suċċess, pereżempju, jekk il-klijent ma jkunx jista' jipproċessa l-messaġġ jew jekk jabortix. F'JMS, dan ġie mmaniġġjat permezz ta' mod ta' rikonoxximent. Is-sensar jew iħassar il-messaġġ ipproċessat b'suċċess, jew jerġa' jagħti l-messaġġ mhux ipproċessat jew falz (jekk wieħed jassumi li ntużaw transazzjonijiet).
Kafka jaħdem b'mod differenti ħafna. Il-messaġġi ma jitħassrux fis-sensar wara l-qari tal-provi, u dak li jiġri f'każ ta 'falliment huwa r-responsabbiltà tal-kodiċi tal-qari tal-provi innifsu.

Kif għidna, il-grupp tal-konsumatur huwa assoċjat mal-offset fil-ġurnal. Il-pożizzjoni ta' log assoċjata ma' dan l-offset tikkorrispondi mal-messaġġ li jmiss li għandu jinħareġ bi tweġiba għalih poll(). Il-punt fiż-żmien meta dan l-offset jiżdied huwa deċiżiv għall-qari.

Nirritornaw għall-mudell tal-qari diskuss qabel, l-ipproċessar tal-messaġġi jikkonsisti fi tliet stadji:

  1. Irkupra messaġġ għall-qari.
  2. Ipproċessa l-messaġġ.
  3. Ikkonferma l-messaġġ.

Il-konsumatur Kafka jiġi b'għażla ta 'konfigurazzjoni enable.auto.commit. Dan huwa setting default użat ta' spiss, kif huwa komuni ma' settings li fihom il-kelma "auto".

Qabel Kafka 0.10, klijent li juża din l-għażla kien jibgħat l-offset tal-aħħar messaġġ moqri fis-sejħa li jmiss poll() wara l-ipproċessar. Dan kien ifisser li kwalunkwe messaġġ li kien diġà nġibed jista' jiġi pproċessat mill-ġdid jekk il-klijent kien diġà pproċessahom iżda kien inqered bla mistenni qabel iċempel. poll(). Minħabba li s-sensar ma jżomm ebda stat dwar kemm-il darba messaġġ inqara, il-konsumatur li jmiss li jirkupra dak il-messaġġ ma jkun jaf li ġara xejn ħażin. Din l-imġieba kienet psewdo-transazzjonali. L-offset kien kommess biss jekk il-messaġġ kien ipproċessat b'suċċess, iżda jekk il-klijent aborta, is-sensar jerġa 'jibgħat l-istess messaġġ lil klijent ieħor. Din l-imġieba kienet konsistenti mal-garanzija tat-twassil tal-messaġġi "mill-inqas darba".

F'Kafka 0.10, il-kodiċi tal-klijent inbidel sabiex il-kommit jiġi attivat perjodikament mil-librerija tal-klijent, kif konfigurat auto.commit.interval.ms. Din l-imġieba tinsab xi mkien bejn il-modi JMS AUTO_ACKNOWLEDGE u DUPS_OK_ACKNOWLEDGE. Meta tuża l-awtocommit, il-messaġġi jistgħu jiġu kommessi irrispettivament minn jekk kinux fil-fatt ipproċessati - dan jista 'jiġri fil-każ ta' konsumatur bil-mod. Jekk konsumatur aborta, il-messaġġi jittellgħu mill-konsumatur li jmiss, li jibdew mill-pożizzjoni impenjata, li jista' jirriżulta f'messaġġ mitluf. F'dan il-każ, Kafka ma tilifx il-messaġġi, il-kodiċi tal-qari sempliċement ma pproċessahomx.

Din il-modalità għandha l-istess wegħda bħal fil-verżjoni 0.9: il-messaġġi jistgħu jiġu pproċessati, iżda jekk ifalli, il-kumpens jista 'ma jkunx kommess, u potenzjalment jikkawża li l-kunsinna tiġi rduppjata. Aktar ma ġġib messaġġi meta tesegwixxi poll(), aktar din il-problema.

Kif diskuss f'“Qari ta' Messaġġi minn Kju” f'paġna 21, m'hemm l-ebda ħaġa bħal twassil ta' darba ta' messaġġ f'sistema ta' messaġġi meta jitqiesu l-modi ta' falliment.

F'Kafka, hemm żewġ modi kif tikkommetti (timmetta) kumpens (offset): awtomatikament u manwalment. Fiż-żewġ każijiet, il-messaġġi jistgħu jiġu pproċessati diversi drabi jekk il-messaġġ kien ipproċessat iżda falla qabel l-impenn. Tista 'wkoll tagħżel li ma tipproċessax il-messaġġ xejn jekk l-impenn seħħ fl-isfond u l-kodiċi tiegħek tlesta qabel ma seta' jiġi pproċessat (forsi f'Kafka 0.9 u aktar kmieni).

Tista 'tikkontrolla l-proċess manwali ta' impenn tal-offset fl-API tal-konsumatur Kafka billi tistabbilixxi l-parametru enable.auto.commit li ssejjaħ falz u espliċitament wieħed mill-metodi li ġejjin:

void commitSync();
void commitAsync();

Jekk trid tipproċessa l-messaġġ "mill-inqas darba", trid tikkommetti l-offset manwalment bi commitSync()billi tesegwixxi dan il-kmand immedjatament wara l-ipproċessar tal-messaġġi.

Dawn il-metodi ma jippermettux li l-messaġġi jiġu rikonoxxuti qabel ma jiġu pproċessati, iżda ma jagħmlu xejn biex jeliminaw dewmien potenzjali fl-ipproċessar filwaqt li jagħtu d-dehra li huma transazzjonali. M'hemm l-ebda transazzjoni f'Kafka. Il-klijent m'għandux il-kapaċità li jagħmel dan li ġej:

  • Awtomatikament roll back messaġġ iffalsifikat. Il-konsumaturi nfushom għandhom jimmaniġġjaw eċċezzjonijiet li jirriżultaw minn payloads problematiċi u qtugħ ta 'backend, peress li ma jistgħux jiddependu fuq is-sensar biex jerġa' jagħti l-messaġġi.
  • Ibgħat messaġġi lil diversi suġġetti f'operazzjoni atomika waħda. Kif se naraw dalwaqt, il-kontroll fuq suġġetti u diviżorji differenti jistgħu jirrisjedu fuq magni differenti fil-cluster Kafka li ma jikkoordinawx transazzjonijiet meta jintbagħtu. Fiż-żmien li nkiteb dan, sar xi xogħol biex dan ikun possibbli bil-KIP-98.
  • Assoċja l-qari ta 'messaġġ wieħed minn suġġett wieħed ma' jibgħat messaġġ ieħor għal suġġett ieħor. Għal darb'oħra, l-arkitettura ta' Kafka tiddependi fuq ħafna magni indipendenti li jaħdmu bħala xarabank waħda u ma jsir l-ebda tentattiv biex jinħbew dan. Pereżempju, m'hemm l-ebda komponenti API li jippermettulek torbot konsumatur и Produttur fi tranżazzjoni. F'JMS, dan huwa pprovdut mill-oġġett sessjonili minnhom huma maħluqa MessageProducers и MessageConsumers.

Jekk ma nistgħux niddependu fuq it-tranżazzjonijiet, kif nistgħu nipprovdu semantika eqreb għal dawk ipprovduti minn sistemi ta 'messaġġi tradizzjonali?

Jekk ikun hemm possibbiltà li l-offset tal-konsumatur jista 'jiżdied qabel ma l-messaġġ ikun ġie pproċessat, bħal waqt ħabta tal-konsumatur, allura l-konsumatur ma jkollu ebda mod li jkun jaf jekk il-grupp tal-konsumaturi tiegħu tilefx il-messaġġ meta jiġi assenjat partizzjoni. Allura strateġija waħda hija li tirrewind l-offset għall-pożizzjoni preċedenti. L-API tal-konsumatur Kafka tipprovdi l-metodi li ġejjin għal dan:

void seek(TopicPartition partition, long offset);
void seekToBeginning(Collection < TopicPartition > partitions);

Metodu ifittex () jistgħu jintużaw mal-metodu
offsetsForTimes(Mappa timestampsToSearch) li tirrewind għal stat f'xi punt speċifiku fil-passat.

Impliċitament, l-użu ta' dan l-approċċ ifisser li huwa probabbli ħafna li xi messaġġi li kienu pproċessati qabel jerġgħu jinqraw u jerġgħu jiġu pproċessati. Biex nevitaw dan, nistgħu nużaw il-qari idempotent, kif deskritt fil-Kapitolu 4, biex inżommu rekord tal-messaġġi li ħarġu qabel u neliminaw id-duplikati.

Inkella, il-kodiċi tal-konsumatur tiegħek jista' jinżamm sempliċi, sakemm it-telf jew id-duplikazzjoni tal-messaġġi jkunu aċċettabbli. Meta nikkunsidraw każijiet ta 'użu li għalihom Kafka jintuża komunement, bħall-immaniġġjar ta' avvenimenti ta 'log, metriċi, traċċar tal-ikklikkja, eċċ., Nifhmu li t-telf ta' messaġġi individwali x'aktarx li ma jkollux impatt sinifikanti fuq l-applikazzjonijiet tal-madwar. F'każijiet bħal dawn, il-valuri awtomatiċi huma perfettament aċċettabbli. Min-naħa l-oħra, jekk l-applikazzjoni tiegħek teħtieġ li tibgħat ħlasijiet, trid tieħu ħsieb kull messaġġ individwali bir-reqqa. Kollox niżel għall-kuntest.

Osservazzjonijiet personali juru li hekk kif tiżdied l-intensità tal-messaġġi, il-valur ta’ kull messaġġ individwali jonqos. Messaġġi kbar għandhom tendenza li jkunu ta' valur meta jitqiesu f'forma aggregata.

Disponibbiltà Għolja

L-approċċ ta' Kafka għal disponibbiltà għolja huwa differenti ħafna mill-approċċ ta' ActiveMQ. Kafka huwa ddisinjat madwar clusters ta' skala kbira fejn l-istanzi kollha ta' sensar jirċievu u jqassmu messaġġi fl-istess ħin.

Raggruppament Kafka jikkonsisti f'istanzi multipli ta' sensar li jaħdmu fuq servers differenti. Kafka kien iddisinjat biex jaħdem fuq ħardwer standalone ordinarju, fejn kull nodu għandu l-ħażna ddedikata tiegħu stess. L-użu ta 'ħażna mehmuża man-netwerk (SAN) mhuwiex rakkomandat minħabba li nodi ta' komputazzjoni multipli jistgħu jikkompetu għaż-żmien.Ыe intervalli ta 'ħażna u joħolqu kunflitti.

Kafka huwa dejjem mixgħula sistema. Ħafna utenti kbar ta' Kafka qatt ma jagħlqu l-clusters tagħhom u s-softwer dejjem jaġġorna b'ristartjar sekwenzjali. Dan jinkiseb billi tiġi ggarantita l-kompatibilità mal-verżjoni preċedenti għall-messaġġi u l-interazzjonijiet bejn is-sensara.

Sensara konnessi ma' cluster ta' servers ŻooKeeper, li jaġixxi bħala reġistru tad-dejta tal-konfigurazzjoni u jintuża biex jikkoordina r-rwoli ta 'kull sensar. ZooKeeper innifsu huwa sistema distribwita li tipprovdi disponibbiltà għolja permezz tar-replikazzjoni ta 'informazzjoni billi tistabbilixxi kworum.

Fil-każ bażi, tinħoloq suġġett fi cluster Kafka bil-proprjetajiet li ġejjin:

  • In-numru ta 'ħitan. Kif diskuss qabel, il-valur eżatt użat hawn jiddependi fuq il-livell mixtieq ta 'qari parallel.
  • Il-fattur ta' replikazzjoni (fattur) jiddetermina kemm istanzi ta' sensar fil-cluster għandu jkun fihom zkuk għal din il-partizzjoni.

Billi juża ZooKeepers għall-koordinazzjoni, Kafka jipprova jqassam b'mod ġust diviżorji ġodda fost is-sensara fil-cluster. Dan isir minn istanza waħda li taġixxi bħala Kontrollur.

Fl-runtime għal kull partizzjoni suġġett Kontrollur tassenja rwoli lil sensar Kap (mexxej, surmast, preżentatur) u segwaċi (segwaċi, skjavi, subordinati). Is-sensar, li jaġixxi bħala l-mexxej għal din il-partizzjoni, huwa responsabbli biex jirċievi l-messaġġi kollha mibgħuta lilha mill-produtturi u jqassam il-messaġġi lill-konsumaturi. Meta l-messaġġi jintbagħtu lil partizzjoni topika, huma replikati għan-nodi kollha tal-broker li jaġixxu bħala segwaċi għal dik il-partizzjoni. Kull nodu li fih zkuk għal partizzjoni jissejjaħ replika. Senar jista 'jaġixxi bħala mexxej għal xi diviżorji u bħala segwaċi għal oħrajn.

Segwaċi li jkun fih il-messaġġi kollha miżmuma mill-mexxej jissejjaħ replika sinkronizzata (replika li tkun fi stat sinkronizzat, replika in-sinkronizzata). Jekk sensar li jaġixxi bħala mexxej għal partizzjoni jinżel, kwalunkwe sensar li huwa aġġornat jew sinkronizzat għal dik il-partizzjoni jista 'jieħu f'idejh ir-rwol ta' mexxej. Huwa disinn oerhört sostenibbli.

Parti mill-konfigurazzjoni tal-produttur hija l-parametru acks, li jiddetermina kemm repliki għandhom jirrikonoxxu (jirrikonoxxu) irċevuta ta 'messaġġ qabel ma l-ħajt tal-applikazzjoni jkompli jibgħat: 0, 1, jew kollha. Jekk issettjat għal kollha, imbagħad meta jiġi riċevut messaġġ, il-mexxej jibgħat konferma lura lill-produttur hekk kif jirċievi konfermi (rikonoxximenti) tar-rekord minn diversi indikazzjonijiet (inkluż innifsu) definiti mill-issettjar tas-suġġett min.insync.repliki (default 1). Jekk il-messaġġ ma jistax jiġi replikat b'suċċess, allura l-produttur se jarmi eċċezzjoni għall-applikazzjoni (NotEnoughRepliks jew NotEnoughReplicasAfterAppend).

Konfigurazzjoni tipika toħloq suġġett b'fattur ta' replikazzjoni ta' 3 (mexxej 1, segwaċi 2 għal kull partizzjoni) u l-parametru min.insync.repliki huwa ssettjat għal 2. F'dan il-każ, il-cluster se jippermetti li wieħed mis-sensara li jimmaniġġja l-partizzjoni tas-suġġett jinżel mingħajr ma jaffettwa l-applikazzjonijiet tal-klijenti.

Dan iġibna lura għall-kompromess diġà familjari bejn il-prestazzjoni u l-affidabbiltà. Ir-replikazzjoni sseħħ għad-detriment ta' ħin ta' stennija addizzjonali għal konfermi (rikonoxximenti) mis-segwaċi. Għalkemm, minħabba li taħdem b'mod parallel, ir-replikazzjoni għal mill-inqas tliet nodi għandha l-istess prestazzjoni bħal tnejn (jinjora ż-żieda fl-użu tal-bandwidth tan-netwerk).

Billi juża din l-iskema ta 'replikazzjoni, Kafka b'mod għaqli jevita l-ħtieġa li jikteb fiżikament kull messaġġ fuq disk bl-operazzjoni sync(). Kull messaġġ mibgħut mill-produttur se jinkiteb fil-log tal-partizzjoni, iżda kif diskuss f'Kapitolu 2, il-kitba f'fajl issir inizjalment fil-buffer tas-sistema operattiva. Jekk dan il-messaġġ jiġi replikat għal istanza Kafka oħra u jkun fil-memorja tiegħu, it-telf tal-mexxej ma jfissirx li l-messaġġ innifsu kien mitluf - jista 'jittieħed minn replika sinkronizzata.
Rifjut li twettaq l-operazzjoni sync() ifisser li Kafka jista’ jirċievi messaġġi malajr kemm jista’ jiktebhom fil-memorja. Bil-maqlub, l-itwal inti tista 'tevita memorja fwawar fuq disk, l-aħjar. Għal din ir-raġuni, mhux rari li s-sensara Kafka jiġu allokati 64 GB jew aktar ta 'memorja. Dan l-użu tal-memorja jfisser li istanza waħda Kafka tista 'faċilment taħdem b'veloċitajiet ħafna eluf ta' darbiet aktar mgħaġġla minn sensar ta 'messaġġi tradizzjonali.

Kafka jista' wkoll jiġi kkonfigurat biex japplika l-operazzjoni sync() għal pakketti ta' messaġġi. Peress li kollox f'Kafka huwa orjentat lejn il-pakkett, fil-fatt jaħdem pjuttost tajjeb għal ħafna każijiet ta 'użu u huwa għodda utli għall-utenti li jeħtieġu garanziji b'saħħithom ħafna. Ħafna mill-prestazzjoni pura ta 'Kafka ġejja mill-messaġġi li jintbagħtu lis-sensar bħala pakketti u li dawn il-messaġġi jinqraw mis-sensar fi blokki sekwenzjali bl-użu. kopja żero operazzjonijiet (operazzjonijiet li matulhom il-kompitu tal-ikkupjar tad-dejta minn żona tal-memorja għal oħra ma jitwettaqx). Dan tal-aħħar huwa prestazzjoni kbira u gwadann tar-riżorsi u huwa possibbli biss permezz tal-użu ta 'struttura ta' dejta ta 'log sottostanti li tiddefinixxi l-iskema ta' partizzjoni.

Prestazzjoni ferm aħjar hija possibbli f'raggruppament Kafka milli b'sensar Kafka wieħed, minħabba li diviżorji tas-suġġett jistgħu jitkabbru f'ħafna magni separati.

Riżultati ta '

F'dan il-kapitolu, ħares lejn kif l-arkitettura Kafka terġa 'timmaġina r-relazzjoni bejn il-klijenti u s-sensara biex tipprovdi pipeline ta' messaġġi oerhört b'saħħtu, bi throughput ħafna drabi akbar minn dak ta 'sensar ta' messaġġi konvenzjonali. Iddiskutejna l-funzjonalità li tuża biex tikseb dan u ħares fil-qosor lejn l-arkitettura tal-applikazzjonijiet li jipprovdu din il-funzjonalità. Fil-kapitolu li jmiss, ser inħarsu lejn il-problemi komuni li l-applikazzjonijiet ibbażati fuq il-messaġġi jeħtieġu biex isolvu u jiddiskutu strateġiji biex jittrattawhom. Aħna ser nispiċċaw il-kapitolu billi niddeskrivu kif titkellem dwar it-teknoloġiji tal-messaġġi b'mod ġenerali sabiex tkun tista' tevalwa l-adegwatezza tagħhom għall-każijiet tal-użu tiegħek.

Parti tradotta preċedenti: Nifhmu s-sensara tal-messaġġi. Titgħallem il-mekkaniżmi tal-messaġġi b'ActiveMQ u Kafka. Kapitolu 1

Traduzzjoni magħmula: tele.gg/middle_java

Biex titkompla ...

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

Kafka jintuża fl-organizzazzjoni tiegħek?

  • Iva

  • Nru

  • Użat qabel, issa mhux

  • Nippjanaw li nużaw

Ivvutaw 38 utent. 8 utenti astjenew.

Sors: www.habr.com

Żid kumment