Кафка ва микросервисҳо: шарҳи умумӣ

Кафка ва микросервисҳо: шарҳи умумӣ

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

проблема

Кафка ва микросервисҳо: шарҳи умумӣ

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

Яке аз мушкилоте, ки шумораи зиёди хизматрасонӣ дорад, алоқа аст. Хидмати А аксар вақт мехоҳад маълумотеро бидонад, ки Хадамоти B дорад.Дар ин ҳолат Хидмати А ба хидмати B тавассути API синхронӣ дастрасӣ пайдо мекунад. Хидмати В мехоҳад бидонад, ки бо хидматҳои D ва D чӣ мегузарад ва онҳо, дар навбати худ, ба хидматҳои А ва В таваҷҷӯҳ доранд. Вақте ки ин гуна хидматҳои “кунҷкобу” зиёданд, робитаҳои байни онҳо ба печи печида табдил меёбанд.

Ҳамзамон, хидмати A метавонад ҳар вақт дастнорас гардад. Ва дар ин ҳолат хидматрасонии B ва дигар хидматҳои ба он пайвастшуда бояд чӣ кор кунанд? Ва агар барои анҷом додани амалиёти тиҷорӣ занҷири зангҳои пайдарпайи синхронӣ талаб карда шавад, эҳтимолияти нокомии тамоми амалиёт боз ҳам баландтар мешавад (ва занҷир ҳар қадар дарозтар бошад, ҳамон қадар баландтар аст).

Интихоби технология

Кафка ва микросервисҳо: шарҳи умумӣ

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

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

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

Интихоби системаи миқёспазир ва боэътимоди дорои қобилияти баланд (ҳадди ақал 100к паёми чанд килобайт дар як сония) барои мо хеле муҳим буд.

Дар ин лаҳза, мо бо RabbitMQ (дар rps баланд нигоҳ доштани устувор душвор аст), PGQ аз SkyTools (кифоя нест ва миқёси хуб надорад) ва NSQ (пойдор нест) падруд гуфтем. Мо ҳамаи ин технологияҳоро дар ширкати худ истифода мебарем, аммо онҳо барои мушкилоти ҳалшаванда мувофиқ набуданд.

Минбаъд, мо ба дидани технологияҳое, ки барои мо нав буданд - Apache Kafka, Apache Pulsar ва NATS Streaming оғоз кардем.

Пулсар аввалин шуда партофта шуд. Мо тасмим гирифтем, ки Кафка ва Пулсар ҳалли хеле шабеҳанд. Ва сарфи назар аз он, ки Пулсар аз ҷониби ширкатҳои бузург озмуда шудааст, навтар аст ва таъхири камтарро пешниҳод мекунад (дар назария), мо тасмим гирифтем, ки Кафкаро аз ин ду ҳамчун стандарти воқеии чунин вазифаҳо гузорем. Мо эҳтимолан дар оянда ба Apache Pulsar бармегардем.

Ва ҳоло ду номзад боқӣ мондааст: NATS Streaming ва Apache Kafka. Мо ҳарду роҳи ҳалли масъаларо ба таври муфассал омӯхта будем ва ҳардуи онҳо ба вазифа мувофиқ буданд. Аммо дар ниҳоят, мо аз ҷавонони нисбии NATS Streaming тарсидем (ва аз он, ки яке аз таҳиягарони асосӣ Тайлер Трат тасмим гирифт, ки лоиҳаро тарк кунад ва лоиҳаи худро оғоз кунад - Liftbridge). Ҳамзамон, режими Clustering Streaming NATS имкони миқёси қавии уфуқӣ фароҳам наовард (шояд ин пас аз илова кардани режими тақсимкунӣ дар соли 2017 дигар мушкилот набошад).

Аммо, NATS Streaming технологияи олиҷанобест, ки дар Go навишта шудааст ва аз ҷониби Фонди Cloud Native Computing дастгирӣ мешавад. Баръакси Apache Кафка, он барои кор кардан ба Zookeeper лозим нест (шояд ба наздикй дар бораи Кафка низ хаминро гуфтан мумкин аст), зеро он РАФТ-ро дар дохили худ амалй мекунад. Дар айни замон, идоракунии NATS Streaming осонтар аст. Мо истисно намекунем, ки дар оянда ба ин технология бармегардем.

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

