Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 3. Kafka

Kontinyasyon tradiksyon yon ti liv:
Konprann Message Brokers
otè: Jakub Korab, Piblikatè: O'Reilly Media, Inc., dat piblikasyon: Jen 2017, ISBN: 9781492049296.

Pati ki sot pase a tradui: Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 1 Entwodiksyon

CHAPIT 3

Kafka

Kafka te devlope nan LinkedIn pou kontourne kèk nan limit koutye mesaj tradisyonèl yo epi pou evite gen pou mete plizyè koutye mesaj pou diferan entèraksyon pwen-a-pwen, ki dekri nan liv sa a anba "Scaling up and out" nan paj 28. Ka itilize LinkedIn lajman konte sou yon sèl-fason enjèstyon trè gwo kantite done, tankou klike sou paj ak mòso bwa aksè, pandan y ap toujou pèmèt done sa yo dwe itilize pa plizyè sistèm san yo pa afekte pwodiktivite nan pwodiktè oswa lòt konsomatè yo. An reyalite, rezon ki fè Kafka egziste se jwenn kalite achitekti mesaj ke Universal Data Pipeline dekri.

Bay objektif final sa a, lòt kondisyon natirèlman leve. Kafka ta dwe:

  • Fè trè vit
  • Bay plis Pleasant lè w ap travay ak mesaj
  • Sipòte modèl Editè-Abònen ak Point-to-Point
  • Pa ralanti ak ajoute konsomatè yo. Pou egzanp, pèfòmans nan tou de keu la ak sijè a nan ActiveMQ degrade kòm kantite konsomatè sou destinasyon an ap grandi.
  • Fè orizontal évolutive; si yon koutye ki pèsiste mesaj kapab sèlman fè sa nan vitès maksimòm disk, Lè sa a, li gen sans ale pi lwen pase yon egzanp koutye sèl pou ogmante pèfòmans.
  • Limite aksè a sere ak re-rekipere mesaj yo

Pou reyalize tout bagay sa yo, Kafka te adopte yon achitekti ki redefini wòl ak responsablite kliyan yo ak koutye mesaj. Modèl JMS a trè oryante koutye, kote koutye a responsab pou distribye mesaj ak kliyan sèlman gen pou enkyete sou voye ak resevwa mesaj. Kafka, nan lòt men an, se kliyan-santre, ak kliyan an pran sou anpil nan karakteristik yo nan yon koutye tradisyonèl, tankou distribisyon jis nan mesaj ki enpòtan bay konsomatè yo, an echanj pou yon koutye trè vit ak évolutive. Pou moun ki te travay ak sistèm messagerie tradisyonèl yo, travay ak Kafka mande pou yon chanjman fondamantal nan lide.
Direksyon jeni sa a te mennen nan kreyasyon yon enfrastrikti messagerie ki kapab ogmante debi pa anpil lòd nan grandè konpare ak yon koutye konvansyonèl. Kòm nou pral wè, apwòch sa a vini ak konpwomi, ki vle di ke Kafka pa apwopriye pou sèten kalite chaj travay ak lojisyèl enstale.

Modèl Destinasyon Inifye

Pou satisfè kondisyon ki dekri pi wo a, Kafka te konbine piblikasyon-abònman ak mesaj pwen-a-pwen anba yon sèl kalite destinasyon - sijè. Sa a konfizyon pou moun ki te travay ak sistèm mesaj, kote mo "sijè" refere a yon mekanis emisyon ki soti nan ki (soti nan sijè a) lekti pa dirab. Sijè Kafka yo ta dwe konsidere kòm yon kalite destinasyon ibrid, jan sa defini nan entwodiksyon liv sa a.

Pou rès chapit sa a, sof si nou di klèman otreman, tèm "sijè" a pral refere a yon sijè Kafka.

Pou byen konprann ki jan sijè yo konpòte yo ak ki garanti yo bay, nou bezwen premye gade nan ki jan yo aplike nan Kafka.
Chak sijè nan Kafka gen pwòp boutèy demi lit.
Pwodiktè k ap voye mesaj bay Kafka ekri nan jounal sa a, epi konsomatè yo li nan jounal la lè l sèvi avèk endikasyon ki toujou ap avanse. Tanzantan, Kafka efase pati ki pi ansyen nan boutèy la, kit mesaj ki nan pati sa yo te li oswa ou pa. Yon pati santral nan konsepsyon Kafka a se ke koutye a pa pran swen si mesaj yo li oswa ou pa - sa a se responsablite kliyan an.

Tèm "log" ak "pointer" pa parèt nan Kafka dokiman. Tèm sa yo byen koni yo itilize isit la pou ede konpreyansyon.

