Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 3. Kafka

Berdewamiya wergera pirtûkeke biçûk:
Fêmkirina Brokerên Peyamê
nivîskar: Jakub Korab, weşanxane: O'Reilly Media, Inc., dîroka weşanê: Hezîran 2017, ISBN: 9781492049296.

Beşa berê ya wergerandî: Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beş 1 Destpêk

BEŞA 3

Kafka

Kafka ji hêla LinkedIn ve hatî pêşve xistin da ku li dora hin sînorkirinên brokerên peyamên kevneşopî bigire û nehêle ku gelek brokerên peyamê ji bo danûstendinên cihêreng ên xal-bi-point saz bikin, ku di vê pirtûkê de di bin "Scaling up and out" li ser rûpela 28-an de tê vegotin. Bûyerên bikar bînin LinkedIn bi giranî xwe dispêre gihandina yekalî ya mîqdarên pir mezin ên daneyan, wek klîkkirina rûpelan û têketinên gihîştinê, di heman demê de hîn jî dihêle ku ew dane ji hêla pir pergalê ve were bikar anîn bêyî ku bandorê li hilberîneriya hilberîner an xerîdarên din bike. Di rastiyê de, sedema hebûna Kafka ev e ku ew celeb mîmariya peyamberdanê ya ku Boriya Daneyên Gerdûnî diyar dike bi dest bixe.

Ji ber vê armanca dawîn, pêdiviyên din bi xwezayî derketin. Kafka divê:

  • Zû zû zû be
  • Dema ku bi peyaman re dixebitin bêtir bandfireh peyda bikin
  • Modelên Publisher-Abonger û Point-to-Point piştgirî bikin
  • Bi zêdekirina xerîdaran re hêdî nebin. Mînakî, performansa hem dorê û hem jî mijarê di ActiveMQ de her ku diçe hejmara xerîdarên li ser meqsedê zêde dibe.
  • Bi horizontî berbelav bin; ger yek brokerek ku peyaman berdewam dike tenê bi leza herî zêde ya dîskê dikare wiya bike, wê hingê maqûl e ku meriv ji mînakek brokerek wêdetir derkeve da ku performansê zêde bike.
  • Gihîştina hilanîn û vegerandina peyaman sînordar bikin

Ji bo bidestxistina van hemûyan, Kafka mîmariyek pejirand ku rol û berpirsiyariyên xerîdar û brokerên peyamberê ji nû ve pênase kir. Modela JMS-ê pir brokerker e, ku broker ji belavkirina peyaman berpirsiyar e û xerîdar tenê neçar in ku ji şandin û wergirtina peyaman bitirsin. Kafka, ji hêla din ve, xerîdar-navendî ye, digel ku xerîdar gelek taybetmendiyên brokerek kevneşopî digire, wek mînak belavkirina dadperwerî ya peyamên têkildar ji xerîdaran re, di berdêla brokerek zehf bilez û berbelav. Ji bo kesên ku bi pergalên mesajên kevneşopî re xebitîne, xebata bi Kafka re guhertinek bingehîn hewce dike.
Vê rêwerziya endezyariyê rê li ber afirandina binesaziyek peyamberiyê vekiriye ku dikare li gorî brokerek kevneşopî bi gelek rêzikên mezinahiyê ve zêde bike. Wekî ku em ê bibînin, ev nêzîkatî bi danûstendinan re tê, ku tê vê wateyê ku Kafka ji bo hin celeb bargiraniyên kar û nermalava sazkirî ne maqûl e.

Modela Destûra Yekgirtî

Ji bo bicihanîna hewcedariyên ku li jor hatine destnîşan kirin, Kafka weşan-abonebûn û mesajên xal-bi-pûq di bin yek celeb meqsedekê de li hev kiriye - mijar. Ev ji bo kesên ku bi pergalên peyamberdanê re xebitîne tevlihev e, ku peyva "mijar" ji mekanîzmayek weşanê re vedibêje ku (ji mijarê) xwendin bêdawî ye. Mijarên Kafka divê wekî celebek cîhek hevberî were hesibandin, wekî ku di pêşgotina vê pirtûkê de hatî destnîşan kirin.

Ji bo mayî ya vê beşê, heya ku em bi eşkere tiştek din nebêjin, têgîna "mijar" dê behsa mijarek Kafka bike.

Ji bo ku em bi tevahî fêm bikin ka mijar çawa tevdigerin û çi garantî didin wan, divê em pêşî li kafkayê binêrin ka ew çawa têne bicîh kirin.
Her mijarek di Kafka de logek xwe heye.
Hilberînerên ku ji Kafka re mesajan dişînin ji vê têketinê re dinivîsin, û xerîdar jî bi nîşankerên ku bi berdewamî pêşde diçin ji têketinê dixwînin. Dem bi dem, Kafka beşên herî kevn ên têketinê jê dike, gelo peyamên wan beşan hatine xwendin an na. Beşek navendî ya sêwirana Kafka ev e ku broker ferq nake ka peyam têne xwendin an na - ev berpirsiyariya xerîdar e.

Peyvên "log" û "nîşander" tê de xuya nakin Belgekirina Kafka. Van termên naskirî li vir têne bikar anîn da ku alîkariya têgihiştinê bikin.