Баррасии Кафка

Пеш аз он ки мо оғоз кунем, ман мехоҳам фавран як китоби олиро тавсия диҳам - "Кафка: Роҳнамои муайян" (тарҷумаи русӣ низ ҳаст, аммо истилоҳот каме фикр мекунанд). Он дорои маълумотест, ки ба шумо барои гирифтани фаҳмиши асосӣ дар бораи Кафка ва ҳатто каме бештар лозим аст. Ҳуҷҷатҳои Apache ва блоги Confluent низ хуб навишта шудаанд ва хондан осон аст.

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

далол

Кафка ва микросервисҳо: шарҳи умумӣ

Брокер барои нигоҳ доштани маълумоти шумо масъул аст. Ҳама маълумотҳо дар шакли дуӣ нигоҳ дошта мешаванд ва брокер дар бораи он ки онҳо чӣ гунаанд ва сохтори онҳо чӣ гуна аст, каме медонад.

Ҳар як намуди ҳодисаи мантиқӣ одатан дар мавзӯи алоҳидаи худ ҷойгир аст. Масалан, ҳодисаи эҷоди таблиғ метавонад ба мавзӯи item.created ва ҳодисаи тағирёбии он ба item.changed афтад. Мавзӯъҳоро метавон ҳамчун таснифи рӯйдодҳо баррасӣ кард. Дар сатҳи мавзӯъ шумо метавонед параметрҳои конфигуратсияро таъин кунед, ба монанди:

  • ҳаҷми маълумоти захирашуда ва/ё синну соли он (retention.bytes, retention.ms);
  • омили зиёдатии маълумот (омили такрорӣ);
  • андозаи максималии як паём (макс. паём. байт);
  • шумораи ҳадди ақали репликаҳои пайваста, ки дар он маълумот ба мавзӯъ навишта мешавад (min.insync.replicas);
  • қобилияти иҷро кардани хатогӣ дар репликаи ақибмондаи ғайрисинхронӣ бо талафоти эҳтимолии маълумот (unclean.leader.election.enable);
  • ва бисёр чизҳои дигар (https://kafka.apache.org/documentation/#topicconfigs).

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

Дар диск маълумот барои ҳар як қисм дар шакли файлҳои сегментӣ нигоҳ дошта мешавад, ба таври нобаёнӣ ба як гигабайт баробар аст (тавассути log.segment.bytes идора карда мешавад). Хусусияти муҳим он аст, ки маълумот аз қисмҳо (ҳангоми нигоҳдорӣ оғоз мешавад) дар сегментҳо нест карда мешавад (шумо як ҳодисаро аз қисм нест карда наметавонед, шумо танҳо як сегментро нест карда метавонед ва танҳо як сегменти ғайрифаъол).

Зокир

Zookeeper ҳамчун мағозаи метамаълумот ва ҳамоҳангсоз амал мекунад. Маҳз ӯ қодир аст бигӯяд, ки брокерҳо зиндаанд (шумо метавонед ба ин бо чашмони зоопарк бо истифода аз zookeeper-shell бо фармон нигаред) ls /brokers/ids), кадом брокер контроллер аст (get /controller), оё қисмҳо бо репликаҳои худ ҳамоҳанг мебошанд (get /brokers/topics/topic_name/partitions/partition_number/state). Инчунин, барои зоотехникӣ истеҳсолкунанда ва истеъмолкунанда аввал барои муайян кардани кадом брокер, ки мавзӯъҳо ва қисмҳо нигоҳ дошта мешаванд, мераванд. Дар ҳолатҳое, ки омили такрорӣ аз 1 калонтар барои мавзӯъ муайян шудааст, зоопарк нишон медиҳад, ки кадом қисмҳо пешсафанд (онҳо ба онҳо навишта ва хонда мешаванд). Дар сурати нокомии брокер, маълумот дар бораи қисмҳои нави пешво дар зоопарк сабт карда мешавад (аз версияи 1.1.0 асинхронӣ, ва ин муҳим аст).

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

