Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Ki sa ki ka fòse yon gwo konpayi tankou Lamoda, ak yon pwosesis rasyonalize ak plizyè douzèn sèvis entèkonekte, chanje siyifikativman apwòch li? Motivasyon ka konplètman diferan: soti nan lejislatif nan dezi a fè eksperyans nannan nan tout pwogramè yo.

Men, sa pa vle di ke ou pa ka konte sou benefis adisyonèl. Sergey Zaika pral di w ki sa egzakteman ou ka genyen si w aplike API evènman yo sou Kafka (fewald). Gen pral definitivman tou pale sou gwo vaksen ak dekouvèt enteresan - eksperyans la pa ka fè san yo pa yo.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Limit responsabilite nou: Atik sa a baze sou materyèl ki soti nan yon rankont Sergey te fè nan Novanm 2018 sou HighLoad++. Eksperyans dirèk Lamoda nan travay ak Kafka te atire moun k ap koute yo pa mwens pase lòt rapò sou orè a. Nou panse ke sa a se yon egzanp ekselan nan lefèt ke ou ka epi ou ta dwe toujou jwenn moun ki gen lide menm jan an, ak òganizatè yo nan HighLoad ++ ap kontinye eseye kreye yon atmosfè fezab sa a.

Konsènan pwosesis la

Lamoda se yon gwo platfòm e-commerce ki gen pwòp sant kontak li, sèvis livrezon (ak anpil afilye), yon estidyo foto, yon gwo depo, ak tout bagay sa yo kouri sou pwòp lojisyèl li yo. Gen plizyè douzèn metòd peman, patnè b2b ki ka itilize kèk oswa tout sèvis sa yo epi ki vle konnen enfòmasyon ajou sou pwodwi yo. Anplis de sa, Lamoda opere nan twa peyi san konte Federasyon Larisi la ak tout bagay se yon ti kras diferan la. Nan total, gen pwobableman plis pase yon santèn fason yo konfigirasyon yon nouvo lòd, ki dwe trete nan pwòp fason li yo. Tout bagay sa yo travay avèk èd nan plizyè douzèn sèvis ki pafwa kominike nan fason ki pa evidan. Genyen tou yon sistèm santral ki gen responsablite prensipal se estati lòd. Nou rele li BOB, mwen travay avè l.

Zouti ranbousman ak API ki baze sou evènman yo

Mo evènman-kondwi a se byen rache; yon ti kras pi lwen nou pral defini an plis detay ki sa sa vle di. Mwen pral kòmanse ak kontèks kote nou deside eseye apwòch API ki baze sou evènman nan Kafka.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Nan nenpòt magazen, anplis lòd pou kliyan yo peye, gen fwa lè magazen an oblije retounen lajan paske pwodwi a pa t 'koresponn ak kliyan an. Sa a se yon pwosesis relativman kout: nou klarifye enfòmasyon an, si sa nesesè, epi transfere lajan an.

Men, retounen nan te vin pi konplike akòz chanjman nan lejislasyon, epi nou te oblije aplike yon mikwosèvis separe pou li.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Motivasyon nou:

  1. Lwa FZ-54 - an ti bout tan, lalwa mande pou rapòte bay biwo taks la sou chak tranzaksyon monetè, kit se yon retounen oswa yon resi, nan yon SLA jistis kout nan kèk minit. Nou menm, kòm yon konpayi e-commerce, fè yon anpil nan operasyon yo. Teknikman, sa vle di nouvo responsablite (ak Se poutèt sa yon nouvo sèvis) ak amelyorasyon nan tout sistèm ki enplike yo.
  2. BOB fann se yon pwojè entèn nan konpayi an soulaje BOB nan yon gwo kantite responsablite ki pa debaz epi redwi konpleksite jeneral li yo.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Dyagram sa a montre prensipal sistèm Lamoda yo. Koulye a, pifò nan yo gen plis yon konstelasyon 5-10 mikwosèvis alantou yon monolit k ap diminye. Yo ap grandi tou dousman, men nou ap eseye fè yo pi piti, paske deplwaye fragman chwazi nan mitan an se pè - nou pa ka pèmèt li tonbe. Nou oblije rezève tout echanj (flèch yo) epi pran an kont lefèt ke nenpòt nan yo ka vire yo pa disponib.

BOB tou gen anpil echanj: sistèm peman, sistèm livrezon, sistèm notifikasyon, elatriye.

