Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 3. Кафка

Идомаи тарҷумаи як китоби хурд:
Фаҳмидани брокерҳои паёмҳо
муаллиф: Якуб Кораб, ношир: O'Reilly Media, Inc., санаи нашр: июни 2017, ISBN: 9781492049296.

Қисми пешинаи тарҷумашуда: Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 1 Муқаддима

БОБИ 3

Кафка

Кафка аз ҷониби LinkedIn таҳия шудааст, то баъзе маҳдудиятҳои брокерҳои анъанавии паёмҳоро рафъ кунад ва аз таъсиси брокерҳои сершумори паёмӣ барои ҳамкории мухталифи нуқта ба нуқта худдорӣ кунад, ки дар ин китоб зери "Миқёс ва васеъ кардан" дар саҳифаи 28 тавсиф шудааст. Ҳолатҳои истифода LinkedIn асосан ба яктарафа ворид кардани миқдори хеле зиёди додаҳо, аз қабили кликҳои саҳифа ва гузоришҳои дастрасӣ, такя мекард ва ҳамзамон имкон медиҳад, ки ин маълумот аз ҷониби системаҳои гуногун бидуни таъсир ба маҳсулнокии истеҳсолкунандагон ва дигар истеъмолкунандагон истифода шавад. Дарвоқеъ, сабаби мавҷудияти Кафка ин ба даст овардани як намуди меъмории паёмнависӣ мебошад, ки дар Universal Data Pipeline тавсиф мекунад.

Бо назардошти ин максади оли табиист, ки дигар талабот ба миён омад. Кафка бояд:

  • бениҳоят зуд бошед
  • Ҳангоми кор бо паёмҳо фарохмаҷрои бештарро таъмин кунед
  • Моделҳои Publisher-Муштарӣ ва Нуқта ба Нуқтаро дастгирӣ кунед
  • Бо илова кардани истеъмолкунандагон суръатро суст накунед. Масалан, иҷрои ҳам навбат ва ҳам мавзӯъ дар ActiveMQ бо афзоиши шумораи истеъмолкунандагон дар макони таъинот паст мешавад.
  • Ба таври уфуқӣ миқёспазир бошад; агар як брокере, ки паёмҳоро нигоҳ медорад, ин корро танҳо бо суръати максималии диск иҷро карда метавонад, пас барои баланд бардоштани самаранокӣ аз як мисоли брокер берун рафтан маъно дорад.
  • Дастрасиро ба нигоҳдорӣ ва бозпас гирифтани паёмҳо маҳдуд кунед

Барои ноил шудан ба ҳамаи ин, Кафка меъмориро қабул кард, ки нақш ва масъулиятҳои муштариён ва брокерҳои паёмнависиро аз нав муайян кард. Модели JMS ба брокер нигаронида шудааст, ки дар он брокер барои паҳн кардани паёмҳо масъул аст ва мизоҷон танҳо бояд дар бораи ирсол ва қабули паёмҳо ғамхорӣ кунанд. Кафка, аз тарафи дигар, ба мизоҷ нигаронида шудааст ва муштарӣ бар ивази брокери бениҳоят зуд ва васеъшаванда бисёр хусусиятҳои брокери анъанавиро, ба монанди тақсимоти одилонаи паёмҳои дахлдор ба истеъмолкунандагон мегирад. Барои одамоне, ки бо системаҳои паёмнависии анъанавӣ кор кардаанд, кор бо Кафка тағироти куллии тафаккурро талаб мекунад.
Ин самти муҳандисӣ ба эҷоди инфрасохтори паёмнависӣ оварда расонд, ки қодир аст интиқолро дар муқоиса бо брокери муқаррарӣ бо миқдори зиёд афзоиш диҳад. Тавре ки мо мебинем, ин равиш бо муомилот меояд, ки маънои онро дорад, ки Кафка барои намудҳои муайяни сарбории корӣ ва нармафзори насбшуда мувофиқ нест.

Модели ягонаи таъинот

Барои иҷрои талаботи дар боло тавсифшуда, Кафка паёмнависии нашр-обуна ва нуқта ба нуқтаро дар як намуди таъинот муттаҳид кардааст - мавзуъ. Ин барои одамоне, ки бо системаҳои паёмнависӣ кор кардаанд, печида аст, ки дар он ҷо калимаи "мавзӯъ" ба механизми пахши он ишора мекунад, ки хондан аз он (аз мавзӯъ) ғайри қобили қабул аст. Мавзӯъҳои Кафка бояд як навъи макони гибридӣ баррасӣ шаванд, тавре ки дар муқаддимаи ин китоб муайян шудааст.

Барои боқимондаи ин боб, агар мо ба таври возеҳ чизи дигареро баён накунем, истилоҳи "мавзӯъ" ба мавзӯи Кафка ишора мекунад.

Барои пурра фаҳмидани он ки мавзӯъҳо чӣ гуна рафтор мекунанд ва онҳо чӣ гуна кафолат медиҳанд, мо бояд аввал бубинем, ки онҳо дар Кафка чӣ гуна татбиқ мешаванд.
Ҳар як мавзӯъ дар Кафка сабти худро дорад.
Истеҳсолкунандагоне, ки ба Кафка паём мефиристанд, ба ин гузориш менависанд ва истеъмолкунандагон аз гузоришҳо бо истифода аз ишораҳое, ки пайваста ба пеш ҳаракат мекунанд, мехонанд. Давра ба давра, Кафка қадимтарин қисмҳои гузоришро нест мекунад, новобаста аз он ки паёмҳо дар он қисмҳо хонда шудаанд ё не. Қисми марказии тарҳи Кафка дар он аст, ки брокер парвое надорад, ки паёмҳо хонда мешаванд ё не - ин масъулияти муштарист.

Истилоҳҳои "журнал" ва "нишондиҳанда" дар он пайдо намешаванд Ҳуҷҷатҳои Кафка. Ин истилоҳҳои маъруф дар ин ҷо барои фаҳмиш истифода мешаванд.