Modèl sa a konplètman diferan de ActiveMQ, kote mesaj ki soti nan tout moun kap kriye yo estoke nan menm boutèy demi lit la, epi koutye a make mesaj yo kòm efase apre yo fin li yo.
Koulye a, ann fouye yon ti kras pi fon epi gade nan boutèy demi lit la sijè an plis detay.
Jounal Kafka a konsiste de plizyè patisyon (Figi 3-1). Kafka garanti lòd strik nan chak patisyon. Sa vle di mesaj ki ekri nan patisyon an nan yon sèten lòd yo pral li nan menm lòd la. Chak patisyon aplike kòm yon dosye woule ki gen ladann yon sou-ansanm (sou-ansanm) tout mesaj pwodiktè li yo voye bay sijè a. Sijè kreye a gen, pa default, yon patisyon. Lide a nan patisyon se lide santral la nan Kafka pou dekale orizontal.

Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 3. Kafka
Figi 3-1. Kafka Partitions

Lè yon pwodiktè voye yon mesaj nan yon sijè Kafka, li deside nan ki patisyon yo voye mesaj la. Nou pral gade sa a nan plis detay pita.

Lekti mesaj

Kliyan an ki vle li mesaj yo jere yon konsèy yo rele gwoup konsomatè, ki lonje dwèt sou konpanse mesaj nan patisyon an. Yon konpanse se yon pozisyon incrémentielle ki kòmanse nan 0 nan kòmansman yon patisyon. Gwoup konsomatè sa a, referans nan API a atravè group_id defini itilizatè a, koresponn ak yon sèl konsomatè lojik oswa sistèm.

Pifò sistèm messagerie li done ki soti nan destinasyon an lè l sèvi avèk plizyè ka ak fil pou trete mesaj an paralèl. Kidonk, anjeneral pral gen anpil sikonstans konsomatè ki pataje menm gwoup konsomatè a.

Pwoblèm nan lekti ka reprezante jan sa a:

  • Sijè a gen plizyè patisyon
  • Plizyè gwoup konsomatè yo ka itilize yon sijè an menm tan
  • Yon gwoup konsomatè ka gen plizyè ka separe

Sa a se yon pwoblèm ki pa trivial anpil-a-anpil. Pou konprann ki jan Kafka jere relasyon ant gwoup konsomatè yo, enstans konsomatè yo, ak patisyon yo, ann gade yon seri senaryo lekti ki pi konplike.

Konsomatè ak gwoup konsomatè yo

Ann pran kòm yon pwen depa yon sijè ki gen yon patisyon (Figi 3-2).

Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 3. Kafka
Figi 3-2. Konsomatè li nan patisyon

Lè yon egzanp konsomatè konekte ak pwòp group_id li nan sijè sa a, yo asiyen li yon patisyon li ak yon konpanse nan patisyon sa a. Pozisyon konpanse sa a se configurable nan kliyan an kòm yon pwent nan pozisyon ki pi resan (dernye mesaj) oswa pozisyon ki pi bonè (pi ansyen mesaj). Konsomatè a mande (biwo vòt) mesaj ki soti nan sijè a, sa ki lakòz yo dwe sekans li nan jounal la.
Se pozisyon konpanse a regilyèman komèt tounen nan Kafka epi estoke kòm mesaj nan yon sijè entèn _konsomatè_offsets. Li mesaj yo toujou pa efase, kontrèman ak yon koutye regilye, ak kliyan an ka remonte konpanse a re-pwosesis deja wè mesaj yo.

Lè yon dezyèm konsomatè lojik konekte lè l sèvi avèk yon group_id diferan, li jere yon dezyèm konsèy ki endepandan de premye a (Figi 3-3). Kidonk, yon sijè Kafka aji tankou yon keu kote gen yon sèl konsomatè epi tankou yon sijè nòmal pibliye-abònman (pub-sub) ke plizyè konsomatè abònman, ak benefis nan ajoute ke tout mesaj yo estoke epi yo ka trete plizyè fwa.

Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 3. Kafka
Figi 3-3. De konsomatè nan diferan gwoup konsomatè li nan menm patisyon an

Konsomatè nan yon gwoup konsomatè

Lè yon egzanp konsomatè li done ki sòti nan yon patisyon, li gen kontwòl total sou konsèy la epi trete mesaj jan sa dekri nan seksyon anvan an.
Si plizyè sikonstans konsomatè yo te konekte ak menm group_id la nan yon sijè ki gen yon patisyon, Lè sa a, egzanp ki konekte dènye a pral resevwa kontwòl sou konsèy la epi apati moman sa a li pral resevwa tout mesaj (Figi 3-4).

Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 3. Kafka
Figi 3-4. De konsomatè nan menm gwoup konsomatè li nan menm patisyon an