Ev model bi tevahî ji ActiveMQ cûda ye, ku peyamên ji hemî rêzan di heman têketinê de têne hilanîn, û broker piştî ku hatine xwendin peyaman wekî jêbirin nîşan dide.
Ka em niha hinekî kûr bikolin û bi hûrgulî li têketina mijarê binêrin.
Têketina Kafka ji çend beşan pêk tê (Jimar 3-1). Kafka di her dabeşkirinê de rêziknameya hişk garantî dike. Ev tê wê wateyê ku peyamên ku li dabeşkirinê bi rêzek diyar hatine nivîsandin dê bi heman rêzê bêne xwendin. Her dabeşkirin wekî pelek têketinê ya ku tê de tête bicîh kirin binkomek (binkoma) hemî peyamên ku ji hêla hilberînerên wê ve ji mijarê re hatine şandin. Mijara hatî afirandin, ji hêla xwerû, yek dabeşek heye. Fikra dabeşan ramana navendî ya Kafka ye ji bo pîvandina horizontal.

Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 3. Kafka
jimar 3-1. Parçeyên Kafka

Dema ku çêker peyamek ji mijarek Kafka re dişîne, ew biryar dide ku wê peyamê ji kîjan partiyê re bişîne. Em ê paşê bi berfirehî li vê binêrin.

Mesajên xwendin

Muwekîlê ku dixwaze peyaman bixwîne nîşanek bi navê ku jê re tê gotin birêve dibe koma xerîdaran, ku nîşan dide offset peyamên di dabeşkirinê de. Offset pozîsyonek zêde ye ku di destpêka dabeşkirinê de ji 0 dest pê dike. Ev koma xerîdar, ku di API-ê de bi navgîniya koma_id-ê-ya-karker ve hatî destnîşan kirin, têkildar e yek xerîdar an sîstemek mentiqî.

Piraniya pergalên mesajê daneyan ji cîhê xwe dixwînin ku bi karanîna gelek mînak û mijaran bikar tînin da ku peyaman bi paralelî bişopînin. Bi vî rengî, dê bi gelemperî gelek bûyerên xerîdar hebin ku heman koma xerîdar parve dikin.

Pirsgirêka xwendinê dikare bi vî rengî were destnîşan kirin:

  • Mijar gelek beş hene
  • Gelek komên xerîdar dikarin di heman demê de mijarek bikar bînin
  • Komek xerîdar dikare gelek mînakên cihêreng hebin

Ev pirsgirêkek pir-bi-gelek ne-pîvan e. Ji bo ku fêm bikin ka Kafka çawa têkiliyên di navbera komên xerîdar, nimûneyên xerîdar û dabeşan de digire dest, bila em li rêzek senaryoyên xwendinê yên ber bi pêşveçûyî yên tevlihevtir binêrin.

Serfkaran û komên xerîdar

Werin em wek xala destpêkê mijarek bi yek dabeşkirinê (Jimar 3-2).

Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 3. Kafka
jimar 3-2. Serfkaran ji dabeşkirinê dixwîne

Gava ku mînakek xerîdar bi koma_id-a xwe re bi vê mijarê ve girêdide, di wê partiyê de dabeşek xwendinê û veqetandinek tê destnîşankirin. Helwesta vê offsetê di xerîdar de wekî nîşana pozîsyona herî dawî (peyama herî nû) an pozîsyona herî zû (peyama herî kevn) tê mîheng kirin. Xerîdar ji mijarê peyaman (anpirsîn) daxwaz dike, ku dibe sedem ku ew bi rêzê ji têketinê werin xwendin.
Helwesta offset bi rêkûpêk vedigere Kafka û di mijarek hundurîn de wekî peyam têne hilanîn _serfkaran_offsets. Mesajên xwendinê hîn jî nayên jêbirin, berevajî brokerek birêkûpêk, û xerîdar dikare veguhezîne da ku peyamên ku jixwe hatine dîtin ji nû ve pêvajo bike.

Dema ku xerîdarek mentiqî ya duyemîn bi karanîna komek_id-ya cihê ve girêdide, ew nîşanek duyemîn ku ji ya yekem serbixwe ye birêve dibe (Jimar 3-3). Ji ber vê yekê, mijarek Kafka mîna dorê tevdigere ku tê de yek xerîdar heye û wekî mijarek normal weşan-abone (pub-sub) ku pir xerîdar jê re dibin abone, bi feydeya zêde ku hemî peyam têne hilanîn û dikarin gelek caran bêne hilanîn.

Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 3. Kafka
jimar 3-3. Du xerîdar di komên xerîdar ên cihêreng de ji heman dabeşkirinê dixwînin

Serfkaran di komek xerîdar de

Gava ku yek mînakek xerîdar daneyên ji dabeşek dixwîne, ew xwedan kontrola tam a nîşankerê ye û peyaman wekî ku di beşa berê de hatî destnîşan kirin pêvajoyê dike.
Ger çend mînakên xerîdar bi heman koma_id-ê ve bi mijarek bi yek dabeşkirinê ve hatine girêdan, wê hingê mînaka ku herî dawî hatî girêdan dê li ser nîşanderê were kontrol kirin û ji wê gavê û pê ve ew ê hemî peyaman bistîne (Jimar 3-4).

Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 3. Kafka
jimar 3-4. Du xerîdar di heman koma xerîdar de ji heman dabeşkirinê dixwînin

Ev awayê pêvajoyê, ku tê de hejmara nimûneyên xerîdar ji hejmara dabeşan derbas dibe, dikare wekî celebek xerîdarek taybetî were hesibandin. Heke hûn hewceyê komkirina "aktîf-pasîf" (an "germ-germ") ya nimûneyên xerîdar ên we hewce be, ev dikare bikêr be, her çend xebitandina pir xerîdar bi paralel ("çalak-aktîf" an "germ-germ") pir tîpîktir e ji serfkaran Di standby de.