Ин модел аз ActiveMQ комилан фарқ мекунад, ки дар он паёмҳо аз ҳама навбатҳо дар як сабт нигоҳ дошта мешаванд ва брокер паёмҳоро пас аз хондани онҳо ҳазфшуда қайд мекунад.
Биёед ҳоло каме амиқтар кобед ва ба гузориши мавзӯъ муфассалтар назар андозем.
Журнали Кафка аз якчанд қисмҳо иборат аст (Тасвири 3-1). Кафка тартиби қатъиро дар ҳар як қисм кафолат медиҳад. Ин маънои онро дорад, ки паёмҳои ба қисм бо тартиби муайян навишташуда бо ҳамон тартиб хонда мешаванд. Ҳар як бахш ҳамчун файли ғалаёни гузориш, ки дар бар мегирад, амалӣ карда мешавад зермаҷмӯа (Зермаҷмӯи) ҳамаи паёмҳои ба мавзӯъ фиристодаи истеҳсолкунандагони он. Мавзӯи сохташуда аз рӯи нобаёнӣ як қисмро дар бар мегирад. Идеяи бахшҳо ғояи марказии Кафка барои миқёси уфуқӣ мебошад.

Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 3. Кафка
Расми 3-1. Қисмҳои Кафка

Вақте ки продюсер ба мавзӯи Кафка паём мефиристад, вай тасмим мегирад, ки паёмро ба кадом қисмат фиристад. Мо дар ин бора баъдтар муфассалтар дида мебароем.

Хондани паёмҳо

Мизоҷе, ки мехоҳад паёмҳоро хонад, нишоннамои номбаршударо идора мекунад гурухи истеъмолкунандагон, ки ба он ишора мекунад офсет паёмҳо дар бахш. Офсет мавқеи афзояндаест, ки дар оғози бахш аз 0 оғоз мешавад. Ин гурӯҳи истеъмолкунандагон, ки дар API тавассути group_id-и аз ҷониби корбар муайяншуда истинод шудааст, мувофиқат мекунад як истеъмолкунанда ё системаи мантиқӣ.

Аксари системаҳои паёмнависӣ маълумотро аз макони таъинот бо истифода аз якчанд мисолҳо ва риштаҳо барои коркарди паёмҳо дар баробари мувозӣ мехонанд. Ҳамин тариқ, одатан шумораи зиёди истеъмолкунандагон мавҷуданд, ки як гурӯҳи истеъмолкунандагонро мубодила мекунанд.

Масъалаи хонданро метавон ба таври зерин муаррифӣ кард:

  • Мавзӯъ дорои қисмҳои сершумор аст
  • Якчанд гурӯҳҳои истеъмолкунандагон метавонанд як мавзӯъро дар як вақт истифода баранд
  • Як гурӯҳи истеъмолкунандагон метавонанд якчанд мисолҳои алоҳида дошта бошанд

Ин як мушкили начандон муҳим аст. Барои фаҳмидани он ки чӣ тавр Кафка муносибатҳои байни гурӯҳҳои истеъмолкунандагон, мисолҳои истеъмолкунандагон ва қисмҳоро идора мекунад, биёед як қатор сенарияҳои хонданро тадриҷан мураккабтар бубинем.

Истеъмолкунандагон ва гуруххои истеъмолкунандагон

Биёед ҳамчун нуқтаи ибтидоӣ мавзӯъро бо як қисм (Тасвири 3-2).

Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 3. Кафка
Расми 3-2. Истеъмолкунанда аз тақсимот мехонад

Вақте ки намунаи истеъмолкунанда бо group_id-и худ ба ин мавзӯъ пайваст мешавад, ба он қисмати хондан ва ҷуброн дар он қисм таъин карда мешавад. Мавқеи ин ҷуброн дар муштарӣ ҳамчун ишора ба мавқеи охирин (паёми нав) ё мавқеъи пешин (паёми қадимтарин) танзим карда мешавад. Истеъмолкунанда аз мавзӯъ паёмҳоро дархост мекунад (пурсишҳо), ки боиси пай дар пай аз журнал хонда мешавад.
Мавқеи офсетӣ мунтазам ба Кафка бармегардад ва ҳамчун паём дар мавзӯи дохилӣ нигоҳ дошта мешавад ҷуброн кардани _истеъмолкунанда. Паёмҳои хондашуда, бар хилофи брокери муқаррарӣ, то ҳол нест карда намешаванд ва муштарӣ метавонад ҷубронро барои коркарди дубораи паёмҳои дидашуда баргардонад.

Вақте ки истеъмолкунандаи дуюми мантиқӣ бо истифода аз group_id-и дигар пайваст мешавад, он нишондиҳандаи дуюмро идора мекунад, ки аз якум (Тасвири 3-3). Ҳамин тариқ, мавзӯи Кафка ҳамчун навбат амал мекунад, ки дар он як истеъмолкунанда мавҷуд аст ва ба мавзӯи муқаррарии интишор-обуна (pub-sub), ки истеъмолкунандагони сершумор ба он обуна мешаванд, бо бартарии иловагӣ, ки ҳама паёмҳо захира карда мешаванд ва метавонанд якчанд маротиба коркард карда шаванд.

Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 3. Кафка
Расми 3-3. Ду истеъмолкунанда дар гурӯҳҳои гуногуни истеъмолкунандагон аз як қисм мехонанд

Истеъмолкунандагон дар гурӯҳи истеъмолкунандагон

Вақте ки як мисоли истеъмолӣ маълумотро аз қисм мехонад, он дорои назорати пурраи нишондиҳанда ва коркарди паёмҳо аст, тавре ки дар боби қаблӣ тавсиф шудааст.
Агар якчанд мисолҳои истеъмолкунандагон бо як group_id ба мавзӯъ бо як қисм пайваст шуда бошанд, пас ба мисоле, ки охирин пайваст шудааст, назорат аз болои нишоннамо дода мешавад ва аз ҳамон лаҳза он ҳама паёмҳоро қабул мекунад (Тасвири 3-4).

Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 3. Кафка
Расми 3-4. Ду истеъмолкунанда дар як гурӯҳи истеъмолкунандагон аз як қисм мехонанд