Teknikman BOB se:

  • ~150k liy kòd + ~100k liy tès;
  • php7.2 + Zend 1 & Symfony Components 3;
  • > 100 API & ~ 50 entegrasyon sortan;
  • 4 peyi ki gen pwòp lojik biznis yo.

Deplwaye BOB se chè ak douloure, kantite kòd ak pwoblèm li rezoud se konsa ke pèsonn pa ka mete tout bagay nan tèt yo. An jeneral, gen anpil rezon pou senplifye li.

Pwosesis Retounen

Okòmansman, de sistèm yo patisipe nan pwosesis la: BOB ak Peman. Koulye a, de lòt parèt:

  • Sèvis Fiskalizasyon, ki pral pran swen pwoblèm ak fiskalizasyon ak kominikasyon ak sèvis ekstèn.
  • Zouti ranbousman, ki tou senpleman gen nouvo echanj pou yo pa gonfle BOB la.

Koulye a, pwosesis la sanble sa a:

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

  1. BOB resevwa yon demann pou yon ranbousman.
  2. BOB pale de Zouti Ranbousman sa a.
  3. Zouti Ranbousman an di Peman: "Retounen lajan an."
  4. Peman retounen lajan an.
  5. Zouti Ranbousman ak BOB senkronize estati youn ak lòt, paske pou kounye a yo tou de bezwen li. Nou poko pare pou chanje nèt nan Zouti Ranbousman an, paske BOB gen yon UI, rapò pou kontablite, ak an jeneral anpil done ki pa ka transfere fasil. Ou dwe chita sou de chèz.
  6. Demann pou fiskalizasyon an ale.

Kòm yon rezilta, nou te fè yon kalite otobis evènman sou Kafka - otobis evènman, kote tout bagay te kòmanse. Hurray, kounye a nou gen yon sèl pwen nan echèk (sarcasm).

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Avantaj yo ak dezavantaj yo trè evidan. Nou te fè yon otobis, ki vle di ke kounye a tout sèvis depann sou li. Sa a senplifye konsepsyon an, men entwodui yon sèl pwen echèk nan sistèm nan. Kafka pral fè aksidan, pwosesis la ap sispann.

Ki sa ki se yon evènman-kondwi API

Yon bon repons pou kesyon sa a se nan rapò Martin Fowler (GOTO 2017) "Siyifikasyon yo anpil nan evènman-kondwi Achitekti".

Yon ti tan sa nou te fè:

  1. Wrap moute tout echanj asynchrone via depo evènman yo. Olye pou nou enfòme chak konsomatè ki enterese sou yon chanjman estati sou rezo a, nou ekri yon evènman sou yon chanjman estati nan yon depo santralize, ak konsomatè ki enterese nan sijè a li tout sa ki parèt soti nan la.
  2. Evènman an nan ka sa a se yon notifikasyon (notifikasyon) ke yon bagay te chanje yon kote. Pou egzanp, estati lòd la chanje. Yon konsomatè ki enterese nan kèk done ki akonpaye chanjman estati a ki pa enkli nan notifikasyon an ka jwenn estati li tèt li.
  3. Opsyon maksimòm lan se apwovizyone evènman konplè, transfè leta, nan evènman ki gen tout enfòmasyon ki nesesè pou tretman an: ki kote li soti ak ki estati li te ale nan, ki jan egzakteman done yo chanje, elatriye kesyon an sèlman se posibilite a ak kantite enfòmasyon ke ou kapab peye pou estoke.

Kòm yon pati nan lansman Zouti Ranbousman an, nou te itilize twazyèm opsyon an. Pwosesis evènman sa a senplifye paske pa te gen okenn bezwen ekstrè enfòmasyon detaye, plis li elimine senaryo a kote chak evènman nouvo jenere yon pete nan klarifye jwenn demann nan men konsomatè yo.

Sèvis Zouti Ranbousman pa chaje, Se konsa, Kafka gen plis nan yon gou nan plim la pase yon nesesite. Mwen pa panse ke si sèvis ranbousman an te vin tounen yon pwojè gwo chaj, biznis ta kontan.

Async echanj AS IS

Pou echanj asynchrone, depatman PHP anjeneral itilize RabbitMQ. Nou kolekte done yo pou demann lan, mete yo nan yon keu, epi konsomatè a nan menm sèvis la li li epi voye li (oswa pa voye li). Pou API a li menm, Lamoda aktivman itilize Swagger. Nou desine yon API, dekri li nan Swagger, epi jenere kòd kliyan ak sèvè. Nou itilize tou yon JSON RPC 2.0 yon ti kras amelyore.