Mòd sa a nan pwosesis, nan ki kantite sikonstans konsomatè depase kantite patisyon, ka konsidere kòm yon kalite konsomatè eksklizif. Sa a ka itil si ou bezwen "aktif-pasif" (oswa "cho-cho") gwoupman nan ka konsomatè ou yo, byenke kouri plizyè konsomatè nan paralèl ("aktif-aktif" oswa "cho-cho") se pi plis tipik pase Konsomatè Nan sibstiti.

Konpòtman distribisyon mesaj sa a ki dekri pi wo a ka etone konpare ak fason yon keu JMS nòmal konpòte. Nan modèl sa a, mesaj yo voye nan keu la ap distribye respire ant de konsomatè yo.

Pi souvan, lè nou kreye plizyè egzanp nan konsomatè, nou fè sa swa pou trete mesaj an paralèl, oswa pou ogmante vitès lekti, oswa pou ogmante estabilite nan pwosesis lekti. Piske yon sèl egzanp konsomatè ka li done ki sòti nan yon patisyon alafwa, ki jan sa reyalize nan Kafka?

Youn nan fason yo fè sa se sèvi ak yon sèl egzanp konsomatè pou li tout mesaj yo epi pase yo nan pisin nan fil. Pandan ke apwòch sa a ogmante debi pwosesis, li ogmante konpleksite lojik konsomatè a epi li pa fè anyen pou ogmante solidite sistèm lekti a. Si yon kopi konsomatè a desann akòz yon echèk kouran oswa yon evènman menm jan an, Lè sa a, soustraksyon an sispann.

Fason kanonik pou rezoud pwoblèm sa a nan Kafka se sèvi ak bОplis patisyon.

Partitioning

Partisyon yo se mekanis prensipal la pou paralelize lekti ak dekale yon sijè pi lwen pase Pleasant a nan yon egzanp koutye sèl. Pou pi byen konprann sa a, ann konsidere yon sitiyasyon kote gen yon sijè ki gen de patisyon ak yon sèl konsomatè abònman nan sijè sa a (Figi 3-5).

Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 3. Kafka
Figi 3-5. Yon konsomatè li nan patisyon miltip

Nan senaryo sa a, yo bay konsomatè a kontwòl sou endikasyon ki koresponn ak group_id li yo nan tou de patisyon yo epi li kòmanse li mesaj ki soti nan tou de patisyon yo.
Lè yo ajoute yon konsomatè adisyonèl pou menm group_id la nan sijè sa a, Kafka realocate youn nan patisyon yo soti nan premye a nan dezyèm konsomatè a. Apre sa, chak egzanp nan konsomatè a pral li nan yon patisyon nan sijè a (Figi 3-6).

Pou asire ke mesaj yo trete an paralèl nan 20 fil, ou bezwen omwen 20 patisyon. Si gen mwens patisyon, ou pral rete ak konsomatè ki pa gen anyen pou travay sou, jan sa dekri pi bonè nan diskisyon an nan konsomatè eksklizif.

Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 3. Kafka
Figi 3-6. De konsomatè nan menm gwoup konsomatè li nan diferan patisyon

Konplo sa a anpil diminye konpleksite koutye Kafka a konpare ak distribisyon mesaj ki nesesè pou kenbe keu JMS la. Isit la ou pa bezwen enkyete sou pwen sa yo:

  • Ki konsomatè ta dwe resevwa pwochen mesaj la, ki baze sou alokasyon round-robin, kapasite aktyèl tanpon prefetch, oswa mesaj anvan yo (tankou gwoup mesaj JMS).
  • Ki mesaj yo voye bay ki konsomatè yo epi si yo ta dwe re-livre an ka ta gen echèk.

Tout sa koutye Kafka dwe fè se pase mesaj sekans bay konsomatè a lè lèt la mande yo.

Sepandan, kondisyon yo pou paralelize koreksyon an ak voye mesaj echwe pa ale - responsablite a pou yo tou senpleman pase soti nan koutye a nan kliyan an. Sa vle di ke yo dwe pran an kont nan kòd ou a.

Voye mesaj

Se responsablite pwodiktè mesaj sa a pou deside nan ki patisyon pou l voye yon mesaj. Pou konprann mekanis ki fè sa a, premye bezwen konsidere ki sa egzakteman nou aktyèlman voye.

Lè nou konsidere ke nan JMS nou itilize yon estrikti mesaj ak metadata (tèt ak pwopriyete) ak yon kò ki gen chaj la (chaj), nan Kafka mesaj la se pè "kle-valè". Se chaj mesaj la voye kòm yon valè. Kle a, nan lòt men an, se sitou itilize pou patisyon epi yo dwe genyen lojik biznis kle espesifikpou mete mesaj ki gen rapò nan menm patisyon an.