Ин тарзи коркард, ки дар он шумораи инстансияҳои истеъмолӣ аз шумораи қисмҳо зиёд аст, метавонад ҳамчун як навъи истеъмолкунандаи истисноӣ баррасӣ карда шавад. Ин метавонад муфид бошад, агар ба шумо кластерсозии "фаъол-фаъол" (ё "гарм-гарм") -и мисолҳои истеъмолии худ лозим бошад, гарчанде ки корбурди истеъмолкунандагони сершумор дар мувозӣ ("фаъол-фаъол" ё "гарм-гарм") хеле маъмултар аст. истеъмолкунандагон Дар ҳолати интизорӣ.

Ин рафтори паҳнкунии паёмҳои дар боло тавсифшуда метавонад дар муқоиса бо тарзи рафтори навбати муқаррарии JMS ҳайратовар бошад. Дар ин модел, паёмҳои ба навбат фиристодашуда байни ду истеъмолкунанда баробар тақсим карда мешаванд.

Аксар вақт, вақте ки мо мисолҳои сершумори истеъмолкунандагонро эҷод мекунем, мо ин корро барои коркарди паёмҳо дар мувозӣ ё баланд бардоштани суръати хониш ё баланд бардоштани устувории раванди хониш анҷом медиҳем. Азбаски танҳо як мисоли истеъмолӣ метавонад дар як вақт маълумотро аз қисм хонад, ин дар Кафка чӣ гуна ба даст оварда мешавад?

Яке аз роҳҳои ин кор ин истифодаи як мисоли истеъмолкунанда барои хондани ҳама паёмҳо ва интиқоли онҳо ба ҳавзи ришта мебошад. Гарчанде ки ин равиш қобилияти коркардро зиёд мекунад, он мураккабии мантиқи истеъмолиро афзоиш медиҳад ва барои баланд бардоштани устувории системаи хониш ҳеҷ кор намекунад. Агар як нусхаи истеъмолкунанда бо сабаби нокомии барқ ​​ё ҳодисаи шабеҳ афтад, пас тарҳкунӣ қатъ мешавад.

Роҳи каноникии ҳалли ин масъала дар Кафка истифодаи бОқисмҳои бештар.

Тақсимкунӣ

Қисмҳо механизми асосии параллелизатсияи хондан ва миқёси мавзӯъ берун аз фарохмаҷрои як мисоли брокер мебошанд. Барои беҳтар фаҳмидани ин, биёед вазъиятеро баррасӣ кунем, ки дар он мавзӯъ бо ду қисм мавҷуд аст ва як истеъмолкунанда ба ин мавзӯъ обуна мешавад (Тасвири 3-5).

Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 3. Кафка
Расми 3-5. Як истеъмолкунанда аз қисмҳои сершумор мехонад

Дар ин сенария, ба истеъмолкунанда назорат аз болои нишондиҳандаҳои мувофиқ ба group_id-и он дар ҳарду қисмҳо дода мешавад ва хондани паёмҳоро аз ҳарду қисм оғоз мекунад.
Вақте ки истеъмолкунандаи иловагӣ барои ҳамон group_id ба ин мавзӯъ илова карда мешавад, Кафка яке аз қисмҳоро аз истеъмолкунандаи якум ба дуюм тақсим мекунад. Пас аз он, ҳар як мисоли истеъмолкунанда аз як қисми мавзӯъ (Тасвири 3-6).

Барои кафолат додани он, ки паёмҳо дар 20 ришта мувозӣ коркард мешаванд, ба шумо ҳадди аққал 20 қисм лозим аст. Агар қисматҳо камтар бошанд, шумо бо истеъмолкунандагон боқӣ мемонед, ки чизе барои кор кардан надоранд, тавре ки қаблан дар муҳокимаи истеъмолкунандагони истисноӣ тавсиф карда шуда буд.

Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 3. Кафка
Расми 3-6. Ду истеъмолкунанда дар як гурӯҳи истеъмолкунандагон аз қисмҳои гуногун мехонанд

Ин схема мураккабии брокери Кафкаро дар муқоиса бо тақсимоти паём, ки барои нигоҳ доштани навбати JMS лозим аст, хеле коҳиш медиҳад. Дар ин ҷо ба шумо лозим нест, ки дар бораи нуктаҳои зерин хавотир шавед:

  • Кадом истеъмолкунанда бояд паёми навбатиро дар асоси тақсимоти даврӣ, қобилияти ҷории буферҳои пешакӣ ё паёмҳои қаблӣ (барои гурӯҳҳои паёмҳои JMS) қабул кунад.
  • Кадом паёмҳо ба кадом истеъмолкунандагон фиристода мешаванд ва оё онҳо бояд дар сурати нокомӣ дубора расонида шаванд.

Ҳамаи брокери Кафка бояд ин аст, ки паёмҳоро пай дар пай ба истеъмолкунанда интиқол диҳад, вақте ки истеъмолкунанда онҳоро дархост мекунад.

Бо вуҷуди ин, талабот барои параллелизатсияи таҳрир ва фиристодани паёмҳои ноком аз байн намеравад - масъулияти онҳо танҳо аз брокер ба муштарӣ мегузарад. Ин маънои онро дорад, ки онҳо бояд дар рамзи шумо ба назар гирифта шаванд.

Фиристодани паёмҳо

Масъулияти истеҳсолкунандаи он паём аст, ки тасмим гирад, ки ба кадом қисм паём фиристад. Барои фаҳмидани механизме, ки тавассути он ин кор анҷом дода мешавад, мо аввал бояд фикр кунем, ки мо воқеан чӣ мефиристем.

Дар ҳоле ки дар JMS мо сохтори паёмро бо метамаълумотҳо (сарлавҳаҳо ва хосиятҳо) ва бадане, ки бори пурбор (борбор) дорад, истифода мебарем, дар Кафка паём ин аст. ҷуфти "арзиши калидӣ". Сарбории паём ҳамчун арзиш фиристода мешавад. Калид, аз тарафи дигар, асосан барои тақсимкунӣ истифода мешавад ва бояд дар бар гирад калиди мушаххаси мантиқи тиҷоратбарои ҷойгир кардани паёмҳои алоқаманд дар як қисм.