Nan kèk kote yo itilize otobis ESB, kèk ap viv sou activeMQ, men, an jeneral, RabbitMQ - estanda.

Async echanj TO BE

Lè konsepsyon echanj atravè evènman-otobis, yon analoji ka remonte. Nou menm tou nou dekri echanj done nan lavni atravè deskripsyon estrikti evènman yo. Fòma yaml a, nou te oblije fè jenerasyon kòd la tèt nou, dèlko a kreye DTO dapre spesifikasyon la epi anseye kliyan ak serveurs yo travay avèk yo. Jenerasyon ale nan de lang - golang ak php. Sa a ede kenbe bibliyotèk yo konsistan. Dèlko a ekri an golang, se poutèt sa li te resevwa non gogi.

Evènman-sourcing sou Kafka se yon bagay tipik. Gen yon solisyon soti nan vèsyon prensipal antrepriz Kafka Confluent, gen nakadi, yon solisyon soti nan domèn frè Zalando. Nou motivasyon yo kòmanse ak vaniy Kafka - sa vle di kite solisyon an gratis jiskaske nou finalman deside si nou pral sèvi ak li toupatou, epi tou kite tèt nou espas pou manevwe ak amelyorasyon: nou vle sipò pou nou. JSON RPC 2.0, jeneratè pou de lang epi ann wè ki lòt bagay.

Li ironik ke menm nan yon ka kontan konsa, lè gen yon biznis apeprè menm jan an, Zalando, ki te fè yon solisyon apeprè menm jan an, nou pa ka sèvi ak li efektivman.

Modèl achitekti nan lansman an se jan sa a: nou li dirèkteman nan Kafka, men ekri sèlman nan evènman-otobis. Gen anpil pare pou lekti nan Kafka: koutye, balanse, epi li se plis oswa mwens pare pou dechèl orizontal, mwen te vle kenbe sa a. Nou te vle ranpli anrejistreman an atravè yon sèl Gateway aka Evènman-otobis, e isit la se poukisa.

Evènman-otobis

Oswa yon otobis evènman. Sa a se tou senpleman yon pòtay http apatrid, ki pran plizyè wòl enpòtan:

  • Pwodui Validasyon - nou tcheke si evènman yo satisfè espesifikasyon nou yo.
  • Sistèm mèt evènman, se sa ki, sa a se sistèm prensipal la ak sèlman nan konpayi an ki reponn kesyon an nan ki evènman ak ki estrikti yo konsidere kòm valab. Validasyon tou senpleman enplike kalite done ak enums entèdi presize kontni.
  • Fonksyon hash pou sharding - estrikti mesaj Kafka a se kle-valè epi lè l sèvi avèk hash nan kle yo kalkile kote yo mete l.

Poukisa

Nou travay nan yon gwo konpayi ak yon pwosesis rasyonalize. Poukisa chanje anyen? Sa a se yon eksperyans, e nou espere rekòlte plizyè benefis.

1:n+1 echanj (yonn pou anpil)

Kafka fè li trè fasil pou konekte nouvo konsomatè yo ak API a.

Ann di ou gen yon anyè ke ou bezwen kenbe ajou nan plizyè sistèm nan yon fwa (ak nan kèk nouvo). Précédemment, nou te envante yon pake ki aplike set-API, epi sistèm mèt la te enfòme sou adrès konsomatè yo. Koulye a, sistèm mèt la voye mizajou sou sijè a, ak tout moun ki enterese li li. Yon nouvo sistèm parèt - nou te siyen li pou sijè a. Wi, tou pakèt, men pi senp.

Nan ka ranbousman-zouti, ki se yon moso nan BOB, li bon pou nou kenbe yo senkronize atravè Kafka. Peman di ke yo te retounen lajan an: BOB, RT te jwenn enfòmasyon sou sa a, chanje estati yo, Sèvis Fiskalizasyon te jwenn sou sa a epi li te bay yon chèk.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Nou gen plan pou kreye yon Sèvis Notifikasyon inifye ki ta enfòme kliyan an sou nouvèl konsènan lòd/retounen li yo. Koulye a, responsablite sa a gaye ant sistèm yo. Li pral ase pou nou anseye Sèvis Notifikasyon yo trape enfòmasyon ki enpòtan nan men Kafka epi reponn a li (epi enfim notifikasyon sa yo nan lòt sistèm). Pa gen okenn nouvo echanj dirèk yo pral mande.

Done kondwi