Nan Chapit 2, nou te diskite sou senaryo parayj sou entènèt kote evènman ki gen rapò yo bezwen trete nan lòd pa yon sèl konsomatè:

  1. Se kont itilizatè a configuré.
  2. Lajan yo kredite nan kont lan.
  3. Yo fè yon parye ki retire lajan nan kont lan.

Si chak evènman se yon mesaj ki afiche nan yon sijè, Lè sa a, kle natirèl la ta dwe ID kont lan.
Lè yo voye yon mesaj lè l sèvi avèk Kafka Producer API, li pase nan yon fonksyon patisyon ki, dapre mesaj la ak eta aktyèl gwoup Kafka a, retounen ID patisyon an kote yo ta dwe voye mesaj la. Karakteristik sa a aplike nan Java atravè koòdone Partitioner la.

Koòdone sa a sanble tankou sa a:

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

Enplemantasyon Partitioner la itilize algorithm hachaj pou objektif jeneral sou kle a pou detèmine patisyon an, oswa round-robin si pa gen okenn kle espesifye. Valè default sa a travay byen nan pifò ka yo. Sepandan, nan tan kap vini an ou pral vle ekri pwòp ou a.

Ekri pwòp estrateji partition ou

Ann gade nan yon egzanp kote ou vle voye metadata ansanm ak chaj mesaj la. Chaj la nan egzanp nou an se yon enstriksyon pou fè yon depo nan kont jwèt la. Yon ansèyman se yon bagay ke nou ta renmen ke nou garanti pou pa modifye sou transmisyon epi nou vle asire w ke se sèlman yon sistèm ki fè konfyans en ka kòmanse enstriksyon sa a. Nan ka sa a, sistèm voye ak resevwa yo dakò sou itilizasyon yon siyati pou otantifye mesaj la.
Nan JMS nòmal, nou tou senpleman defini yon pwopriyete "siyati mesaj" epi ajoute li nan mesaj la. Sepandan, Kafka pa bay nou yon mekanis pou pase metadata, sèlman yon kle ak yon valè.

Depi valè a se yon chaj transfè labank ki gen entegrite nou vle prezève, nou pa gen okenn chwa men yo defini estrikti nan done yo itilize nan kle a. Si nou sipoze ke nou bezwen yon ID kont pou patisyon, paske tout mesaj ki gen rapò ak yon kont yo dwe trete nan lòd, nou pral vini ak estrikti JSON sa a:

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

Paske valè siyati a pral varye selon chaj la, estrateji hachaj default nan koòdone Partitioner la pa pral gwoupe mesaj ki gen rapò ak konfyans. Se poutèt sa, nou pral bezwen ekri pwòp estrateji nou an ki pral analize kle sa a ak patisyon valè accountId la.

Kafka gen ladann chèk yo detekte koripsyon nan mesaj nan magazen an epi li gen yon seri konplè nan karakteristik sekirite. Menm si sa, kondisyon espesifik endistri yo, tankou sa ki anwo a, pafwa parèt.

Estrateji partition itilizatè a dwe asire ke tout mesaj ki gen rapò fini nan menm patisyon an. Pandan ke sa a sanble senp, kondisyon an ka konplike pa enpòtans ki genyen nan kòmande mesaj ki gen rapò ak ki jan fiks kantite patisyon nan yon sijè.

Nimewo a nan patisyon nan yon sijè ka chanje sou tan, kòm yo ka ajoute si trafik ale pi lwen pase atant inisyal yo. Kidonk, kle mesaj yo ka asosye ak patisyon yo te voye orijinèlman nan, sa ki vle di yon moso eta yo dwe pataje ant enstans pwodiktè yo.

Yon lòt faktè pou konsidere se menm distribisyon mesaj atravè partitions. Tipikman, kle yo pa distribye respire atravè mesaj, ak fonksyon hash pa garanti yon distribisyon jis nan mesaj pou yon ti seri kle.
Li enpòtan pou sonje ke nenpòt kòman ou chwazi pou separe mesaj, séparateur tèt li ka bezwen pou être réutiliser.

Konsidere egzijans pou repwodui done ant grap Kafka nan diferan kote jeyografik. Pou rezon sa a, Kafka vini ak yon zouti liy kòmand ki rele MirrorMaker, ki itilize pou li mesaj ki soti nan yon gwoup epi transfere yo nan yon lòt.

MirrorMaker dwe konprann kle sijè ki repwodwi a yon fason pou kenbe lòd relatif ant mesaj yo lè yo repwodui ant grap yo, paske kantite patisyon pou sijè sa a ka pa menm nan de gwoup.

Estrateji patisyon koutim yo relativman ra, kòm hashing default oswa round robin travay byen nan pifò senaryo. Sepandan, si ou bezwen gwo garanti lòd oswa ou bezwen ekstrè metadata soti nan chaj, Lè sa a, patisyon se yon bagay ou ta dwe pran yon gade pi pre.