Дар боби 2, мо сенарияи букмекерии онлайнро муҳокима кардем, ки дар он рӯйдодҳои алоқаманд бояд аз ҷониби як истеъмолкунанда коркард карда шаванд:

  1. Ҳисоби корбар танзим карда шудааст.
  2. Пул ба счёт дохил карда мешавад.
  3. Шартгузорӣ карда мешавад, ки аз суратҳисоб пул мегирад.

Агар ҳар як ҳодиса паёме бошад, ки ба мавзӯъ фиристода шудааст, он гоҳ калиди табиӣ ID ҳисоб хоҳад буд.
Вақте ки паём бо истифода аз API Producer Kafka фиристода мешавад, он ба функсияи бахш интиқол дода мешавад, ки бо назардошти паём ва ҳолати кунунии кластери Кафка, ID-и бахшеро, ки паём бояд ба он фиристода шавад, бармегардонад. Ин хусусият дар Java тавассути интерфейси Partitioner амалӣ карда мешавад.

Ин интерфейс чунин менамояд:

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

Татбиқи Partitioner алгоритми хэшингии пешфарзии таъиноти умумиро аз болои калид барои муайян кардани тақсимот истифода мебарад, ё агар ягон калид муайян нашуда бошад. Ин арзиши пешфарз дар аксари ҳолатҳо хуб кор мекунад. Аммо, дар оянда шумо хоҳед, ки худатонро нависед.

Навиштани стратегияи тақсимоти худ

Биёед мисолеро бубинем, ки дар он шумо мехоҳед метамаълумотро дар баробари бори паём фиристед. Сарборӣ дар мисоли мо дастурест барои ворид кардани пасандоз ба ҳисоби бозӣ. Дастур чизест, ки мо мехоҳем кафолат дода шавад, ки ҳангоми интиқол тағир наёбад ва мехоҳем итминон дошта бошем, ки танҳо як системаи боэътимоди болооб метавонад ин дастурро оғоз кунад. Дар ин ҳолат, системаҳои ирсолкунанда ва қабулкунанда дар бораи истифодаи имзо барои тасдиқи паём розӣ мешаванд.
Дар JMS муқаррарӣ, мо танҳо моликияти "имзои паём" -ро муайян мекунем ва онро ба паём илова мекунем. Аммо, Кафка ба мо механизми интиқоли метамаълумотҳоро пешниҳод намекунад, танҳо калид ва арзиш.

Азбаски арзиш як бори интиқоли бонк аст, ки мо мехоҳем якпорчагии онро ҳифз кунем, мо ҷуз муайян кардани сохтори маълумот барои истифода дар калид дигар илоҷ надорем. Фарз мекунем, ки ба мо ID ҳисоб барои тақсимкунӣ лозим аст, зеро ҳама паёмҳои марбут ба ҳисоб бояд бо тартиби коркард карда шаванд, мо сохтори зерини JSON-ро пайдо мекунем:

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

Азбаски арзиши имзо вобаста ба сарборӣ фарқ мекунад, стратегияи пешфарзии интерфейси Partitioner паёмҳои алоқамандро ба таври эътимодбахш гурӯҳбандӣ намекунад. Аз ин рӯ, мо бояд стратегияи худро нависем, ки ин калидро таҳлил мекунад ва арзиши accountId-ро тақсим мекунад.

Кафка дорои маблағи назоратӣ барои ошкор кардани фасоди паёмҳо дар мағоза буда, маҷмӯи пурраи хусусиятҳои амниятӣ дорад. Бо вуҷуди ин, баъзан талаботҳои соҳавӣ, масалан, дар боло ба миён меоянд.

Стратегияи тақсимоти корбар бояд кафолат диҳад, ки ҳамаи паёмҳои алоқаманд дар як бахш хотима меёбанд. Гарчанде ки ин оддӣ ба назар мерасад, талабот метавонад бо аҳамияти фармоиши паёмҳои алоқаманд ва то чӣ андоза собит шудани шумораи қисмҳо дар мавзӯъ мураккаб гардад.

Шумораи қисмҳо дар мавзӯъ метавонад бо мурури замон тағир ёбад, зеро онҳо метавонанд илова карда шаванд, агар трафик аз интизориҳои аввала зиёдтар бошад. Ҳамин тариқ, калидҳои паёмӣ метавонанд бо қисмате, ки онҳо дар аввал ба онҳо фиристода шуда буданд, алоқаманд бошанд, ки ин маънои онро дорад, ки як порчаи давлат бояд байни мисолҳои истеҳсолкунанда тақсим карда шавад.

Омили дигаре, ки бояд ба назар гирифта шавад, тақсимоти яксони паёмҳо дар байни қисмҳо мебошад. Одатан, калидҳо дар байни паёмҳо баробар тақсим карда намешаванд ва функсияҳои хэш тақсимоти одилонаи паёмҳоро барои маҷмӯи хурди калидҳо кафолат намедиҳанд.
Бояд қайд кард, ки ҳарчанд шумо тақсим кардани паёмҳоро интихоб мекунед, худи ҷудокунанда метавонад дубора истифода шавад.

Талаботи такрори маълумот байни кластерҳои Кафка дар маконҳои гуногуни ҷуғрофиро баррасӣ кунед. Бо ин мақсад, Кафка бо асбоби сатри фармон бо номи MirrorMaker меояд, ки барои хондани паёмҳо аз як кластер ва интиқоли онҳо ба дигараш истифода мешавад.

MirrorMaker бояд калидҳои мавзӯи такроршавандаро дарк кунад, то тартиботи нисбии байни паёмҳо ҳангоми такрори байни кластерҳо нигоҳ дошта шавад, зеро шумораи қисмҳои ин мавзӯъ дар ду кластер яксон набошад.

Стратегияҳои тақсимоти фармоишӣ нисбатан каманд, зеро хэшингҳои пешфарз ё робини мудаввар дар аксари сенарияҳо хуб кор мекунанд. Аммо, агар шумо кафолати фармоишии қавӣ талаб кунед ё лозим аст, ки метамаълумотро аз сарборӣ истихроҷ кунед, пас тақсимкунӣ чизест, ки шумо бояд бодиққат назар кунед.