Роҳи осонтарини табдил додани маълумоти шумо ба каду ин аз даст додани маълумот аз зоопарк мебошад. Дар чунин сенария фаҳмидани он ки чиро ва аз куҷо хондан хеле душвор хоҳад буд.

тавлидкунанда

Истеҳсолкунанда аксар вақт хидматест, ки мустақиман ба Apache Kafka маълумот менависад. Истеҳсолкунанда мавзӯъеро интихоб мекунад, ки дар он паёмҳои мавзӯии худро нигоҳ дорад ва ба навиштани маълумот ба он шурӯъ мекунад. Масалан, истеҳсолкунанда метавонад хидмати таблиғотӣ бошад. Дар ин ҳолат, он ба мавзӯъҳои мавзӯӣ рӯйдодҳоеро, аз қабили "рекламаи эҷодшуда", "таҷдидшудаи таблиғ", "таблиғ нест" ва ғайра мефиристад. Ҳар як ҳодиса як ҷуфти калид-арзиш аст.

Бо нобаёнӣ, ҳама рӯйдодҳо дар байни қисмҳои мавзӯъҳо бо истифода аз round-robin тақсим карда мешаванд, агар калид муайян нашуда бошад (гум кардани фармоиш) ва тавассути MurmurHash (калид) агар калид мавҷуд бошад (фармоиш дар як қисм).

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

Фарҳанг

Кафка ва микросервисҳо: шарҳи умумӣ

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

Апачи Кафка дар хотир дорад, ки чӣ рӯйдодҳои ахири истеъмолкунанда гирифта шудааст (барои ин мавзӯи хидмат истифода мешавад __consumer__offsets), ба ин васила кафолат медиҳад, ки агар хондан бомуваффақият бошад, истеъмолкунанда як паёмро ду маротиба қабул намекунад. Аммо, агар шумо имкони enable.auto.commit = true -ро истифода баред ва кори пайгирии мавқеи истеъмолкунандаро дар мавзӯъ ба Кафка комилан вогузор кунед, шумо метавонед гум кардани маълумот. Дар коди истеҳсолӣ, аксар вақт мавқеи истеъмолкунанда ба таври дастӣ назорат карда мешавад (таҳиягар лаҳзаи фаро расидани ҳодисаи хонданро назорат мекунад).

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

Натиҷаҳои санҷиш

Кафка ва микросервисҳо: шарҳи умумӣ

Ман дар ин ҷо бисёр матни тавзеҳотӣ наменависам, танҳо натиҷаҳои бадастомадаро мубодила мекунам. Санҷиш дар 3 мошини физикӣ (12 CPU, 384 ГБ RAM, 15k SAS DISK, 10GBit/s Net) гузаронида шуд), брокерҳо ва зоопарк дар lxc ҷойгир карда шуданд.

Санҷиши иҷроиш

Дар рафти санҷиш натиҷаҳои зерин ба даст оварда шуданд.

  • Суръати сабти паёмҳои 1КБ ҳамзамон аз ҷониби 9 истеҳсолкунанда 1300000 ҳодиса дар як сония аст.
  • Суръати хондани паёмҳои 1КБ ҳамзамон аз ҷониби 9 истеъмолкунанда 1500000 ҳодиса дар як сонияро ташкил медиҳад.

Санҷиши таҳаммулпазирии хатогиҳо