Ev tevgera belavkirina peyamê ya ku li jor hatî destnîşan kirin dikare li gorî ku rêzek JMS-ya normal çawa tevdigere ecêbmayî be. Di vê modelê de, peyamên ku ji rêzê re têne şandin dê di navbera her du xerîdaran de wekhev bêne belav kirin.

Bi gelemperî, gava ku em gelek mînakên xerîdar diafirînin, em vê yekê dikin an ji bo ku peyaman bi paralelî pêvajoyê bikin, an ji bo zêdekirina leza xwendinê, an jî ji bo zêdekirina aramiya pêvajoya xwendinê. Ji ber ku tenê yek mînakek xerîdar dikare her carê daneyan ji dabeşek bixwîne, ev yek di Kafka de çawa tê bidestxistin?

Rêyek ji bo kirina vê yekê ev e ku meriv mînakek xerîdar bikar bîne da ku hemî peyaman bixwîne û wan bigihîne hewza mijarê. Digel ku ev nêzîkatiya pêvajoyê zêde dike, ew tevliheviya mantiqa xerîdar zêde dike û tiştek nake ku bihêzbûna pergala xwendinê zêde bike. Ger kopiyek xerîdar ji ber têkçûnek elektrîkê an bûyerek mîna wê dakeve, wê hingê jêbirin raweste.

Awayê kanonîk ji bo çareserkirina vê pirsgirêkê di Kafka de bikaranîna bОbêtir partîsiyonên.

Parvekirin

Dabeşkirin mekanîzmaya sereke ye ji bo paralelkirina xwendinê û pîvandina mijarekê ji derveyî bandfirehiya mînakek brokerek yekane. Ji bo ku em vê yekê baştir fêm bikin, werin em rewşek binirxînin ku mijarek bi du dabeşan heye û yek xerîdar aboneyê vê mijarê ye (Jimar 3-5).

Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 3. Kafka
jimar 3-5. Xerîdarek ji gelek dabeşan dixwîne

Di vê senaryoyê de, ji xerîdar re li ser nîşangirên ku bi koma_id-ê re têkildar in di her du beşan de kontrol tê dayîn û dest bi xwendina peyaman ji her du beşan dike.
Dema ku xerîdarek din ji bo heman group_id li vê mijarê were zêdekirin, Kafka yek ji dabeşan ji ya yekem vediguhezîne serfkarên duyemîn. Piştî wê, her mînakek xerîdar dê ji yek dabeşkirina mijarê bixwîne (Jimar 3-6).

Ji bo ku pê ewle bibin ku peyam di 20 mijaran de paralel têne hilanîn, hûn bi kêmî ve 20 dabeşan hewce ne. Ger kêm beş hebin, hûn ê bi xerîdarên ku tiştek li ser bixebitin tune bimînin, wekî ku berê di nîqaşa xerîdarên taybetî de hatî destnîşan kirin.

Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 3. Kafka
jimar 3-6. Du xerîdar di heman koma xerîdar de ji beşên cûda dixwînin

Ev nexşe tevliheviya brokera Kafka li gorî belavkirina peyamê ya ku ji bo domandina rêza JMS-ê hewce dike pir kêm dike. Li vir hûn ne hewce ne ku li ser xalên jêrîn xem bikin:

  • Kîjan xerîdar divê peyama paşîn werbigire, li ser bingeha veqetandina dor-robin, kapasîteya heyî ya tamponên pêşîn, an peyamên berê (wek komên peyamên JMS).
  • Kîjan peyam ji kîjan serfkaran re têne şandin û gelo di rewşek têkçûnê de divê ji nû ve werin radest kirin.

Tiştê ku divê brokerê Kafka bike ev e ku dema ku xerîdar wan daxwaz dike peyaman bi dû hev re derbas bike.

Lêbelê, hewcedariyên paralelkirina rastkirin û şandina peyamên têkçûyî naçin - berpirsiyariya wan tenê ji brokerê digihîje xerîdar. Ev tê vê wateyê ku divê ew di koda we de bêne hesibandin.

Şandina peyaman

Berpirsiyariya çêkerê wê peyamê ye ku biryarê bide ku ji kîjan dabeşkirinê re peyamek bişîne. Ji bo fêmkirina mekanîzmaya ku ev yek tê kirin, divê em pêşî bifikirin ka em bi rastî çi dişînin.

Dema ku di JMS-ê de em sazûmanek peyamê ya bi metadata (sernivîs û taybetmendî) û laşek ku bargiraniyê vedihewîne bikar tînin, di Kafka de peyam ev e. cotek "key-nirx". Barkirina peyamê wekî nirxek tê şandin. Ji hêla din ve, kilît bi gelemperî ji bo dabeşkirinê tê bikar anîn û divê hebe mifteya taybetî ya mantiqa karsaziyêda ku peyamên têkildar di heman dabeşkirinê de bixin.

Di Beşa 2 de, me senaryoya behîsa serhêl nîqaş kir ku divê bûyerên têkildar bi rêzê ji hêla xerîdarek yekane ve bêne pêvajo kirin:

  1. Hesabê bikarhêner hatiye mîheng kirin.
  2. Pere li ser hesab tê kirin.
  3. Behîsek tê kirin ku pere ji hesabê derdixe.