Афзалиятҳои миқёспазирӣ ва самаранокии Кафка аз интиқоли баъзе масъулиятҳои брокери анъанавӣ ба муштарӣ бармеояд. Дар ин ҳолат, қарор дар бораи паҳн кардани паёмҳои эҳтимолии алоқаманд дар байни якчанд истеъмолкунандагон, ки дар як вақт кор мекунанд, қабул карда мешавад.

Брокерҳои JMS низ бояд бо чунин талаботҳо мубориза баранд. Ҷолиб он аст, ки механизми ирсоли паёмҳои алоқаманд ба як истеъмолкунанда, ки тавассути гурӯҳҳои паёмҳои JMS амалӣ карда мешавад (вариант дар стратегияи мувозинати бори часпак (SLB)), инчунин аз ирсолкунанда талаб мекунад, ки паёмҳоро ҳамчун алоқаманд қайд кунад. Дар мавриди JMS, брокер барои фиристодани ин гурӯҳи паёмҳои марбут ба як истеъмолкунанда аз шумораи зиёди онҳо ва интиқол додани моликияти гурӯҳ дар сурати афтодани истеъмолкунанда масъул аст.

Созишномаҳои истеҳсолкунанда

Тақсимкунӣ ягона чизе нест, ки ҳангоми фиристодани паёмҳо бояд ба назар гирифт. Биёед усулҳои send()-и синфи Producer дар Java API-ро бубинем:

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

Бояд фавран қайд кард, ки ҳарду усул Future-ро бармегардонанд, ки ин нишон медиҳад, ки амалиёти ирсол фавран иҷро намешавад. Натиҷа ин аст, ки паём (ProducerRecord) ба буфери ирсол барои ҳар як қисмати фаъол навишта мешавад ва ба брокер ҳамчун риштаи замина дар китобхонаи муштарии Кафка фиристода мешавад. Гарчанде ки ин корҳоро бениҳоят суръат мебахшад, ин маънои онро дорад, ки барномаи бетаҷриба метавонад дар сурати қатъ шудани раванди он паёмҳоро гум кунад.

Чун ҳамеша, як роҳи боэътимодтар кардани амалиёти фиристодан бо арзиши иҷроиш вуҷуд дорад. Андозаи ин буферро метавон ба 0 муқаррар кард ва риштаи дархости ирсолкунанда маҷбур мешавад, ки то анҷоми интиқоли паём ба брокер мунтазир шавад, ба таври зерин:

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

Бештар дар бораи хондани паёмҳо

Хондани паёмҳо мушкилоти иловагӣ дорад, ки бояд дар бораи онҳо тахмин карда шаванд. Баръакси JMS API, ки метавонад шунавандаи паёмро дар посух ба паём иҷро кунад Фарҳанг Кафка танҳо овоздиҳӣ. Биёед усулро муфассалтар дида бароем пурсиш ()бо ин мақсад истифода мешавад:

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

Арзиши бозгашти усул сохтори контейнерест, ки дорои якчанд объект аст сабти истеъмолкунандагон аз якчанд қисмҳои эҳтимолӣ. сабти истеъмолкунандагон худ як объекти дорандаи ҷуфти арзишҳои калидӣ бо метамаълумоти алоқаманд аст, ба монанди қисме, ки аз он гирифта шудааст.

Тавре ки дар боби 2 баррасӣ шудааст, мо бояд дар хотир дошта бошем, ки пас аз коркарди бомуваффақият ё бемуваффақият бо паёмҳо чӣ рӯй медиҳад, масалан, агар муштарӣ паёмро коркард карда натавонад ё он қатъ карда шавад. Дар JMS, ин тавассути режими эътироф коркард карда шуд. Брокер ё паёми бомуваффақият коркардшударо нест мекунад ё паёми хом ё қалбакиро аз нав мерасонад (фарз кардани транзаксияҳо).
Кафка хеле дигар кор мекунад. Паёмҳо пас аз хондани таҳрир дар брокер нест карда намешаванд ва он чизе, ки ҳангоми нокомӣ рух медиҳад, масъулияти худи коди таҳрир аст.

Тавре ки мо гуфтем, гурӯҳи истеъмолкунандагон бо ҷуброн дар журнал алоқаманд аст. Мавқеи сабти марбут ба ин ҷуброн ба паёми навбатӣ, ки дар посух ба он дода мешавад, мувофиқат мекунад пурсиш (). Нуқтаи вақти зиёд шудани ин ҷуброн барои хондан ҳалкунанда аст.

Бозгашт ба модели хониши қаблан баррасӣшуда, коркарди паём аз се марҳила иборат аст:

  1. Паёмро барои хондан дарёфт кунед.
  2. Паёмро коркард кунед.
  3. Паёмро тасдиқ кунед.

Истеъмолкунандаи Кафка бо варианти конфигуратсия меояд enable.auto.commit. Ин танзимоти пешфарз зуд-зуд истифодашаванда аст, чуноне ки дар танзимоти дорои калимаи "авто" маъмул аст.

Пеш аз Кафка 0.10, муштарӣ бо истифода аз ин хосият ҷуброни паёми охирини дар занги навбатӣ хондашударо мефиристад пурсиш () пас аз коркард. Ин маънои онро дошт, ки ҳама паёмҳои қаблан гирифташуда метавонанд дубора коркард карда шаванд, агар муштарӣ онҳоро аллакай коркард карда бошад, аммо пеш аз занг задан ғайричашмдошт нобуд карда шавад. пурсиш (). Азбаски брокер ҳеҷ гуна ҳолатро дар бораи чанд маротиба хондани паём нигоҳ намедорад, истеъмолкунандаи навбатӣ, ки ин паёмро мегирад, ҳеҷ чизи бадеро намедонад. Ин рафтор псевдо-трансакционӣ буд. Офсет танҳо дар сурати бомуваффақият коркард шудани паём анҷом дода мешуд, аммо агар муштарӣ қатъ карда шавад, брокер ҳамон паёмро дубора ба муштарии дигар мефиристад. Ин рафтор бо кафолати интиқоли паём мувофиқ буд "камаш як бор".