Évolutivité ak benefis pèfòmans Kafka soti nan chanjman kèk nan responsablite koutye tradisyonèl la bay kliyan an. Nan ka sa a, yo pran yon desizyon pou distribye mesaj ki kapab gen rapò ak plizyè konsomatè k ap travay an paralèl.

Koutye JMS bezwen tou fè fas ak kondisyon sa yo. Enteresan, mekanis pou voye mesaj ki gen rapò bay menm konsomatè a, aplike atravè JMS Message Groups (yon varyasyon sou estrateji balanse chaj kolan (SLB)), mande tou moun k la pou make mesaj yo kòm ki gen rapò. Nan ka JMS, koutye a responsab pou voye gwoup sa a nan mesaj ki gen rapò ak yon sèl konsomatè pami anpil, epi transfere pwopriyetè gwoup la si konsomatè a tonbe.

Akò Pwodiktè yo

Partitioning se pa sèl bagay pou konsidere lè voye mesaj. Ann pran yon gade nan metòd send() nan klas Pwodiktè a nan API Java:

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

Li ta dwe imedyatman te note ke tou de metòd retounen Future, ki endike ke operasyon an voye pa fèt imedyatman. Rezilta a se ke yon mesaj (ProducerRecord) ekri nan tanpon an voye pou chak patisyon aktif epi li voye bay koutye a kòm yon fil background nan bibliyotèk kliyan Kafka. Pandan ke sa fè bagay yo ekstrèmman vit, sa vle di ke yon aplikasyon san eksperyans ka pèdi mesaj si pwosesis li yo sispann.

Kòm toujou, gen yon fason pou fè operasyon an voye pi serye nan depans lan nan pèfòmans. Gwosè tanpon sa a ka mete sou 0, epi yo pral fòse fil aplikasyon an voye pou tann jiskaske transfè mesaj la bay koutye a fini, jan sa a:

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

Plis sou lekti mesaj yo

Lekti mesaj yo gen plis konpleksite ki bezwen espekile sou. Kontrèman ak JMS API a, ki ka kouri yon moun k ap koute mesaj an repons a yon mesaj, la Konsomatè Kafka sèlman biwo vòt. Ann pran yon gade pi pre nan metòd la sondaj ()itilize pou objektif sa a:

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

Valè retounen nan metòd la se yon estrikti veso ki gen plizyè objè dosye konsomatè soti nan potansyèlman plizyè patisyon. dosye konsomatè se tèt li yon objè detantè pou yon pè kle-valè ak metadata ki asosye, tankou patisyon an kote li sòti.

Jan nou diskite nan Chapit 2, nou dwe sonje sa k ap pase mesaj yo apre yo fin trete yo avèk siksè oswa san siksè, pou egzanp, si kliyan an pa kapab trete mesaj la oswa si li avòte. Nan JMS, sa a te okipe atravè yon mòd rekonesans. Koutye a pral swa efase mesaj la avèk siksè trete, oswa re-delivre mesaj la anvan tout koreksyon oswa fo (asepte tranzaksyon yo te itilize).
Kafka travay yon fason trè diferan. Mesaj yo pa efase nan koutye a apre koreksyon, ak sa k ap pase sou echèk se responsablite nan kòd la koreksyon tèt li.

Kòm nou te di, gwoup la konsomatè asosye ak konpanse a nan boutèy la. Pozisyon boutèy demi lit ki asosye ak konpansasyon sa a koresponn ak pwochen mesaj ki pral bay an repons a sondaj (). Pwen nan tan lè konpanse sa a ogmante se desizif pou lekti.

Retounen nan modèl lekti yo te diskite pi bonè, pwosesis mesaj konsiste de twa etap:

  1. Rekipere yon mesaj pou li.
  2. Pwosesis mesaj la.
  3. Konfime mesaj.

Konsomatè Kafka a vini ak yon opsyon konfigirasyon enable.auto.commit. Sa a se yon paramèt default yo itilize souvan, menm jan ak anviwònman ki gen mo "oto".

Anvan Kafka 0.10, yon kliyan ki itilize opsyon sa a ta voye konpanse nan dènye mesaj li sou pwochen apèl la. sondaj () apre pwosesis. Sa vle di ke nenpòt mesaj ki te deja chache yo ta ka retrete si kliyan an te deja trete yo men li te detwi san atann anvan yo rele. sondaj (). Depi koutye a pa kenbe okenn eta sou konbyen fwa yon mesaj te li, pwochen konsomatè a ki rekipere mesaj sa a pa pral konnen ke yon move bagay te rive. Konpòtman sa a te pseudo-tranzaksyon. Te konpanse a sèlman si mesaj la te trete avèk siksè, men si kliyan an avòte, koutye a ta voye menm mesaj la ankò bay yon lòt kliyan. Konpòtman sa a te konsistan avèk garanti livrezon mesaj la "omwen yon fwa".