Ger her bûyer peyamek e ku ji mijarek re hatî şandin, wê hingê mifteya xwezayî dê nasnameya hesabê be.
Dema ku peyamek bi karanîna API-ya Kafka Producer tê şandin, ew ji fonksiyonek dabeşkirinê re tê derbas kirin, ku ji ber peyam û rewşa heyî ya koma Kafka, nasnameya dabeşkirina ku divê peyam jê re were şandin vedigerîne. Ev taybetmendî di Java-ê de bi navbeynkariya Partitioner-ê ve tête bicîh kirin.

Ev navber bi vî rengî xuya dike:

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

Pêkanîna Partitioner algorîtmaya haşkirina-armanca xwerû ya xwerû li ser mifteyê bikar tîne da ku dabeşkirinê diyar bike, an ger kilît neyê diyar kirin dor-robin bikar tîne. Ev nirxa xwerû di pir rewşan de baş dixebite. Lêbelê, di pêşerojê de hûn ê bixwazin xweya xwe binivîsin.

Stratejiya xweya dabeşkirinê dinivîsin

Ka em li mînakek binêrin ku hûn dixwazin metadata digel bargiraniya peyamê bişînin. Di mînaka me de bargiran rêwerzek e ku meriv li hesabê lîstikê depo bike. Telîmatek tiştek e ku em dixwazin were garantî kirin ku di veguheztinê de neyê guheztin û em dixwazin piştrast bin ku tenê pergalek pêbawer a jorîn dikare wê rêwerzê bide destpêkirin. Di vê rewşê de, pergalên şandin û wergirtinê li ser karanîna îmzeyek ji bo rastkirina peyamê li hev dikin.
Di JMS-ya normal de, em tenê taybetmendiyek "îmzaya peyamê" diyar dikin û wê li peyamê zêde dikin. Lê Kafka mekanîzmayeke derbaskirina metadatayê nade me, tenê kilît û nirxekê dide me.

Ji ber ku nirx bargiraniyek veguheztina bankê ye ku em dixwazin yekrêziya wê biparêzin, em neçar in ku strukturên daneyê diyar bikin ku di mifteyê de bikar bînin. Bihesibînin ku ji bo dabeşkirinê pêdivî bi nasnameya hesabek me heye, ji ber ku divê hemî peyamên ku bi hesabek ve girêdayî ne bi rêz werin hilanîn, em ê bi strukturên JSON-ê yên jêrîn derkevin:

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

Ji ber ku nirxa îmzeyê dê li gorî bargiraniyê diguhere, stratejiya hashkirina xwerû ya navbeynkariya Partitioner dê bi pêbawerî peyamên têkildar kom neke. Ji ber vê yekê, em ê hewce bikin ku stratejiya xwe binivîsin ku dê vê mifteyê parsek bike û nirxa accountId dabeş bike.

Kafka ji bo tesbîtkirina gendeliya mesajan di firotgehê de pişkên kontrolê vedihewîne û xwedan komek tevahî taybetmendiyên ewlehiyê ye. Tewra jî, hewcedariyên pîşesaziyê yên taybetî, wekî ya li jor, carinan xuya dikin.

Stratejiya dabeşkirina bikarhêner divê piştrast bike ku hemî peyamên têkildar di heman dabeşkirinê de biqedin. Digel ku ev hêsan xuya dike, pêdivî dikare ji hêla girîngiya fermankirina postên têkildar ve tevlihev bibe û hejmara dabeşan di mijarekê de çiqas rast e.

Hejmara dabeşan di mijarekê de dikare bi demê re biguhezîne, ji ber ku ger seyrûsefer ji hêviyên destpêkê derbas bibe ew dikarin werin zêdekirin. Bi vî rengî, bişkokên peyamê dikarin bi dabeşkirina ku ew bi eslê xwe jê re hatine şandin re têkildar bin, ku tê vê wateyê ku perçeyek dewletê ku di navbera mînakên hilberîner de were parve kirin.

Faktorek din a ku meriv li ber çavan bigire belavkirina hevûdu ya peyaman li ser dabeşan e. Bi gelemperî, bişkok di nav peyaman de bi rengek wekhev nayên belav kirin, û fonksiyonên hash ji bo komek piçûk a bişkojan dabeşkirina adil a peyaman garantî nakin.
Girîng e ku bala xwe bidinê ku her çend hûn hilbijêrin ku peyaman parve bikin, dibe ku veqetanker bixwe ji nû ve were bikar anîn.

Pêdiviya dubarekirina daneyan di navbera komên Kafka de li cihên cihê yên erdnîgarî binirxînin. Ji bo vê armancê, Kafka bi amûrek rêzika fermanê ya bi navê MirrorMaker ve tê, ku ji bo xwendina peyamên ji komekê û veguheztina wan bo koma din tê bikar anîn.

Pêdivî ye ku MirrorMaker kilîdên mijara dubarekirî fam bike da ku dema ku di navbera koman de dubare dibe rêza têkildar di navbera peyaman de biparêze, ji ber ku dibe ku hejmara dabeşên wê mijarê di du koman de ne yek be.

Stratejiyên dabeşkirina xwerû bi nisbeten kêm in, ji ber ku haşkirina xwerû an dor-robin di pir senaryoyan de baş dixebite. Lêbelê, heke hûn hewceyê garantiyên fermanê yên bihêz in an hewce ne ku metadata ji barkêşan derxînin, wê hingê dabeşkirin tiştek e ku divê hûn ji nêz ve lê mêze bikin.