Дар Kafka 0.10, коди муштарӣ тағир дода шудааст, то ин ки ӯҳдадорӣ аз ҷониби китобхонаи муштарӣ, тавре ки танзим карда шудааст, ба таври даврӣ оғоз карда шавад. auto.commit.interval.ms. Ин рафтор дар байни режимҳои JMS AUTO_ACKNOWLEDGE ва DUPS_OK_ACKNOWLEDGE ҷой дорад. Ҳангоми истифодаи автокоммит, паёмҳоро новобаста аз он ки воқеан коркард шудаанд, содир кардан мумкин аст - ин метавонад дар сурати истеъмолкунандаи суст рӯй диҳад. Агар истеъмолкунанда исқоти ҳамл кунад, паёмҳо аз ҷониби истеъмолкунандаи навбатӣ аз мавқеи муқарраршуда гирифта мешаванд, ки ин метавонад ба паёми беҷавоб оварда расонад. Дар ин ҳолат, Кафка паёмҳоро гум накард, рамзи хониш танҳо онҳоро коркард накард.

Ин режим ҳамон ваъдаеро, ки дар версияи 0.9 дорад, дорад: паёмҳоро коркард кардан мумкин аст, аммо агар он ноком шавад, ҷуброн кардан мумкин нест, ки эҳтимолан боиси дучанд шудани интиқол гардад. Чӣ қадаре ки шумо ҳангоми иҷроиш паёмҳои бештар гиред пурсиш (), ин мушкилот ҳамон қадар зиёдтар аст.

Тавре ки дар "Хондани паёмҳо аз навбат" дар саҳифаи 21 баррасӣ шудааст, дар системаи паёмнависӣ, вақте ки режимҳои нокомӣ ба инобат гирифта мешаванд, чунин интиқоли якдафъаинаи паём вуҷуд надорад.

Дар Кафка ду роҳи анҷом додани офсет (офсет) вуҷуд дорад: ба таври худкор ва дастӣ. Дар ҳарду ҳолат, паёмҳо метавонанд якчанд маротиба коркард карда шаванд, агар паём коркард шуда бошад, аммо пеш аз иҷро ноком шавад. Шумо инчунин метавонед умуман коркард накардани паёмро интихоб кунед, агар супориш дар замина рух дода бошад ва рамзи шумо пеш аз коркарди он анҷом дода шуда бошад (шояд дар Кафка 0.9 ва пештар).

Шумо метавонед бо гузоштани параметр раванди ҷуброни дастӣ дар API истеъмолии Кафкаро назорат кунед enable.auto.commit барои бардурӯғ ва ба таври возеҳ даъват кардани яке аз усулҳои зерин:

void commitSync();
void commitAsync();

Агар шумо хоҳед, ки паёмро "ҳадди ақал як маротиба" коркард кунед, шумо бояд ҷубронро бо дастӣ анҷом диҳед commitSync()бо иҷрои ин фармон фавран пас аз коркарди паёмҳо.

Ин усулҳо имкон намедиҳад, ки паёмҳо пеш аз коркард эътироф карда шаванд, аммо онҳо барои бартараф кардани таъхирҳои эҳтимолии коркард дар ҳоле ки намуди транзаксионӣ нишон медиҳанд, ҳеҷ коре намекунанд. Дар Кафка ягон транзаксия вуҷуд надорад. Муштарӣ имкони иҷрои корҳои зеринро надорад:

  • Паёми қалбакиро ба таври худкор баргардонед. Худи истеъмолкунандагон бояд истисноҳоеро, ки аз боркунии мушкилот ва қатъи пуштибонӣ бармеоянд, ҳал кунанд, зеро онҳо наметавонанд ба брокер барои аз нав расонидани паёмҳо такя кунанд.
  • Дар як амалиёти атомӣ ба якчанд мавзӯъ паём фиристед. Тавре ки мо ба зудӣ мебинем, назорат аз болои мавзӯъҳо ва қисмҳои гуногун метавонанд дар мошинҳои гуногуни кластери Кафка ҷойгир шаванд, ки ҳангоми фиристодан транзаксияҳоро ҳамоҳанг намекунанд. Дар замони навиштани ин мақола, барои имконпазир кардани ин бо КИП-98 баъзе корҳо анҷом дода шуданд.
  • Хониши як паём аз як мавзӯъро бо фиристодани паёми дигар ба мавзӯи дигар алоқаманд кунед. Боз ҳам, меъмории Кафка аз бисёр мошинҳои мустақил вобаста аст, ки ҳамчун як автобус кор мекунанд ва ҳеҷ гуна кӯшиши пинҳон кардани ин вуҷуд надорад. Масалан, ҷузъҳои API вуҷуд надоранд, ки ба шумо имкон медиҳанд, ки пайваст шавед истеъмолкунанда и Истеҳсолкунанда дар муомилот. Дар JMS, ин аз ҷониби объект таъмин карда мешавад сессияки аз онхо офарида шудаанд Истеҳсолкунандагони паём и Паёми истеъмолкунандагон.

Агар мо ба транзаксияҳо такя карда натавонем, чӣ гуна мо метавонем семантикаро ба онҳое, ки системаҳои паёмнависии анъанавӣ пешниҳод мекунанд, наздиктар кунем?

Агар имкон дошта бошад, ки ҷуброни истеъмолкунанда пеш аз коркарди паём афзоиш ёбад, масалан, ҳангоми садамаи истеъмолӣ, истеъмолкунанда ҳеҷ роҳе намедонад, ки оё гурӯҳи истеъмолкунандагони он ҳангоми таъини қисм паёмро аз даст додаанд. Ҳамин тавр, як стратегия ин баргардонидани ҷуброн ба мавқеи қаблӣ мебошад. API-и истеъмолии Кафка барои ин усулҳои зеринро пешниҳод мекунад:

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

метод ҷустуҷӯ() бо усул истифода бурдан мумкин аст
offsetsForTimes(Харита timemarksToSearch) ба ҳолати дар ягон нуқтаи мушаххаси гузашта баргаштан.