Дар рафти санчиш натичахои зерин ба даст оварда шуданд (3 брокер, 3 зоопарк).

  • Қатъи ғайримуқаррарии яке аз брокерҳо боиси қатъ шудани кластер ё дастнорас намегардад. Кор ба таври муқаррарӣ идома дорад, аммо брокерҳои боқимонда бори гарон доранд.
  • Қатъи ғайримуқаррарии ду брокер дар сурати кластери се брокер ва min.isr = 2 боиси он мегардад, ки кластер барои навиштан дастнорас бошад, аммо барои хондан дастрас бошад. Агар min.isr = 1 бошад, кластер ҳам барои хондан ва ҳам навиштан дастрас боқӣ мемонад. Аммо, ин режим ба талаботи амнияти баланди додаҳо мухолиф аст.
  • Хомӯшии ғайримуқаррарии яке аз серверҳои Zookeeper боиси қатъ шудани кластер ё дастнорас мегардад. Кор чун муқаррарӣ идома дорад.
  • Хомӯшии ғайримуқаррарии ду сервери Zookeeper ба он оварда мерасонад, ки кластер то барқарор шудани ҳадди аққал яке аз серверҳои Zookeeper дастнорас мешавад. Ин изҳорот барои кластери Zookeeper аз 3 сервер дуруст аст. Дар натиҷа, пас аз таҳқиқот тасмим гирифта шуд, ки кластери Zookeeper ба 5 сервер зиёд карда шавад, то таҳаммулпазирии хатогиҳоро афзоиш диҳад.

Кафка ҳамчун хидмат

Кафка ва микросервисҳо: шарҳи умумӣ

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

  • Data-bus тамоми вазифаҳои марбут ба ҳамгироӣ бо Кафкаро (амалӣ ва конфигуратсияи истеъмолкунандагон ва истеҳсолкунандагон, мониторинг, огоҳӣ, сабткунӣ, миқёс ва ғайра) ба ӯҳда гирифт. Ҳамин тариқ, ҳамгироӣ бо брокери паём то ҳадди имкон содда аст.

  • Data-bus ба мо имкон дод, ки барои кор бо Кафка аз забон ё китобхонаи мушаххас абстракт кунем.

  • Data-bus ба хидматҳои дигар имкон дод, ки қабати нигоҳдорӣ абзорро дур кунанд. Шояд дар як лаҳза мо Кафкаро ба Пулсар иваз кунем ва касе чизеро пай набарад (ҳама хидматҳо танҳо дар бораи API-и data-bus медонанд).

  • Data-bus тасдиқи схемаҳои рӯйдодҳоро ба ӯҳда гирифт.

  • Аутентификатсия бо истифода аз data-bus амалӣ карда мешавад.

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

  • Data-bus ба мо имкон дод, ки хусусиятҳоеро, ки дар Кафка нестанд, илова кунем (ба монанди аудити мавзӯъҳо, мониторинги аномалияҳо дар кластер, эҷоди DLQ ва ғайра).

  • Data-bus ба шумо имкон медиҳад, ки ба таври мутамарказ барои ҳама хидматҳо нокомиро амалӣ кунед.

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

Албатта, ягон тири нуқра вуҷуд надорад ва ин равиш маҳдудиятҳои худро дорад.

  • Бар хилофи китобхонаҳои тарафи сеюм, маълумот-автобус бояд дар дохили хона дастгирӣ карда шавад.
  • Data-bus шумораи мутақобила байни хидматҳо ва брокери паёмиро зиёд мекунад, ки дар муқоиса бо Кафка пасттар кор мекунад.
  • На ҳама чизро аз хидматҳо ба осонӣ пинҳон кардан мумкин аст; мо намехоҳем, ки функсияҳои KSQL ё Streams-ро дар автобус такрор кунем, аз ин рӯ баъзан мо бояд ба хидматҳо мустақиман иҷозат диҳем.

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

PS Ташаккур ба дӯстдухтари ман Екатерина Обаляева, барои тасвирҳои ҷолиб барои ин мақола. Агар шумо онҳоро дӯст медоштед, дар ин ҷо мисолҳои бештар вуҷуд доранд.

Манбаъ: will.com

Хостинги боэътимодро барои сайтҳо бо муҳофизати DDoS, серверҳои VPS VDS харед 🔥 Харидани хостинги боэътимоди вебсайт бо муҳофизати DDoS, серверҳои VPS VDS | ProHoster