Mezinbûn û feydeyên performansê yên Kafka ji guheztina hin berpirsiyariyên brokerê kevneşopî ber bi xerîdar ve tê. Di vê rewşê de, biryarek tê girtin ku peyamên têkildar ên potansiyel di nav çend xerîdarên ku paralel dixebitin de werin belavkirin.

Brokerên JMS jî hewce ne ku bi hewcedariyên weha re mijûl bibin. Balkêş e, mekanîzmaya şandina peyamên têkildar ji heman xerîdar re, ku bi navgîniya Grûpên Peyamên JMS-ê ve hatî bicîh kirin (guheztinek li ser stratejiya hevsengiya bargiraniyê (SLB)), di heman demê de ji şander hewce dike ku peyaman wekî têkildar nîşan bide. Di doza JMS de, broker berpirsiyar e ku vê koma peyamên têkildar bişîne yek xerîdar ji gelekan, û ger xerîdar ji holê rabe xwediyê komê veguhezîne.

Peymanên hilberîner

Dabeşkirin ne tenê tiştek e ku meriv dema şandina peyaman bifikire. Ka em li awayên send() yên çîna Producer di API-ya Java-yê de mêze bikin:

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

Pêdivî ye ku tavilê were zanîn ku her du rêbaz paşerojê vedigerînin, ku ev destnîşan dike ku operasyona şandinê tavilê nayê kirin. Encam ev e ku peyamek (ProducerRecord) ji bo her dabeşek çalak li tampona şandinê tê nivîsandin û di pirtûkxaneya muwekîlê Kafka de wekî paşnavê ji brokerê re tê şandin. Digel ku ev tiştan pir zû zû dike, ev tê vê wateyê ku ger pêvajoyek wê were sekinandin serîlêdanek bêtecrube dikare peyaman winda bike.

Mîna her gav, rêyek heye ku meriv operasyona şandinê li ser lêçûna performansê pêbawertir bike. Mezinahiya vê tamponê dikare wekî 0 were danîn, û mijara serîlêdana şandinê dê neçar bimîne ku li bendê bimîne heya ku veguheztina peyamê ji brokerê re biqede, wekî jêrîn:

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

Zêdetir li ser xwendina peyaman

Xwendina peyaman xwedan tevliheviyên din e ku hewce ne ku li ser bêne texmîn kirin. Berevajî API-ya JMS-ê, ku dikare di bersiva peyamekê de guhdarek peyamê bimeşîne, ya Serfkaran Kafka tenê anketan dike. Werin em ji nêz ve li rêbazê binêrin gelpisî()ji bo vê armancê tê bikaranîn:

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

Nirxa vegerê ya rêbazê avahiyek konteynerek e ku gelek tiştan vedihewîne qeyda xerîdar ji potansiyel çend beşan. qeyda xerîdar bi xwe ji bo cotek nirx-kilît bi metadata têkildar, wekî dabeşkirina ku jê hatî girtin, nesneyek xwedan e.

Wekî ku di Beşa 2-ê de hate nîqaş kirin, divê em ji bîr mekin ka piştî ku peyam bi serfirazî an neserkeftî hatine hilanîn çi diqewime, mînakî, heke xerîdar nikaribe peyamê bişopîne an jî betal bibe. Di JMS de, ev bi moda pejirandinê ve hate rêve kirin. Broker dê peyama ku bi serfirazî hatî hilanîn jêbibe, an jî peyama xav an sexte ji nû ve radest bike (bihesibînin ku danûstendin hatine bikar anîn).
Kafka pir cuda dixebite. Peyam piştî rastkirinê di brokerê de nayê jêbirin, û tiştê ku di têkçûnê de diqewime berpirsiyariya koda rastkirinê bixwe ye.

Wekî ku me got, koma xerîdar di têketinê de bi vekêşana ve girêdayî ye. Helwesta têketinê ya ku bi vê veqetandinê re têkildar e bi peyama paşîn re ku di bersivê de were weşandin re têkildar e gelpisî(). Demjimêra ku ev veqetandin zêde dibe ji bo xwendinê diyarker e.

Vegera modela xwendinê ya ku berê hatî nîqaş kirin, pêvajoya peyamê ji sê qonaxan pêk tê:

  1. Ji bo xwendinê peyamek bistînin.
  2. Pêvajoya peyamê.
  3. Peyama piştrast bikin.

Xerîdar Kafka bi vebijarkek veavakirinê tê enable.auto.commit. Ev mîhengek xwerû ya ku pir caran tê bikar anîn, wekî ku bi mîhengên ku peyva "oto" vedihewîne re hevpar e.

Beriya Kafka 0.10, xerîdarek ku vê vebijarkê bikar tîne dê guheztina peyama paşîn a ku di banga paşîn de hatî xwendin bişîne. gelpisî() piştî pêvajoyê. Ev tê vê wateyê ku her peyamên ku berê hatine girtin dikarin ji nû ve werin pêvajo kirin ger ku xerîdar berê wan pêvajo kiriba, lê berî ku bang bike ji nişka ve hate hilweşandin. gelpisî(). Ji ber ku broker di derbarê çend caran peyamek hatiye xwendin de dewletek nagire, xerîdarê din ku wê peyamê vedigire dê nizanibe ku tiştek xirab qewimî. Ev tevger pseudo-danûstandin bû. Ger ku peyam bi serfirazî were pêvajo kirin, veqetandin tenê pêk hat, lê heke xerîdar betal bibe, broker dê heman peyamê dîsa ji xerîdarek din re bişîne. Ev tevger bi garantiya radestkirina peyamê re hevaheng bû "qet nebe carekê".

Di Kafka 0.10-ê de, koda xerîdar hate guheztin da ku commit bi awayekî periyodîk ji hêla pirtûkxaneya muwekîlê ve, wekî ku hatî mîheng kirin, were destpêkirin. auto.commit.interval.ms. Ev tevger deverek di navbera modên JMS AUTO_ACKNOWLEDGE û DUPS_OK_ACKNOWLEDGE de ye. Dema ku otocommit bikar tînin, peyam dikarin bêne peywirdar kirin bêyî ku ew bi rastî hatine pêvajo kirin - ev dibe ku di doza xerîdarek hêdî de çêbibe. Ger xerîdar betal kir, dê peyam ji hêla xerîdarê din ve werin wergirtin, ji pozîsyona pabendbûnê dest pê bikin, ku dikare bibe sedema peyamek winda. Di vê rewşê de, Kafka peyam winda nekir, koda xwendinê tenê wan pêvajo nekir.

Ev mod xwedî heman sozê ye ku di guhertoya 0.9-ê de ye: peyam dikarin bêne pêvajo kirin, lê heke ew têk neçe, dibe ku guheztin neyê kirin, ku dibe sedema ku radestkirin ducar bibe. Di dema darvekirinê de bêtir peyamên ku hûn digirin gelpisî(), bêtir ev pirsgirêk.

Wekî ku di "Xwendina Peyamên ji Dorê" de li ser rûpela 21-ê hatî nîqaş kirin, di pergalek mesajê de tiştek wekî gihandina peyamek yekcar tune dema ku modên têkçûnê têne hesibandin.

Di Kafka de, du awayên pêkanîna (tepandin) veqetandinê (offset) hene: bixweber û bi destan. Di her du rewşan de, heke peyam hate pêvajo kirin lê berî ku were kirin têkçû, peyam dikarin gelek caran bêne pêvajo kirin. Di heman demê de hûn dikarin hilbijêrin ku peyamê bi tevahî neyê pêvajo kirin ger ku peywir di paşerojê de pêk hat û koda we berî ku were pêvajo kirin qediya (dibe ku di Kafka 0.9 û berê de).

Hûn dikarin di API-ya xerîdar a Kafka de bi danîna parametreyê ve prosesa komkirina destavêtinê kontrol bikin enable.auto.commit bangkirina derewîn û eşkere yek ji van awayên jêrîn:

void commitSync();
void commitAsync();

Heke hûn dixwazin peyama "qet nebe carekê" bişopînin, divê hûn bi desta veqetandinê bi dest bixin commitSync()bi cîbicîkirina vê fermanê tavilê piştî hilanîna peyaman.

Van rêbazan nahêlin ku peyam berî ku werin hilanîn bêne pejirandin, lê ew tiştek nakin ku derengiyên pêvajoyê yên potansiyel ji holê rakin dema ku xuyangkirina danûstendinê didin. Di Kafka de ti danûstendin tune. Kêmasiya xerîdar tune ku karên jêrîn bike:

  • Otomatîk peyamek sexte paşde vegerîne. Xerîdar bixwe pêdivî ye ku îstîsnayên ku ji ber bargiraniyên bi pirsgirêk û qutbûna paşverû derdikevin hildin, ji ber ku ew nikanin ji nû ve gihandina peyaman bi broker ve girêdayî bin.
  • Di yek operasyona atomê de ji gelek mijaran re peyaman bişînin. Wekî ku em ê di demek kurt de bibînin, kontrola li ser mijar û dabeşên cûda dikare li ser makîneyên cihêreng ên di koma Kafka de bimîne ku dema şandina danûstandinan hevrêz nakin. Di dema nivîsandina vê nivîsê de, hin xebat hatine kirin ku ev yek bi KIP-98-ê gengaz be.
  • Xwendina peyamek ji mijarek bi şandina peyamek din ji mijarek din re têkildar bikin. Dîsa, mîmariya Kafka bi gelek makîneyên serbixwe ve girêdayî ye ku wekî yek otobusê dixebitin û hewl nayê dayîn ku vê yekê veşêre. Mînakî, hêmanên API-ê tune ku destûrê bidin we ku hûn girêdin xerîdar и Çêker di danûstandinê de. Di JMS de, ev ji hêla objektê ve tê peyda kirin Rûniştinîku jê tên afirandin MessageProducers и MessageConsumers.

Ger em nikaribin xwe bispêrin danûstendinan, em çawa dikarin semantîkan nêzîkê yên ku ji hêla pergalên mesajên kevneşopî ve têne peyda kirin peyda bikin?

Ger îhtîmalek hebe ku guheztina xerîdar berî ku peyam were hilanîn zêde bibe, wek mînak di dema têkçûnek xerîdar de, wê gavê xerîdar çu rê tune ku bizanibe gelo koma xerîdar a wê peyamê winda kiriye dema ku jê re dabeşek tê veqetandin. Ji ber vê yekê yek stratejiyek ev e ku meriv veguhezîne pozîsyona berê. API-ya xerîdar a Kafka ji bo vê yekê rêbazên jêrîn peyda dike:

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

Rêbaz lêgerrîn() dikare bi rêbazê were bikar anîn
offsetsForTimes (Nexşe timestampsToSearch) ji nû ve vegere dewletek di xalek taybetî ya berê de.

Bi eşkere, karanîna vê nêzîkbûnê tê vê wateyê ku pir îhtîmal e ku hin peyamên ku berê hatine pêvajo kirin dê dîsa werin xwendin û pêvajo kirin. Ji bo ku em ji vê yekê dûr nekevin, em dikarin xwendina bêserûber bikar bînin, wekî ku di Beşa 4-ê de hatî destnîşan kirin, da ku peyamên ku berê hatine dîtin bişopînin û dubareyan ji holê rakin.

Wekî din, koda xerîdar a we dikare sade bimîne, heya ku windabûna peyamê an dubarekirin were pejirandin. Gava ku em li rewşên karanîna ku Kafka bi gelemperî tê bikar anîn, dinêrin, wek mînak birêvebirina bûyerên têketinê, metris, şopandina klîk, hwd., em pê dihesin ku windakirina peyamên kesane ne gengaz e ku bandorek girîng li ser sepanên derdorê bike. Di rewşên weha de, nirxên xwerû bi tevahî têne pejirandin. Ji hêla din ve, heke serîlêdana we pêdivî ye ku drav bişîne, divê hûn bi baldarî li ser her peyamek kesane bisekinin. Ew hemî di çarçovê de tê.

Çavdêriyên kesane destnîşan dikin ku her ku tundiya peyaman zêde dibe, nirxa her peyamek kesane kêm dibe. Peyamên mezin dema ku bi rengek hevgirtî têne dîtin hêja dibin.

Berdestbûna Bilind

Nêzîkatiya Kafka ya ji bo hebûna bilind ji nêzîkatiya ActiveMQ pir cûda ye. Kafka li dora komikên pîvan-dervekirî hatî sêwirandin ku hemî bûyerên broker di heman demê de peyaman distînin û belav dikin.

Komek Kafka ji gelek mînakên brokerê ku li ser serverên cihêreng dixebitin pêk tê. Kafka hate sêwirandin ku li ser cîhaza serbixwe ya asayî bixebite, ku her girêk xwedan hilanîna xweya taybetî ye. Bikaranîna hilanîna pêvekirî ya torê (SAN) nayê pêşniyar kirin ji ber ku gelek girêkên hesabkirinê dikarin ji bo demê pêşbaziyê bikin.Ыe navberên hilanînê û nakokiyan diafirîne.

Kafka ye herdem li ser sîstem. Gelek bikarhênerên Kafka yên mezin tu carî komikên xwe nagirin û nermalava her gav bi ji nû ve destpêkirina rêzdar nûve dike. Ev bi garantîkirina lihevhatina bi guhertoya berê re ji bo peyam û danûstendinên di navbera brokeran de tê bidestxistin.

Brokerên ku bi komek serverê ve girêdayî ne ZooKeeper, ku wekî qeydek daneya mîhengê tevdigere û ji bo hevrêzkirina rolên her brokerê tê bikar anîn. ZooKeeper bi xwe pergalek belavkirî ye ku bi sazkirina agahdariyan ve bi dubarekirina agahdariyê ve hebûna bilind peyda dike. quorum.

Di rewşa bingehîn de, mijarek di komek Kafka de bi taybetmendiyên jêrîn tê afirandin:

  • Hejmara beşan. Wekî ku berê hate nîqaş kirin, nirxa rastîn a ku li vir tê bikar anîn bi asta xwestî ya xwendina paralel ve girêdayî ye.
  • Faktora dubarekirinê (faktor) diyar dike ka çend mînakên brokerê yên di komê de divê ji bo vê dabeşkirinê têketinên xwe hebin.

Bi karanîna ZooKeepers ji bo hevrêziyê, Kafka hewl dide ku bi dadwerî dabeşên nû di nav brokerên komê de belav bike. Ev ji hêla mînakek yekane ve tête kirin ku wekî Kontrolker tevdigere.

Di dema xebatê de ji bo her dabeşkirina mijarê Controller ji brokerek re rolan bidin birêvebir (serok, mamoste, pêşkêşvan) û şopînerên (peyde, kole, bindest). Broker, ku wekî serokê vê dabeşkirinê tevdigere, berpirsiyar e ku hemî peyamên ku ji hêla hilberîner ve jê re têne şandin û belavkirina peyaman li serfkaran. Dema ku peyam ji dabeşek mijarê re têne şandin, ew li hemî girêkên brokerê yên ku ji bo wê dabeşkirinê wekî şopînerê tevdigerin têne dubare kirin. Her girêkek ku têketinên dabeşkirinê vedihewîne tê gotin replica. Brokerek dikare ji bo hin dabeşan wekî rêber û ji bo yên din jî wekî şopînerek tevbigere.

Şagirtek ku hemî peyamên ku ji hêla rêber ve têne girtin tê gotin replica hevdemkirî (kopîyek ku di rewşek hevdemkirî de ye, kopiyek di hevdemkirinê de). Ger brokerek ku ji bo dabeşkirinê wekî rêber tevdigere dakeve, her brokerek ku ji bo wê dabeşkirinê nûvekirî ye an hevdemkirî ye dikare rola pêşeng bigire. Ew sêwiranek pir domdar e.