Ба таври возеҳ, истифодаи ин равиш маънои онро дорад, ки эҳтимол дорад, ки баъзе паёмҳои қаблан коркардшуда дубора хонда ва коркард шаванд. Барои роҳ надодан ба ин, мо метавонем хониши idempotent, тавре ки дар боби 4 тавсиф шудааст, барои пайгирии паёмҳои қаблан дидашуда ва нест кардани такрорӣ истифода барем.

Интихобан, рамзи истеъмолии шумо метавонад содда нигоҳ дошта шавад, ба шарте ки гум шудан ё такрори паём қобили қабул бошад. Вақте ки мо ҳолатҳои истифодаеро, ки Кафка барои онҳо маъмулан истифода мешавад, баррасӣ мекунем, ба монанди коркарди рӯйдодҳои гузориш, ченакҳо, пайгирии клик ва ғайра, мо мефаҳмем, ки гум шудани паёмҳои инфиродӣ ба барномаҳои атроф таъсири назаррас намерасонад. Дар чунин ҳолатҳо, арзишҳои пешфарз комилан қобили қабуланд. Аз тарафи дигар, агар аризаи шумо бояд пардохт фиристад, шумо бояд ҳар як паёми инфиродӣ бодиққат ғамхорӣ кунед. Ҳамааш ба контекст меояд.

Мушоҳидаҳои шахсӣ нишон медиҳанд, ки бо афзоиши шиддати паёмҳо, арзиши ҳар як паёми алоҳида коҳиш меёбад. Паёмҳои калон одатан ҳангоми дидан дар шакли ҷамъшуда арзишманданд.

Мавҷудияти баланд

Муносибати Кафка ба дастрасии баланд аз равиши ActiveMQ хеле фарқ мекунад. Кафка дар атрофи кластерҳои васеъ тарҳрезӣ шудааст, ки дар он ҳама брокерҳо дар як вақт паёмҳоро қабул ва паҳн мекунанд.

Кластери Кафка аз якчанд мисолҳои брокерӣ иборат аст, ки дар серверҳои гуногун кор мекунанд. Кафка барои кор кардан дар сахтафзори оддии мустақил тарҳрезӣ шудааст, ки дар он ҳар як гиреҳ анбори махсуси худро дорад. Истифодаи нигаҳдории шабакавӣ (SAN) тавсия дода намешавад, зеро гиреҳҳои ҳисоббарории сершумор метавонанд барои вақт рақобат кунанд.Ыфосилаҳои нигоҳдории электронӣ ва эҷоди низоъҳо.

Кафка аст ҳамеша фаъол система. Бисёре аз корбарони бузурги Кафка ҳеҷ гоҳ кластерҳои худро хомӯш намекунанд ва нармафзор ҳамеша бо бозоғозии пайдарпай навсозӣ мешавад. Ин тавассути кафолат додани мутобиқат бо версияи қаблӣ барои паёмҳо ва ҳамкории байни брокерҳо ба даст оварда мешавад.

Брокерҳое, ки ба кластери сервер пайвастанд Боғи ҳайвонот, ки ҳамчун феҳристи додаҳои конфигуратсия амал мекунад ва барои ҳамоҳангсозии нақшҳои ҳар як брокер истифода мешавад. Худи ZooKeeper як системаи тақсимшуда мебошад, ки дастрасии баландро тавассути такрори иттилоот тавассути таъсис додани кворум.

Дар ҳолати асосӣ, мавзӯъ дар кластери Кафка бо хосиятҳои зерин сохта мешавад:

  • Шумораи қисмҳо. Тавре ки қаблан баррасӣ шуд, арзиши дақиқи дар ин ҷо истифодашаванда аз сатҳи дилхоҳи хониши мувозӣ вобаста аст.
  • Омили такрорӣ (омил) муайян мекунад, ки чанд мисоли брокер дар кластер бояд гузоришҳоро барои ин қисмат дар бар гирад.

Бо истифода аз ZooKeepers барои ҳамоҳангсозӣ, Кафка кӯшиш мекунад, ки қисмҳои навро дар байни брокерҳои кластер ба таври одилона тақсим кунад. Ин аз ҷониби як мисоле анҷом дода мешавад, ки ҳамчун Назоратчӣ амал мекунад.

Дар вақти кор барои ҳар як қисмати мавзӯъ Нозир нақшҳоро ба брокер таъин кунед рохбар (роҳбар, устод, баранда) ва пайравон (пайравон, ғуломон, тобеон). Брокер, ки ҳамчун роҳбари ин тақсимот амал мекунад, барои қабули ҳама паёмҳои аз ҷониби истеҳсолкунандагон ба он фиристодашуда ва паҳн кардани паёмҳо ба истеъмолкунандагон масъул аст. Вақте ки паёмҳо ба қисмати мавзӯъ фиристода мешаванд, онҳо ба ҳама гиреҳҳои брокерӣ такрор карда мешаванд, ки ҳамчун пайравони ин қисм амал мекунанд. Ҳар як гиреҳ, ки дорои гузоришҳо барои қисмат номида мешавад нусхабардорӣ. Брокер метавонад барои баъзе қисмҳо ҳамчун пешво ва барои дигарон ҳамчун пайрав амал кунад.

Пайраве даъват карда мешавад, ки ҳамаи паёмҳои аз ҷониби роҳбар доштаро дар бар мегирад нусхаи ҳамоҳангшуда (реплика, ки дар ҳолати ҳамоҳангшуда аст, репликаи ҳамоҳангшуда). Агар брокере, ки ҳамчун пешво барои бахш кор мекунад, поён равад, ҳар як брокери навсозӣ ё ҳамоҳангшуда барои ин қисм метавонад нақши пешворо бар дӯш гирад. Ин як тарҳи бениҳоят устувор аст.