Nan Kafka 0.10, kòd kliyan an te chanje pou ke komite a deklanche detanzantan pa bibliyotèk kliyan an, jan konfigirasyon. auto.commit.interval.ms. Konpòtman sa a se yon kote ant JMS AUTO_ACKNOWLEDGE ak DUPS_OK_ACKNOWLEDGE mòd. Lè w ap itilize autocommit, mesaj yo ka komèt kèlkeswa si yo te aktyèlman trete - sa ka rive nan ka yon konsomatè dousman. Si yon konsomatè te avòte, mesaj yo t ap chache pwochen konsomatè a, kòmanse nan pozisyon komèt la, sa ki ka lakòz yon mesaj rate. Nan ka sa a, Kafka pa t 'pèdi mesaj yo, kòd la lekti jis pa t' trete yo.

Mòd sa a gen menm pwomès ak nan vèsyon 0.9: mesaj yo ka trete, men si li echwe, konpanse a ka pa komèt, ki kapab lakòz livrezon yo dwe double. Plis mesaj ou jwenn lè w ap egzekite sondaj (), plis pwoblèm sa a.

Jan nou diskite nan “Li mesaj ki soti nan yon keu” nan paj 21, pa gen okenn bagay tankou yon sèl fwa livrezon yon mesaj nan yon sistèm mesaj lè yo pran an konsiderasyon mòd echèk.

Nan Kafka, gen de fason pou komèt (komèt) yon konpanse (konpayman): otomatikman ak manyèlman. Nan de ka yo, mesaj yo ka trete plizyè fwa si mesaj la te trete men echwe anvan komèt la. Ou ka chwazi tou pa trete mesaj la ditou si komèt la te rive nan background nan epi kòd ou a te konplete anvan li te kapab trete (petèt nan Kafka 0.9 ak pi bonè).

Ou ka kontwole pwosesis manyèl konpanse nan API konsomatè Kafka lè w mete paramèt la enable.auto.commit bay manti ak klèman rele youn nan metòd sa yo:

void commitSync();
void commitAsync();

Si ou vle trete mesaj la "omwen yon fwa", ou dwe komèt konpanse a manyèlman ak commitSync()pa egzekite lòd sa a imedyatman apre yo fin trete mesaj yo.

Metòd sa yo pa pèmèt mesaj yo dwe rekonèt anvan yo trete yo, men yo pa fè anyen pou elimine potansyèl reta nan pwosesis pandan y ap bay aparans nan tranzaksyon. Pa gen okenn tranzaksyon nan Kafka. Kliyan an pa gen kapasite pou fè bagay sa yo:

  • Otomatikman woule tounen yon mesaj fo. Konsomatè tèt yo dwe jere eksepsyon ki soti nan chaj pwoblem ak pann backend, paske yo pa ka konte sou koutye a pou re-delivre mesaj yo.
  • Voye mesaj pou plizyè sijè nan yon sèl operasyon atomik. Kòm nou pral wè yon ti tan, kontwòl sou sijè diferan ak patisyon ka abite sou machin diferan nan gwoup la Kafka ki pa kowòdone tranzaksyon lè yo voye yo. Nan moman sa a, gen kèk travay ki te fèt pou rann sa posib ak KIP-98 la.
  • Asosye lekti yon mesaj nan yon sijè ak voye yon lòt mesaj nan yon lòt sijè. Yon fwa ankò, achitekti Kafka depann de anpil machin endepandan k ap kouri tankou yon sèl otobis epi pa gen okenn tantativ pou kache sa. Pou egzanp, pa gen okenn eleman API ki ta pèmèt ou konekte konsomatè и Pwodiktè nan yon tranzaksyon. Nan JMS, objè a bay sa a Sesyonsoti nan ki yo kreye MessageProducers и MessageConsumers.

Si nou pa ka konte sou tranzaksyon yo, ki jan nou ka bay semantik pi pre sa yo bay nan sistèm mesaj tradisyonèl yo?

Si gen yon posibilite ke konpanse konsomatè a ka ogmante anvan mesaj la te trete, tankou pandan yon aksidan konsomatè, Lè sa a, konsomatè a pa gen okenn fason pou konnen si gwoup konsomatè li a rate mesaj la lè yo asiyen yon patisyon. Se konsa, yon estrateji se remonte konpanse a nan pozisyon anvan an. API konsomatè Kafka bay metòd sa yo pou sa:

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