Enfòmasyon ki genyen ant sistèm yo vin transparan - kèlkeswa "salan antrepwiz" ou genyen ak kèlkeswa jan rès ou ye. Lamoda gen yon depatman Data Analytics ki kolekte done ki soti nan sistèm yo epi mete yo nan yon fòm ki kapab itilize ankò, tou de pou biznis ak pou sistèm entèlijan. Kafka pèmèt ou byen vit ba yo anpil done epi kenbe enfòmasyon sa a ajou.

Jounal replikasyon

Mesaj yo pa disparèt apre yo fin li, tankou nan RabbitMQ. Lè yon evènman gen ase enfòmasyon pou trete, nou gen yon istwa nan dènye chanjman nan objè a, epi, si yo vle, kapasite nan aplike chanjman sa yo.

Peryòd depo jounal replikasyon an depann de entansite ekri sou sijè sa a; Kafka pèmèt ou fikse limit sou tan depo ak volim done. Pou sijè entansif, li enpòtan ke tout konsomatè yo gen tan li enfòmasyon an anvan li disparèt, menm nan ka a nan inoperabilite kout tèm. Anjeneral li posib pou konsève done pou inite jou, ki ase ase pou sipò.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Apre sa, yon ti rakonte dokiman an, pou moun ki pa abitye ak Kafka (foto a soti tou nan dokiman an)

AMQP gen keu: nou ekri mesaj nan yon keu pou konsomatè a. Tipikman, yon sèl keu trete pa yon sistèm ak menm lojik biznis la. Si ou bezwen notifye plizyè sistèm, ou ka anseye aplikasyon an ekri nan plizyè ke moun kap kriye oswa konfigirasyon echanj ak mekanis nan fanout, ki klon yo tèt li.

Kafka gen yon abstraksyon menm jan an sijè, kote ou ekri mesaj, men yo pa disparèt apre ou fin li. Pa default, lè ou konekte ak Kafka, ou resevwa tout mesaj epi ou gen opsyon pou sove kote ou te kite. Sa vle di, ou li sekans, ou ka pa make mesaj la kòm li, men sove id ki soti nan ki ou ka Lè sa a, kontinye li. Id ou etabli sou yo rele konpansasyon, epi mekanis lan se konpanse komèt.

An konsekans, diferan lojik ka aplike. Pou egzanp, nou gen BOB nan 4 ka pou diferan peyi - Lamoda se nan Larisi, Kazakhstan, Ikrèn, Byelorisi. Depi yo deplwaye separeman, yo gen yon ti kras diferan konfigirasyon ak pwòp lojik biznis yo. Nou endike nan mesaj la ki peyi li refere a. Chak konsomatè BOB nan chak peyi li ak yon groupId diferan, epi si mesaj la pa aplike pou yo, yo sote li, i.e. imedyatman komèt konpanse +1. Si sèvis peman nou an li menm sijè a, li fè sa ak yon gwoup separe, kidonk konpanse pa kwaze.

Kondisyon evènman yo:

  • Done konplè. Mwen ta renmen evènman an gen ase done pou li ka trete.

  • Entegrite. Nou delege nan Events-bus verifikasyon ke evènman an konsistan epi li ka trete li.
  • Lòd la enpòtan. Nan ka yon retou, nou oblije travay ak listwa. Avèk notifikasyon, lòd la pa enpòtan, si yo se notifikasyon omojèn, imel la pral menm kèlkeswa lòd ki te rive an premye. Nan ka yon ranbousman, gen yon pwosesis klè; si nou chanje lòd la, eksepsyon ap parèt, ranbousman an pa pral kreye oswa trete - nou pral fini nan yon estati diferan.
  • Konsistans. Nou gen yon magazen, epi kounye a nou kreye evènman olye pou yo yon API. Nou bezwen yon fason rapid ak bon mache transmèt enfòmasyon sou nouvo evènman ak chanjman nan sa ki deja egziste nan sèvis nou yo. Sa a se reyalize lè l sèvi avèk yon spesifikasyon komen nan yon depo git separe ak dèlko kòd. Se poutèt sa, kliyan ak sèvè nan sèvis diferan yo kowòdone.

Kafka nan Lamoda

Nou gen twa enstalasyon Kafka:

  1. mòso bwa;
  2. R&D;
  3. Evènman-otobis.