Қисми конфигуратсияи истеҳсолкунанда параметр аст акс, ки муайян мекунад, ки чӣ қадар репликаҳо бояд қабули паёмро эътироф кунанд (эътироф кунанд) пеш аз идомаи ирсоли риштаи барнома: 0, 1 ё ҳама. Агар муқаррар карда шавад ҳама, пас, вақте ки паём гирифта мешавад, роҳбар баробари гирифтани тасдиқи (эътироф) сабт аз якчанд аломатҳо (аз ҷумла худи), ки аз ҷониби танзимоти мавзӯъ муайян карда мешавад, ба истеҳсолкунанда тасдиқро бармегардонад. min.insync.replicas (пешфарз 1). Агар паёмро бомуваффақият такрор кардан ғайриимкон бошад, он гоҳ истеҳсолкунанда истиснои барномаро (NotEnoughReplicas ё NotEnoughReplicasAfterAppend).

Конфигуратсияи маъмулӣ мавзӯъро бо омили такрории 3 (1 роҳбар, 2 пайрав дар як қисм) ва параметр эҷод мекунад min.insync.replicas ба 2 муқаррар карда шудааст. Дар ин ҳолат, кластер ба яке аз брокерҳое, ки қисмати мавзӯъро идора мекунанд, имкон медиҳад, ки бидуни таъсир ба барномаҳои муштарӣ поён равад.

Ин моро ба муомилоти аллакай шинос байни самаранокӣ ва эътимоднокӣ бармегардонад. Репликатсия аз ҳисоби вақти иловагии интизории тасдиқҳо (эътироф) аз пайравон сурат мегирад. Ҳарчанд, азбаски он мувозӣ кор мекунад, такрорӣ ба ҳадди аққал се гиреҳ дорои иҷрои якхелаест, ки ду гиреҳ дорад (ба назар гирифтани афзоиши истифодаи фарохмаҷрои шабака).

Бо истифода аз ин схемаи такрорӣ, Кафка аз зарурати ба таври ҷисмонӣ навиштани ҳар як паём ба диск бо амалиёт худдорӣ мекунад. синхронизатсия (). Ҳар як паёми аз ҷониби истеҳсолкунанда фиристодашуда ба сабти қисмҳо навишта мешавад, аммо тавре ки дар боби 2 баррасӣ шудааст, навиштан ба файл аввал дар буфери системаи оператсионӣ анҷом дода мешавад. Агар ин паём ба мисоли дигари Кафка такрор шавад ва дар хотираи он бошад, гум шудани пешво маънои онро надорад, ки худи паём гум шудааст - он метавонад тавассути як нусхаи ҳамоҳангшуда гирифта шавад.
Рад кардани иҷрои амалиёт синхронизатсия () маънои онро дорад, ки Кафка метавонад паёмҳоро зудтар қабул кунад, зеро он метавонад онҳоро ба хотира нависад. Баръакс, чӣ қадаре ки шумо метавонед аз тоза кардани хотира ба диск худдорӣ кунед, ҳамон қадар беҳтар аст. Аз ин сабаб, барои брокерҳои Кафка 64 ГБ ё бештар аз он хотира ҷудо карда мешавад. Истифодаи ин хотира маънои онро дорад, ки як мисоли Кафка метавонад ба осонӣ бо суръати ҳазорҳо маротиба тезтар аз брокери анъанавии паём кор кунад.

Кафка инчунин метавонад барои татбиқи амалиёт танзим карда шавад синхронизатсия () ба бастаҳои паёмҳо. Азбаски ҳама чиз дар Кафка ба баста нигаронида шудааст, он воқеан барои бисёр ҳолатҳои истифода хеле хуб кор мекунад ва як воситаи муфид барои корбароне мебошад, ки кафолатҳои хеле қавӣ талаб мекунанд. Қисми зиёди иҷрои софи Кафка аз паёмҳое бармеояд, ки ба брокер ҳамчун бастаҳо фиристода мешаванд ва ин паёмҳо аз брокер дар блокҳои пайдарпай бо истифода аз нусхаи сифр амалиётҳо (амалҳое, ки дар рафти онҳо вазифаи нусхабардории маълумот аз як минтақаи хотира ба минтақаи дигар иҷро намешавад). Охирин як нишондиҳандаи калон ва фоидаи захираҳост ва танҳо тавассути истифодаи сохтори асосии гузориш, ки нақшаи тақсимотро муайян мекунад, имконпазир аст.

Дар кластери Кафка нисбат ба як брокери Кафка иҷрои хеле беҳтар имконпазир аст, зеро қисмҳои мавзӯъ метавонанд дар бисёр мошинҳои алоҳида васеъ шаванд.

Натиҷаҳо

Дар ин боб, мо дида баромадем, ки чӣ гуна меъмории Кафка муносибати байни муштариён ва брокерҳоро аз нав тасаввур мекунад, то қубури паёмнависии бениҳоят мустаҳкамро бо интиқоли интиқол чанд маротиба зиёдтар аз брокери паёмҳои муқаррарӣ таъмин кунад. Мо функсияҳоеро, ки он барои ноил шудан ба ин истифода мебарад, муҳокима кардем ва ба таври мухтасар ба меъмории барномаҳое, ки ин функсияро таъмин мекунанд, дида баромадем. Дар боби оянда, мо ба мушкилоти маъмулие, ки барномаҳое, ки ба паёмнависӣ асос ёфтаанд, бояд барои ҳал ва муҳокимаи стратегияҳои мубориза бо онҳо назар кунем. Мо бобро бо нишон додани он, ки чӣ тавр дар бораи технологияҳои паёмнависӣ умуман сӯҳбат кардан мумкин аст, ба охир мерасонем, то шумо мувофиқати онҳоро барои ҳолатҳои истифодаатон арзёбӣ кунед.

Қисми пешинаи тарҷумашуда: Фаҳмидани брокерҳои паёмҳо. Омӯзиши механикаи паёмнависӣ бо ActiveMQ ва Kafka. Боби 1

Тарҷума анҷом дода шуд: tele.gg/middle_java

Давом дорад…

Танҳо корбарони сабтиномшуда метавонанд дар пурсиш иштирок кунанд. даромад, Лутфан.

Оё Кафка дар ташкилоти шумо истифода мешавад?

  • он

  • нест

  • Пештар истифода мешуд, ҳоло не

  • Мо ба нақша гирифтаем

38 корбар овоз доданд. 8 корбар худдорӣ карданд.

Манбаъ: will.com

Илова Эзоҳ