Metòd chache () ka itilize ak metòd
offsetsForTimes(Kat timestampsToSearch) pou remonte nan yon eta nan kèk pwen espesifik nan tan lontan an.

Anplis, lè l sèvi avèk apwòch sa a vle di ke li trè posib ke kèk mesaj ki te deja trete yo pral li ak trete ankò. Pou evite sa, nou ka itilize lekti idempotan, jan sa dekri nan Chapit 4, pou kenbe tras mesaj yo te deja wè epi elimine doublons.

Altènativman, kòd konsomatè ou ka kenbe senp, osi lontan ke pèt mesaj oswa repetisyon akseptab. Lè nou konsidere ka sèvi ak Kafka yo souvan itilize, tankou jere evènman boutèy demi lit, mezi, swiv klike sou, elatriye, nou konprann ke pèt mesaj endividyèl yo pa gen anpil chans gen yon enpak enpòtan sou aplikasyon ki antoure. Nan ka sa yo, valè default yo parfe akseptab. Nan lòt men an, si aplikasyon w lan bezwen voye peman, ou dwe ak anpil atansyon pran swen chak mesaj endividyèl. Li tout vini desann nan kontèks.

Obsèvasyon pèsonèl yo montre ke kòm entansite a nan mesaj ogmante, valè a nan chak mesaj endividyèl diminye. Mesaj gwo yo gen tandans gen valè lè yo gade nan yon fòm total.

Segondè Disponibilite

Apwòch Kafka pou disponiblite segondè trè diferan de apwòch ActiveMQ la. Kafka fèt alantou grap echèl kote tout egzanp koutye resevwa epi distribye mesaj an menm tan.

Yon gwoup Kafka konsiste de plizyè sikonstans koutye kap kouri sou diferan sèvè. Kafka te fèt pou kouri sou pyès ki nan konpitè otonòm òdinè, kote chak ne gen pwòp depo devwe li yo. Itilizasyon depo ki atache rezo (SAN) pa rekòmande paske plizyè nœuds kalkile ka fè konpetisyon pou tan.Ыe entèval depo ak kreye konfli.

Kafka se toujou sou sistèm. Anpil itilizatè gwo Kafka pa janm fèmen gwoup yo ak lojisyèl an toujou mete ajou ak yon rekòmanse sekans. Sa a se reyalize pa garanti konpatibilite ak vèsyon anvan an pou mesaj ak entèraksyon ant koutye.

Koutye ki konekte nan yon gwoup sèvè ZooKeeper, ki aji kòm yon rejis done konfigirasyon epi ki itilize pou kowòdone wòl chak koutye. ZooKeeper tèt li se yon sistèm distribiye ki bay disponiblite segondè atravè replikasyon enfòmasyon pa etabli kowòm.

Nan ka debaz la, yo kreye yon sijè nan yon gwoup Kafka ak pwopriyete sa yo:

  • Kantite patisyon yo. Jan nou te diskite pi bonè, valè egzak yo itilize isit la depann de nivo vle lekti paralèl la.
  • Faktè replikasyon an (faktè) detèmine konbyen egzanp koutye nan gwoup la ta dwe genyen mòso bwa pou patisyon sa a.

Sèvi ak ZooKeepers pou kowòdinasyon, Kafka eseye distribye san patisyon nouvo patisyon nan mitan koutye yo nan gwoup la. Sa a se fè pa yon sèl egzanp ki aji kòm yon Kontwolè.

Nan ègzekutabl pou chak patisyon sijè Kontwolè bay wòl yon koutye lidè (lidè, mèt, prezantatè) ak disip yo (patizan, esklav, sibòdone). Koutye a, ki aji kòm lidè pou patisyon sa a, responsab pou resevwa tout mesaj pwodiktè yo voye ba li epi distribye mesaj yo bay konsomatè yo. Lè mesaj yo voye nan yon patisyon sijè, yo repwodui nan tout nœuds koutye ki aji kòm disip pou patisyon sa a. Yo rele chak ne ki gen mòso bwa pou yon patisyon kopi. Yon koutye ka aji kòm yon lidè pou kèk patisyon ak kòm yon disip pou lòt moun.

Yo rele yon disip ki gen tout mesaj lidè a kenbe kopi senkronize (yon kopi ki nan yon eta senkronize, kopi nan senkronize). Si yon koutye ki aji kòm yon lidè pou yon patisyon desann, nenpòt koutye ki ajou oswa senkronize pou patisyon sa a ka pran sou wòl lidè. Li se yon konsepsyon ekstrèmman dirab.