Beşek veavakirina hilberîner pîvan e acks, ya ku diyar dike ka çend kopya divê wergirtina peyamek pejirandî (pejirandin) berî ku mijara serîlêdanê şandina berdewam bike: 0, 1, an hemî. Ger were danîn gişt, wê gavê gava ku peyamek were wergirtin, rêber dê piştrastiyek paşde ji hilberîner re bişîne gava ku ew tesdîqên (pejirandina) tomarê ji çend nîşanan (di nav xwe de) ku ji hêla mîhengê mijarê ve hatî destnîşan kirin werdigire. min.insync.replicas (pêşnûma 1). Ger peyam bi serfirazî neyê dubare kirin, wê hingê çêker dê îstîsna serîlêdanê bavêje (NotEnoughReplicas an NotEnoughReplicasAfterAppend).

Veavakirinek tîpîk mijarek bi faktora dubarekirinê ya 3 (1 serok, 2 şopîner ji her partîsiyonê) û parametreyê diafirîne. min.insync.replicas 2-yê hatî danîn. Di vê rewşê de, kom dê dihêle yek ji brokerên ku dabeşkirina mijarê birêve dibe dakeve bêyî ku bandorê li serîlêdanên xerîdar bike.

Ev me vedigerîne bazirganiya jixwe naskirî ya di navbera performans û pêbaweriyê de. Replication li ser lêçûna dema bendê ya zêde ya ji bo piştrastkirin (pejirandin) ji şagirtan pêk tê. Her çend, ji ber ku ew bi hev re dimeşe, dubarekirina bi kêmî ve sê girêkan heman performansa duyan heye (guh nede zêdebûna karanîna bandê ya torê).

Bi karanîna vê pilana dubarekirinê, Kafka bi aqilî ji hewcedariya nivîsandina fizîkî ya her peyamê li ser dîskê bi operasyonê dûr disekine. sync(). Her peyama ku ji hêla hilberîner ve hatî şandin dê di navnîşa dabeşkirinê de were nivîsandin, lê wekî ku di Beşa 2 de hate nîqaş kirin, nivîsandina pelê di destpêkê de di tampona pergala xebitandinê de tê kirin. Ger ev peyam ji bo nimûneyeke din a Kafka were dubare kirin û di bîranîna wê de be, windakirina rêber nayê wê wateyê ku peyam bixwe winda bûye - ew dikare bi kopiyek hevdemkirî were girtin.
Rakirina operasyonê sync() tê wê wateyê ku Kafka bi qasî ku bikaribe li ser bîrê binivîsîne, dikare peyaman werbigire. Berevajî vê, her ku hûn dikarin ji şuştina bîranînê li ser dîskê dûr bixin, çêtir e. Ji ber vê yekê, ne asayî ye ku ji brokerên Kafka re 64 GB an jî bêtir bîranîn were veqetandin. Ev karanîna bîranînê tê vê wateyê ku yek mînakek Kafka dikare bi hêsanî bi leza bi hezaran carî ji brokerek peyamek kevneşopî zûtir bixebite.

Kafka dikare ji bo pêkanîna operasyonê jî were mîheng kirin sync() ji bo pakêtên peyamê. Ji ber ku her tişt di Kafka de pakêt-ahengdar e, ew bi rastî ji bo gelek rewşên karanîna pir baş dixebite û ji bo bikarhênerên ku hewceyê garantiyên pir xurt in amûrek bikêr e. Piraniya performansa paqij a Kafka ji peyamên ku ji brokerê re wekî pakêt têne şandin tê û ku ev peyam ji brokerê di blokên rêzdar de têne xwendin. kopî sifir operasyonên (xebatên ku di dema ku peywira kopîkirina daneyan ji herêmek bîranînê li cîhek din nayê kirin). Ya paşîn performansek mezin û qezencek çavkaniyek mezin e û tenê bi karanîna avahiyek daneya têketinê ya bingehîn a ku nexşeya dabeşkirinê diyar dike gengaz e.

Performansa pir çêtir di komek Kafka de ji bi yek brokerek Kafka re mimkun e, ji ber ku dabeşên mijarê dikarin li gelek makîneyên cihêreng mezin bibin.

Encam

Di vê beşê de, me nihêrî ka mîmariya Kafka çawa têkiliya di navbera xerîdar û brokeran de ji nû ve xeyal dike da ku lûleyek peyamsaziyê ya bêbawer peyda bike, bi rêgezek pir caran ji ya brokerek peyamek kevneşopî mezintir e. Me li ser fonksiyona ku ew bikar tîne da ku bigihîje vê yekê nîqaş kir û bi kurtî li mîmariya serîlêdanên ku vê fonksiyonê peyda dikin mêze kir. Di beşa pêş de, em ê li pirsgirêkên hevpar binêrin ku serîlêdanên li ser bingeha mesajê hewce ne ku çareser bikin û stratejiyên ji bo mijûlbûna bi wan re nîqaş bikin. Em ê beşê bi xêzkirina ka meriv çawa li ser teknolojiyên peyamberdanê bi gelemperî biaxive biqede, da ku hûn guncanbûna wan ji bo dozên karanîna xwe binirxînin.

Beşa berê ya wergerandî: Fêmkirina brokerên peyamê. Fêrbûna mekanîka mesajê bi ActiveMQ û Kafka re. Beşa 1

Werger kirin: tele.gg/middle_java

Ez bêtir ji te hez dikim…

Tenê bikarhênerên qeydkirî dikarin beşdarî anketê bibin. Têketinji kerema xwe.

Kafka di rêxistina we de tê bikaranîn?

  • ku

  • na

  • Berê dihat bikaranîn, niha na

  • Em plan dikin ku bikar bînin

38 bikarhêneran deng dan. 8 bikarhêner jî betal bûn.

Source: www.habr.com

Add a comment