Jodi a nou ap pale sèlman sou dènye pwen an. Nan evènman-otobis, nou pa gen enstalasyon trè gwo - 3 koutye (sèvè) ak sèlman 27 sijè. Kòm yon règ, yon sijè se yon sèl pwosesis. Men, sa a se yon pwen sibtil, epi nou pral manyen sou li kounye a.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Pi wo a se graf rps la. Pwosesis ranbousman an make ak yon liy turkwaz (wi, youn nan aks X), ak liy woz la se pwosesis aktyalizasyon kontni an.

Katalòg Lamoda a gen dè milyon de pwodwi, epi done yo mete ajou tout tan. Gen kèk koleksyon ki ale nan mòd, nouvo yo lage pou ranplase yo, ak nouvo modèl yo toujou ap parèt nan katalòg la. Nou eseye predi sa ki pral enteresan pou kliyan nou yo demen, kidonk nou toujou ap achte nouvo bagay, foto yo ak mete ajou ekspozisyon an.

Woz pik yo se mizajou pwodwi, se sa ki, chanjman nan pwodwi yo. Li ka wè ke mesye yo te pran foto, te pran foto, ak Lè sa a ankò! — chaje yon pake evènman yo.

Ka itilize Lamoda Evènman yo

Nou itilize achitekti konstwi a pou operasyon sa yo:

  • Suivi estati retounen: apèl-a-aksyon ak Suivi estati nan tout sistèm ki enplike yo. Peman, estati, fiskalizasyon, notifikasyon. Isit la nou teste apwòch la, fè zouti, kolekte tout pinèz yo, ekri dokiman epi di kòlèg nou yo ki jan yo sèvi ak li.
  • Mete ajou kat pwodwi yo: konfigirasyon, meta-done, karakteristik. Yon sistèm li (ki montre), ak plizyè ekri.
  • Imèl, pouse ak sms: lòd la te kolekte, lòd la te rive, retounen nan te aksepte, elatriye, gen yon anpil nan yo.
  • Stock, renouvèlman depo - aktyalizasyon quantitative nan atik, jis nimewo: rive nan depo a, retounen. Li nesesè ke tout sistèm ki asosye ak rezèv machandiz opere ak done ki pi aktyèl yo. Kounye a, sistèm aktyalizasyon stock la byen konplèks; Kafka pral senplifye li.
  • Analiz done (R&D depatman), zouti ML, analytics, estatistik. Nou vle enfòmasyon yo transparan - Kafka byen adapte pou sa.

Koulye a, pati ki pi enteresan sou gwo monte desann yo ak dekouvèt enteresan ki te fèt pandan sis mwa ki sot pase yo.

Pwoblèm konsepsyon

Ann di nou vle fè yon nouvo bagay - pou egzanp, transfere tout pwosesis livrezon an nan Kafka. Koulye a, yon pati nan pwosesis la aplike nan Lòd Processing nan BOB. Gen yon modèl estati dèyè transfè a nan yon lòd nan sèvis la livrezon, mouvman nan yon depo entèmedyè, ak sou sa. Gen yon monolit antye, menm de, plis yon pakèt API dedye a livrezon. Yo konnen anpil plis sou livrezon.

Sa yo sanble zòn ki sanble, men Pwosesis Lòd la nan BOB ak Sistèm Shipping la gen estati diferan. Pou egzanp, kèk sèvis courrier pa voye estati entèmedyè, men sèlman sa yo final: "livre" oswa "pèdi". Gen lòt, okontrè, rapòte an detay sou mouvman machandiz yo. Tout moun gen pwòp règ validasyon yo: pou kèk moun, imel la valab, ki vle di li pral trete; pou lòt moun li pa valab, men lòd la ap toujou trete paske gen yon nimewo telefòn pou kontakte, epi yon moun pral di ke yon lòd sa a pa pral trete ditou.

Done kouran

Nan ka a nan Kafka, kesyon an nan òganize koule nan done rive. Travay sa a enplike nan chwazi yon estrateji ki baze sou plizyè pwen; ann ale nan yo tout.

Nan yon sijè oswa nan diferan sijè?

Nou gen yon spesifikasyon evènman. Nan BOB nou ekri ke tèl ak tèl lòd bezwen yo dwe delivre, epi endike: nimewo a lòd, konpozisyon li yo, kèk SKU ak kòd bar, elatriye. Lè machandiz yo rive nan depo a, livrezon an pral kapab resevwa estati, timestamps ak tout sa ki nesesè. Men, Lè sa a, nou vle resevwa mizajou sou done sa yo nan BOB. Nou gen yon pwosesis ranvèse pou resevwa done nan livrezon. Èske sa a menm evènman an? Oswa èske sa a se yon echanj separe ki merite pwòp sijè pa li?

Gen plis chans, yo pral trè menm jan an, ak tantasyon an fè yon sijè se pa san fondman, paske yon sijè separe vle di konsomatè separe, konfigirasyon separe, yon jenerasyon separe nan tout bagay sa yo. Men, pa yon reyalite.

Nouvo jaden oswa nouvo evènman?

Men, si ou itilize menm evènman yo, Lè sa a, yon lòt pwoblèm rive. Pou egzanp, se pa tout sistèm livrezon ka jenere kalite DTO ke BOB ka jenere. Nou voye yo id la, men yo pa sove li paske yo pa bezwen li, ak nan pwen de vi nan kòmanse pwosesis evènman-otobis la, se jaden sa a obligatwa.

Si nou prezante yon règ pou evènman-otobis ke jaden sa a se obligatwa, Lè sa a, nou oblije mete lòt règ validation nan BOB la oswa nan okipe evènman an kòmanse. Validasyon kòmanse gaye nan tout sèvis la - sa a pa trè pratik.

Yon lòt pwoblèm se tantasyon pou devlopman incrémentielle. Yo di nou ke yon bagay bezwen ajoute nan evènman an, e petèt, si nou panse sou li, li ta dwe te yon evènman separe. Men, nan konplo nou an, yon evènman separe se yon sijè apa. Yon sijè separe se tout pwosesis mwen dekri pi wo a. Pwomotè a tante tou senpleman ajoute yon lòt jaden nan chema JSON la epi rejenere li.

Nan ka ranbousman, nou te rive nan evènman an nan evènman nan mwatye nan yon ane. Nou te gen yon sèl meta-evènman ki rele aktyalizasyon ranbousman, ki te gen yon jaden kalite ki dekri ki sa aktyalizasyon sa a te aktyèlman. Poutèt sa, nou te gen "bèl bagay" switch ak validateur ki te di nou ki jan yo valide evènman sa a ak kalite sa a.

Evènman vèsyon

Pou valide mesaj nan Kafka ou ka itilize Avro, men li te nesesè imedyatman kouche sou li epi sèvi ak Confluent. Nan ka nou an, nou dwe fè atansyon ak vèsyon. Li p ap toujou posib pou relire mesaj ki soti nan jounal replikasyon an paske modèl la "kite". Fondamantalman, li vire soti yo bati vèsyon pou ke modèl la se bak konpatib: pou egzanp, fè yon jaden pou yon ti tan si ou vle. Si diferans yo twò fò, nou kòmanse ekri nan yon nouvo sijè, epi transfere kliyan lè yo fini li ansyen an.

Garanti lòd lekti nan patisyon yo

Sijè andedan Kafka yo divize an patisyon. Sa a pa trè enpòtan pandan n ap desine antite ak echanj, men li enpòtan lè n ap deside ki jan yo konsome ak echèl li.

Nan ka abityèl la, ou ekri yon sijè nan Kafka. Pa default, yo itilize yon patisyon, epi tout mesaj nan sijè sa a ale nan li. Ak konsomatè a konsekan li mesaj sa yo sekans. Ann di kounye a nou bezwen elaji sistèm nan pou mesaj yo li pa de konsomatè diferan. Si, pou egzanp, w ap voye SMS, Lè sa a, ou ka di Kafka fè yon patisyon adisyonèl, epi Kafka pral kòmanse divize mesaj yo an de pati - mwatye isit la, mwatye isit la.

Ki jan Kafka divize yo? Chak mesaj gen yon kò (nan ki nou estoke JSON) ak yon kle. Ou ka tache yon fonksyon hash nan kle sa a, ki pral detèmine ki patisyon mesaj la pral antre nan.

Nan ka nou an ak ranbousman, sa a enpòtan, si nou pran de patisyon, Lè sa a, gen yon chans ke yon konsomatè paralèl pral trete dezyèm evènman an anvan premye a epi pral gen pwoblèm. Fonksyon hash la asire ke mesaj ki gen menm kle a fini nan menm patisyon an.

Evènman vs kòmandman

Sa a se yon lòt pwoblèm nou te rankontre. Evènman se yon evènman sèten: nou di ke yon bagay te pase yon kote (something_happened), pou egzanp, yo te anile yon atik oswa yon ranbousman te fèt. Si yon moun koute evènman sa yo, Lè sa a, dapre "atik anile," antite ranbousman an pral kreye, epi "ranbousman ki te fèt" yo pral ekri yon kote nan konfigirasyon yo.

Men, anjeneral, lè ou konsepsyon evènman, ou pa vle ekri yo pou gremesi - ou konte sou lefèt ke yon moun pral li yo. Gen yon gwo tantasyon pou ekri pa yon bagay_ki te pase (item_anile, ranbousman_ranbouse), men yon bagay_ta dwe_fè. Pou egzanp, atik la pare yo dwe retounen.

Sou yon bò, li sijere ki jan evènman an pral itilize. Nan lòt men an, li son anpil mwens tankou yon non evènman nòmal. Anplis, li pa lwen isit la nan lòd la fè_something. Men, ou pa gen okenn garanti ke yon moun li evènman sa a; epi si ou li li, Lè sa a, ou li li avèk siksè; epi si ou li li avèk siksè, Lè sa a, ou te fè yon bagay, e ke yon bagay te reyisi. Moman yon evènman vin fè_something, fidbak vin nesesè, e sa se yon pwoblèm.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Nan echanj asynchrone nan RabbitMQ, lè ou li mesaj la, ale nan http, ou gen yon repons - omwen ke mesaj la te resevwa. Lè ou ekri Kafka, gen yon mesaj ke ou te ekri Kafka, men ou pa konnen anyen sou fason li te trete.

Kidonk, nan ka nou an, nou te oblije prezante yon evènman repons epi mete siveyans pou si anpil evènman yo te voye, apre yon tan ak yon tan menm kantite evènman repons yo ta dwe rive. Si sa pa rive, Lè sa a, yon bagay sanble te ale mal. Pou egzanp, si nou te voye evènman "item_ready_to_refund" la, nou espere ke yo pral kreye yon ranbousman, lajan an pral retounen nan kliyan an, epi yo pral "money_refunded" evènman an voye ban nou. Men, sa a se pa sèten, kidonk siveyans nesesè.

Nuances

Gen yon pwoblèm jistis evidan: si ou li nan yon sijè sekans, epi ou gen kèk mesaj move, konsomatè a pral tonbe, epi ou pa pral ale pi lwen. Ou bezwen sispann tout konsomatè yo, komèt konpanse pi lwen pou kontinye lekti.

Nou te konnen sou li, nou te konte sou li, e poutan li te rive. Lè sa a te rive paske evènman an te valab nan pwen de vi evènman-otobis la, evènman an te valab nan pwen de vi nan validateur aplikasyon an, men li pa te valab nan pwen de vi nan PostgreSQL, paske nan sistèm nou an MySQL. ak UNSIGNED INT sistèm lan te gen PostgreSQL jis ak INT. Gwosè li se yon ti kras pi piti, ak Id la pa t 'anfòm. Symfony te mouri ak yon eksepsyon. Nou, nan kou, kenbe eksepsyon a paske nou te konte sou li, epi yo te ale nan komèt konpanse sa a, men anvan sa nou te vle ogmante kontwa a pwoblèm, depi mesaj la te trete san siksè. Kontwa yo nan pwojè sa a tou nan baz done a, ak Symfony te deja fèmen kominikasyon ak baz done a, ak dezyèm eksepsyon an touye tout pwosesis la san yo pa yon chans komèt konpanse.

Sèvis la kouche pou kèk tan - erezman, ak Kafka sa a pa tèlman mal, paske mesaj yo rete. Lè travay yo retabli, ou ka fini li yo. Li konfòtab.

Kafka gen kapasite pou mete yon konpanse abitrè atravè zouti. Men, pou fè sa, ou bezwen sispann tout konsomatè yo - nan ka nou an, prepare yon lage separe nan ki pa pral gen konsomatè yo, redeplwaman. Lè sa a, nan Kafka ou ka chanje konpanse a atravè zouti, epi mesaj la pral pase.

Yon lòt nuans - jounal replikasyon vs rdkafka.so - gen rapò ak spesifik yo nan pwojè nou an. Nou itilize PHP, ak nan PHP, kòm yon règ, tout bibliyotèk kominike ak Kafka atravè repozitwa a rdkafka.so, ak Lè sa a, gen kèk kalite anbalaj. Petèt sa yo se difikilte pèsonèl nou yo, men li te tounen soti ke tou senpleman re-li yon moso nan sa nou te deja li pa tèlman fasil. An jeneral, te gen pwoblèm lojisyèl.

Retounen nan spesifik yo nan travay ak patisyon, li ekri dwa nan dokiman an konsomatè>= patisyon sijè. Men, mwen te jwenn enfòmasyon sou sa a pi ta ke mwen ta renmen. Si ou vle echèl epi gen de konsomatè, ou bezwen omwen de patisyon. Sa vle di, si ou te gen yon patisyon kote 20 mil mesaj te akimile, epi ou te fè yon nouvo, kantite mesaj yo pa pral egalize byento. Se poutèt sa, yo nan lòd yo gen de konsomatè paralèl, ou bezwen fè fas ak patisyon.

Siveyans

Mon krwar lafason ki nou monitor i ava pli kler ki bann problenm i annan dan lapros ki egziste.

Pou egzanp, nou kalkile konbyen pwodwi nan baz done a dènyèman chanje estati yo, epi, kòmsadwa, evènman yo ta dwe fèt ki baze sou chanjman sa yo, epi nou voye nimewo sa a nan sistèm siveyans nou an. Lè sa a, soti nan Kafka nou jwenn dezyèm nimewo a, konbyen evènman yo te aktyèlman anrejistre. Li evidan, diferans ki genyen ant de nimewo sa yo ta dwe toujou zewo.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Anplis de sa, ou bezwen kontwole ki jan pwodiktè a ap fè, si evènman-otobis resevwa mesaj, ak ki jan konsomatè a ap fè. Pou egzanp, nan tablo ki anba yo, Zouti Ranbousman ap fè byen, men BOB klèman gen kèk pwoblèm (pik ble).

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Mwen deja mansyone gwoup konsomatè lag. Apeprè pale, sa a se kantite mesaj ki pa li yo. An jeneral, konsomatè nou yo travay byen vit, kidonk lag la anjeneral 0, men pafwa ka gen yon pik kout tèm. Kafka ka fè sa soti nan bwat la, men ou bezwen mete yon sèten entèval.

Gen yon pwojè rfujki pral ba w plis enfòmasyon sou Kafka. Li tou senpleman itilize API gwoup konsomatè a pou bay estati ki jan gwoup sa a ap fè. Anplis de OK ak echwe, gen yon avètisman, epi ou ka jwenn ke konsomatè ou yo pa ka fè fas ak vitès la nan pwodiksyon - yo pa gen tan koreksyon sa ki ekri. Sistèm nan se byen entelijan ak fasil yo sèvi ak.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Sa a se sa repons API a sanble. Isit la se gwoup la bob-live-fifa, patisyon refund.update.v1, estati OK, lag 0 - dènye konpanse final la sa yo ak sa yo.

Eksperyans nan devlope sèvis Zouti Ranbousman an ak yon API asynchrone sou Kafka

Siveyans updated_at SLA (kole) Mwen deja mansyone. Pou egzanp, pwodwi a te chanje nan estati a ke li se pare pou retounen. Nou enstale Cron, ki di ke si nan 5 minit objè sa a pa te ale nan ranbousman (nou retounen lajan nan sistèm peman trè vit), Lè sa a, yon bagay definitivman ale mal, e sa a se definitivman yon ka pou sipò. Se poutèt sa, nou tou senpleman pran Cron, ki li bagay sa yo, epi si yo pi gran pase 0, Lè sa a, li voye yon alèt.

Pou rezime, lè l sèvi avèk evènman se pratik lè:

  • plizyè sistèm bezwen enfòmasyon;
  • rezilta pwosesis la pa enpòtan;
  • gen kèk evènman oswa ti evènman.

Li ta sanble ke atik la gen yon sijè trè espesifik - asynchrone API sou Kafka, men an koneksyon avèk li mwen ta renmen rekòmande anpil bagay nan yon fwa.
Premye, pwochen HighLoad ++ nou bezwen rete tann jiska Novanm, nan mwa avril pral gen yon vèsyon St Petersburg, ak nan mwa jen nou pral pale sou chaj segondè nan Novosibirsk.
Dezyèmman, otè a nan rapò a, Sergei Zaika, se yon manm nan Komite Pwogram nan nouvo konferans nou an sou jesyon konesans. KnowledgeConf. Konferans lan se yon sèl jou, pral pran plas 26 avril, men pwogram li yo trè entans.
Epi li pral nan mwa me PHP Larisi и RIT++ (Avèk DevOpsConf enkli) - ou ka sijere tou sijè ou a la, pale sou eksperyans ou epi pote plent sou kòn boure ou yo.

Sous: www.habr.com

Add nouvo kòmantè