Pati nan konfigirasyon pwodiktè a se paramèt la acks, ki detèmine konbyen kopi dwe rekonèt (rekonèt) resevwa yon mesaj anvan fil aplikasyon an kontinye voye: 0, 1, oswa tout. Si mete sou tout, Lè sa a, lè yo resevwa yon mesaj, lidè a pral voye yon konfimasyon tounen bay pwodiktè a le pli vit ke li resevwa konfimasyon (rekonesans) nan dosye a soti nan plizyè siyal (ki gen ladan li menm) defini nan anviwònman sijè a. min.insync.replicas (default 1). Si mesaj la pa ka repwodui avèk siksè, Lè sa a, pwodiktè a pral voye yon eksepsyon aplikasyon (NotEnoughReplicas oswa NotEnoughReplicasAfterAppend).

Yon konfigirasyon tipik kreye yon sijè ak yon faktè replikasyon 3 (1 lidè, 2 disip pou chak patisyon) ak paramèt la. min.insync.replicas se mete nan 2. Nan ka sa a, gwoup la pral pèmèt youn nan koutye yo jere patisyon sijè a desann san yo pa afekte aplikasyon kliyan yo.

Sa a fè nou tounen nan komès deja abitye ant pèfòmans ak fyab. Replikasyon fèt nan depans pou plis tan ap tann pou konfimasyon (rekonesans) nan men disip yo. Malgre ke, paske li kouri nan paralèl, replikasyon nan omwen twa nœuds gen menm pèfòmans ak de (inyore ogmantasyon nan itilizasyon Pleasant rezo a).

Lè l sèvi avèk konplo replikasyon sa a, Kafka malen evite bezwen fizikman ekri chak mesaj sou disk ak operasyon an. senkronize (). Yo pral ekri chak mesaj pwodiktè a voye nan jounal patisyon an, men jan sa te diskite nan Chapit 2, ekri nan yon fichye okòmansman fèt nan tanpon sistèm operasyon an. Si mesaj sa a replike nan yon lòt egzanp Kafka epi li nan memwa li, pèt lidè a pa vle di ke mesaj la li menm te pèdi - li ka pran sou pa yon kopi senkronize.
Refize fè operasyon an senkronize () vle di ke Kafka ka resevwa mesaj osi vit ke li ka ekri yo nan memwa. Kontrèman, pi long la ou ka evite flòch memwa nan disk, pi bon an. Pou rezon sa a, li pa estraòdinè pou koutye Kafka yo resevwa 64 GB oswa plis nan memwa. Itilizasyon memwa sa a vle di yon sèl egzanp Kafka ka fasilman kouri ak yon vitès plizyè milye fwa pi vit pase yon koutye mesaj tradisyonèl.

Kafka kapab tou configuré pou aplike operasyon an senkronize () pou mesaj pakè. Depi tout bagay nan Kafka se pake-oryante, li aktyèlman travay byen byen pou anpil ka itilize epi li se yon zouti itil pou itilizatè ki bezwen garanti trè fò. Anpil nan pèfòmans pi bon kalite Kafka soti nan mesaj yo voye bay koutye a kòm pakè e ke mesaj sa yo yo li nan koutye a nan blòk sekans lè l sèvi avèk. zewo kopi operasyon (operasyon kote travay la nan kopye done ki soti nan yon zòn memwa nan yon lòt pa fèt). Lèt la se yon gwo pèfòmans ak benefis resous epi li posib sèlman atravè itilizasyon yon estrikti done boutèy demi lit ki kache ki defini konplo patisyon an.

Pi bon pèfòmans posib nan yon gwoup Kafka pase ak yon sèl koutye Kafka, paske patisyon sijè yo ka echèl sou plizyè machin separe.

Rezilta

Nan chapit sa a, nou te gade ki jan achitekti Kafka reimajine relasyon ki genyen ant kliyan ak koutye yo pou bay yon kanal mesaj enkwayab solid, ak debi anpil fwa pi gran pase sa yon koutye mesaj konvansyonèl yo. Nou te diskite sou fonksyonalite li itilize pou reyalize sa a epi nou te gade yon ti tan nan achitekti aplikasyon ki bay fonksyonalite sa a. Nan pwochen chapit la, nou pral gade pwoblèm komen aplikasyon ki baze sou mesaj bezwen rezoud epi diskite sou estrateji pou fè fas ak yo. Nou pral fini chapit la nan esplike ki jan yo pale sou teknoloji messagerie an jeneral pou ou ka evalye konvnab yo pou ka itilizasyon ou yo.

Pati ki sot pase a tradui: Konprann koutye mesaj. Aprann mekanik mesaj ak ActiveMQ ak Kafka. Chapit 1

Tradiksyon fè: tele.gg/middle_java

A kontinye…

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Èske Kafka itilize nan òganizasyon w la?

  • Да

  • Pa gen

  • Anvan yo itilize, kounye a pa

  • Nou planifye pou itilize

38 itilizatè yo te vote. 8 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè