Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

X'jista' jġiegħel kumpanija daqshekk kbira bħal Lamoda, bi proċess issimplifikat u għexieren ta' servizzi interkonnessi, biex tbiddel b'mod sinifikanti l-approċċ tagħha? Il-motivazzjoni tista 'tkun kompletament differenti: minn leġiżlattiva għax-xewqa li esperiment inerenti fil-programmaturi kollha.

Iżda dan ma jfissirx li ma tistax toqgħod fuq benefiċċji addizzjonali. Sergey Zaika jgħidlek x'tista' tirbaħ eżattament jekk timplimenta l-API mmexxija mill-avvenimenti fuq Kafka (ftitald). Żgur se jkun hemm ukoll diskors dwar big shots u skoperti interessanti - l-esperiment ma jistax jgħaddi mingħajrhom.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Ċaħda ta' responsabbiltà: Dan l-artikolu huwa bbażat fuq materjali minn laqgħa li Sergey għamel f'Novembru 2018 fuq HighLoad++. L-esperjenza diretta ta' Lamoda ta' ħidma ma' Kafka ġibdet semmiegħa xejn inqas minn rapporti oħra dwar l-iskeda. Aħna naħsbu li dan huwa eżempju eċċellenti tal-fatt li tista 'u dejjem għandek issib nies li jaħsbuha l-istess, u l-organizzaturi ta' HighLoad++ se jkomplu jippruvaw joħolqu atmosfera li twassal għal dan.

Dwar il-proċess

Lamoda hija pjattaforma kbira ta 'kummerċ elettroniku li għandha ċentru ta' kuntatt tagħha stess, servizz ta 'kunsinna (u ħafna affiljati), studio tar-ritratti, maħżen enormi, u dan kollu jimxi fuq is-software tiegħu stess. Hemm għexieren ta 'metodi ta' ħlas, imsieħba b2b li jistgħu jużaw xi wħud minn dawn is-servizzi jew kollha u jridu jkunu jafu informazzjoni aġġornata dwar il-prodotti tagħhom. Barra minn hekk, Lamoda topera fi tliet pajjiżi minbarra l-Federazzjoni Russa u kollox huwa ftit differenti hemmhekk. B'kollox, probabbilment hemm aktar minn mitt mod biex jiġi kkonfigurat ordni ġdida, li trid tiġi pproċessata bil-mod tagħha. Dan kollu jaħdem bl-għajnuna ta 'għexieren ta' servizzi li kultant jikkomunikaw b'modi mhux ovvji. Hemm ukoll sistema ċentrali li r-responsabbiltà ewlenija tagħha hija l-istatus tal-ordnijiet. Nsejħulha BOB, naħdem magħha.

Għodda ta’ Rifużjoni b’API mmexxija mill-avvenimenti

Il-kelma mmexxija mill-avvenimenti hija pjuttost imdaħħla; ftit aktar se niddefinixxu f'aktar dettall x'inhu mfisser b'dan. Nibda bil-kuntest li fih iddeċidejna li nippruvaw l-approċċ tal-API mmexxi mill-avvenimenti f'Kafka.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Fi kwalunkwe maħżen, minbarra l-ordnijiet li għalihom iħallsu l-klijenti, hemm drabi meta l-maħżen huwa meħtieġ li jirritorna l-flus minħabba li l-prodott ma kienx jaqbel lill-klijent. Dan huwa proċess relattivament qasir: aħna niċċaraw l-informazzjoni, jekk meħtieġ, u nittrasferixxu l-flus.

Iżda r-ritorn sar aktar ikkumplikat minħabba bidliet fil-leġiżlazzjoni, u kellna nimplimentaw mikroservizz separat għalih.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Il-motivazzjoni tagħna:

  1. Liġi FZ-54 - fil-qosor, il-liġi teħtieġ rapport lill-uffiċċju tat-taxxa dwar kull tranżazzjoni monetarja, kemm jekk tkun ritorn jew irċevuta, fi SLA pjuttost qasir ta 'ftit minuti. Aħna, bħala kumpanija tal-kummerċ elettroniku, inwettqu ħafna operazzjonijiet. Teknikament, dan ifisser responsabbiltà ġdida (u għalhekk servizz ġdid) u titjib fis-sistemi kollha involuti.
  2. BOB maqsum huwa proġett intern tal-kumpanija biex teħles lil BOB minn numru kbir ta 'responsabbiltajiet mhux ewlenin u tnaqqas il-kumplessità ġenerali tagħha.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Din id-dijagramma turi s-sistemi ewlenin Lamoda. Issa ħafna minnhom huma aktar kostellazzjoni ta' 5-10 mikroservizzi madwar monolitu li qed jiċkien. Qed jikbru bil-mod, iżda qed nippruvaw nagħmluhom iżgħar, minħabba li l-iskjerament tal-framment magħżul fin-nofs huwa tal-biża - ma nistgħux inħalluh jaqa '. Aħna sfurzati li nirriżervaw l-iskambji kollha (vleġeġ) u nqisu l-fatt li xi wieħed minnhom jista 'jirriżulta li ma jkunx disponibbli.

BOB għandu wkoll ħafna skambji: sistemi ta 'ħlas, sistemi ta' konsenja, sistemi ta 'notifika, eċċ.

Teknikament BOB huwa:

  • ~ 150k linji ta 'kodiċi + ~ 100k linji ta' testijiet;
  • php7.2 + Zend 1 & Symfony Komponenti 3;
  • > 100 APIs & ~ 50 integrazzjoni barra;
  • 4 pajjiżi bil-loġika tan-negozju tagħhom stess.

L-iskjerament tal-BOB huwa għali u bl-uġigħ, l-ammont ta 'kodiċi u problemi li ssolvi huwa tali li ħadd ma jista' jpoġġi dan kollu f'rasu. B'mod ġenerali, hemm ħafna raġunijiet biex tissimplifikaha.

Proċess ta' Ritorn

Inizjalment, żewġ sistemi huma involuti fil-proċess: BOB u Ħlas. Issa jidhru tnejn oħra:

  • Servizz ta’ Fiscalization, li se jieħu ħsieb il-problemi ta’ fiscalization u komunikazzjoni ma’ servizzi esterni.
  • Għodda ta 'Rifużjoni, li sempliċement fiha skambji ġodda sabiex ma jintefaħx il-BOB.

Issa l-proċess jidher bħal dan:

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

  1. BOB jirċievi talba għal rifużjoni.
  2. BOB jitkellem dwar din l-Għodda ta’ Rifużjoni.
  3. L-Għodda ta’ Rifużjoni tgħid lil Pagament: “Irritorna l-flus.”
  4. Il-ħlas jirritorna l-flus.
  5. Refund Tool u BOB jissinkronizzaw l-istatus ma 'xulxin, għax għalissa t-tnejn għandhom bżonnha. Għadna m'aħniex lesti li naqilbu kompletament għall-Għodda ta' Rifużjoni, peress li BOB għandu UI, rapporti għall-kontabilità, u b'mod ġenerali ħafna dejta li ma tistax tiġi trasferita daqshekk faċilment. Trid toqgħod fuq żewġ siġġijiet.
  6. It-talba għal fiskalizzazzjoni titlaq.

Bħala riżultat, għamilna tip ta 'xarabank tal-avvenimenti fuq Kafka - event-bus, li fuqha beda kollox. Hurrah, issa għandna punt wieħed ta 'falliment (sarcasm).

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Il-vantaġġi u l-iżvantaġġi huma pjuttost ovvji. Għamilna xarabank, li jfisser li issa s-servizzi kollha jiddependu minnha. Dan jissimplifika d-disinn, iżda jintroduċi punt wieħed ta 'falliment fis-sistema. Kafka se jikkraxxja, il-proċess se jieqaf.

X'inhu API mmexxija mill-avvenimenti

Tweġiba tajba għal din il-mistoqsija tinsab fir-rapport ta’ Martin Fowler (GOTO 2017) "Il-Ħafna Tifsiriet tal-Arkitettura Mmexxija mill-Avvenimenti".

Fil-qosor dak li għamilna:

  1. Kebbeb l-iskambji asinkroniċi kollha permezz ħażna ta' avvenimenti. Minflok ma ninfurmaw lil kull konsumatur interessat dwar bidla fl-istatus fuq in-netwerk, niktbu avveniment dwar bidla fl-istatus għal ħażna ċentralizzata, u l-konsumaturi interessati fis-suġġett jaqraw dak kollu li jidher minn hemm.
  2. L-avveniment f'dan il-każ huwa notifika (notifiki) li xi ħaġa nbidlet x'imkien. Pereżempju, l-istatus tal-ordni nbidel. Konsumatur li huwa interessat f'xi data li takkumpanja l-bidla fl-istatus li mhix inkluża fin-notifika jista' jsib l-istatus tiegħu hu stess.
  3. L-għażla massima hija s-sorsi tal-avvenimenti sħiħ, trasferiment tal-istat, f'liema każ fiha l-informazzjoni kollha meħtieġa għall-ipproċessar: minn fejn ġiet u liema status marret, kif eżattament id-data nbidlet, eċċ. L-unika mistoqsija hija l-fattibilità u l-ammont ta 'informazzjoni li inti tista' taffordja li taħżen.

Bħala parti mit-tnedija tal-Għodda ta’ Rifużjoni, użajna t-tielet għażla. Dan l-ipproċessar tal-avvenimenti ssimplifikat peress li ma kienx hemm bżonn li tiġi estratta informazzjoni dettaljata, flimkien ma 'elimina x-xenarju fejn kull avveniment ġdid jiġġenera tifqigħa ta' kjarifika tikseb talbiet mill-konsumaturi.

Servizz ta' Għodda ta' Rifużjoni mhux mgħobbija, allura Kafka hemm aktar togħma tal-pinna milli neċessità. Ma naħsibx li jekk is-servizz ta 'rifużjoni jsir proġett ta' tagħbija għolja, in-negozju jkun kuntent.

Skambju asinkroniku KIF HUWA

Għal skambji asinkroniċi, id-dipartiment PHP normalment juża RabbitMQ. Ġbarna d-dejta għat-talba, poġġietha fi kju, u l-konsumatur tal-istess servizz qara u bagħatha (jew ma bagħathiex). Għall-API innifsu, Lamoda juża b'mod attiv Swagger. Aħna niddisinjaw API, niddeskrivuha fi Swagger, u niġġeneraw kodiċi tal-klijent u tas-server. Aħna nużaw ukoll JSON RPC 2.0 kemmxejn imtejjeb.

F'xi postijiet jintużaw xarabanks ESB, xi wħud jgħixu fuq activeMQ, iżda, b'mod ġenerali, RabbitMQ - standard.

Skambju Async TO BE

Meta jiġi ddisinjat l-iskambju permezz ta' events-bus, tista' tiġi rintraċċata analoġija. Aħna niddeskrivu bl-istess mod l-iskambju tad-dejta fil-ġejjieni permezz ta’ deskrizzjonijiet tal-istruttura tal-avvenimenti. Il-format yaml, kellna nagħmlu l-ġenerazzjoni tal-kodiċi aħna stess, il-ġeneratur joħloq DTOs skont l-ispeċifikazzjoni u jgħallem lill-klijenti u s-servers biex jaħdmu magħhom. Il-ġenerazzjoni tmur f'żewġ lingwi - golang u php. Dan jgħin biex il-libreriji jinżammu konsistenti. Il-ġeneratur huwa miktub bil-golang, u huwa għalhekk li kiseb l-isem gogi.

Event-sourcing fuq Kafka hija ħaġa tipika. Hemm soluzzjoni mill-verżjoni ewlenija tal-intrapriża ta 'Kafka Confluent, hemm nakadi, soluzzjoni minn ħutna tad-dominju Zalando. Tagħna motivazzjoni biex tibda bil-vanilla Kafka - dan ifisser li nħallu s-soluzzjoni ħielsa sakemm fl-aħħar niddeċiedu jekk nużawhiex kullimkien, u wkoll inħallu lilna nfusna spazju għal manuvra u titjib: irridu appoġġ għal tagħna JSON RPC 2.0, ġeneraturi għal żewġ lingwi u ejja naraw x'iktar.

Huwa ironiku li anke f'każ hekk kuntent, meta jkun hemm negozju bejn wieħed u ieħor simili, Zalando, li għamel soluzzjoni bejn wieħed u ieħor simili, ma nistgħux nużawha b'mod effettiv.

Il-mudell arkitettoniku fit-tnedija huwa kif ġej: naqraw direttament minn Kafka, iżda niktbu biss permezz ta 'avvenimenti-xarabank. Hemm ħafna lesti għall-qari f'Kafka: sensara, balancers, u huwa xi ftit jew wisq lest għal skalar orizzontali, ridt li nżomm dan. Ridna nlestu r-reġistrazzjoni permezz ta’ Gateway wieħed aka Events-bus, u hawn għaliex.

Avvenimenti-bus

Jew xarabank tal-avvenimenti. Dan huwa sempliċiment portal http mingħajr stat, li jieħu diversi rwoli importanti:

  • Produzzjoni ta' Validazzjoni — niċċekkjaw li l-avvenimenti jissodisfaw l-ispeċifikazzjonijiet tagħna.
  • Sistema prinċipali tal-avveniment, jiġifieri, din hija s-sistema ewlenija u l-unika fil-kumpanija li twieġeb il-mistoqsija dwar liema avvenimenti li bihom strutturi huma kkunsidrati validi. Il-validazzjoni sempliċement tinvolvi tipi ta' data u enums biex jispeċifikaw b'mod strett il-kontenut.
  • Funzjoni hash għal sharding - l-istruttura tal-messaġġ Kafka hija ta 'valur ewlieni u bl-użu tal-hash ta' ċavetta hija kkalkulata fejn tpoġġiha.

għaliex

Naħdmu f'kumpanija kbira bi proċess issimplifikat. Għaliex tbiddel xi ħaġa? Dan huwa esperiment, u nistennew li naħsdu diversi benefiċċji.

1:n+1 skambji (wieħed għal ħafna)

Kafka jagħmilha faċli ħafna li tikkonnettja konsumaturi ġodda mal-API.

Ejja ngħidu li għandek direttorju li trid iżżomm ruħek aġġornat f'diversi sistemi f'daqqa (u f'xi oħrajn ġodda). Preċedentement, ivvintajna pakkett li implimentat set-API, u s-sistema prinċipali ġiet infurmata bl-indirizzi tal-konsumatur. Issa s-sistema prinċipali tibgħat aġġornamenti għas-suġġett, u kull min hu interessat jaqrah. Dehret sistema ġdida - ffirmajna għas-suġġett. Iva, ukoll mazz, iżda aktar sempliċi.

Fil-każ ta 'rifużjoni-għodda, li hija biċċa BOB, huwa konvenjenti għalina li nżommuhom sinkronizzati permezz ta' Kafka. Il-ħlas jgħid li l-flus ingħataw lura: BOB, RT saru jafu b’dan, bidlu l-istatus tagħhom, is-Servizz ta’ Fiscalization sar jaf b’dan u ħareġ ċekk.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Għandna pjanijiet biex noħolqu Servizz ta' Notifiki unifikat li jinnotifika lill-klijent dwar aħbarijiet dwar l-ordni/ir-ritorni tiegħu. Issa din ir-responsabbiltà hija mifruxa bejn is-sistemi. Ikun biżżejjed għalina li ngħallmu lis-Servizz tan-Notifiki biex jaqbad informazzjoni rilevanti minn Kafka u jwieġbu għaliha (u tiddiżattiva dawn in-notifiki f'sistemi oħra). Mhux se jkunu meħtieġa skambji diretti ġodda.

Immexxi mid-dejta

L-informazzjoni bejn is-sistemi ssir trasparenti - irrispettivament minn liema "intrapriża mdemmija" għandek u tkun kemm tkun smin l-inkartament tiegħek. Lamoda għandha dipartiment tal-Analitika tad-Data li jiġbor data minn sistemi u jpoġġiha f'forma li tista 'terġa' tintuża, kemm għan-negozju kif ukoll għal sistemi intelliġenti. Kafka jippermettilek tagħtihom malajr ħafna dejta u żżomm dak il-fluss tal-informazzjoni aġġornat.

Replikazzjoni log

Il-messaġġi ma jisparixxux wara li jinqraw, bħal fil-RabbitMQ. Meta avveniment ikun fih biżżejjed informazzjoni għall-ipproċessar, ikollna storja ta’ bidliet riċenti fl-oġġett, u, jekk mixtieq, il-ħila li napplikaw dawn il-bidliet.

Il-perjodu tal-ħażna tal-ġurnal tar-replikazzjoni jiddependi fuq l-intensità tal-kitba għal dan is-suġġett; Kafka jippermettilek li tiffissa b'mod flessibbli limiti fuq il-ħin tal-ħażna u l-volum tad-dejta. Għal suġġetti intensivi, huwa importanti li l-konsumaturi kollha jkollhom il-ħin biex jaqraw l-informazzjoni qabel ma tisparixxi, anke fil-każ ta’ inoperabbiltà għal żmien qasir. Normalment huwa possibbli li tinħażen id-data għal unitajiet ta' jiem, li huwa pjuttost biżżejjed għall-appoġġ.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Sussegwentement, ftit rakkont tad-dokumentazzjoni, għal dawk li mhumiex familjari ma 'Kafka (l-istampa hija wkoll mid-dokumentazzjoni)

AMQP għandha kjuwijiet: niktbu messaġġi fi kju għall-konsumatur. Tipikament, kju wieħed jiġi pproċessat minn sistema waħda bl-istess loġika tan-negozju. Jekk għandek bżonn tinnotifika diversi sistemi, tista 'tgħallem l-applikazzjoni biex tikteb f'diversi kjuwijiet jew tikkonfigura l-iskambju bil-mekkaniżmu fanout, li jikklonahom innifsu.

Kafka għandu estrazzjoni simili suġġett, li fiha tikteb messaġġi, iżda dawn ma jisparixxux wara l-qari. B'mod awtomatiku, meta tikkonnettja ma' Kafka, tirċievi l-messaġġi kollha u għandek l-għażla li tiffranka fejn ħallejt. Jiġifieri, taqra b'mod sekwenzjali, tista' ma timmarkax il-messaġġ bħala moqri, iżda ssalva l-id li minnha tista' mbagħad tkompli taqra. L-Id li issetilja fuqu jissejjaħ offset, u l-mekkaniżmu huwa kommit offset.

Għaldaqstant, tista' tiġi implimentata loġika differenti. Pereżempju, għandna BOB f'4 każijiet għal pajjiżi differenti - Lamoda tinsab fir-Russja, il-Każakstan, l-Ukrajna, il-Belarus. Peress li huma skjerati separatament, għandhom konfigurazzjonijiet kemmxejn differenti u l-loġika tan-negozju tagħhom stess. Nindikaw fil-messaġġ għal liema pajjiż tirreferi. Kull konsumatur BOB f'kull pajjiż jaqra bi groupId differenti, u jekk il-messaġġ ma japplikax għalihom, jaqbżuh, i.e. immedjatament jikkommetti offset +1. Jekk l-istess suġġett jinqara mis-Servizz tal-Ħlas tagħna, allura jagħmel dan bi grupp separat, u għalhekk il-kumpensi ma jaqsmux.

Rekwiżiti tal-avveniment:

  • Kompletezza tad-dejta. Nixtieq li l-avveniment ikollu biżżejjed data sabiex ikun jista' jiġi pproċessat.

  • Integrità. Aħna niddelegaw lil Events-bus il-verifika li l-avveniment huwa konsistenti u jista' jipproċessah.
  • L-ordni hija importanti. Fil-każ ta’ ritorn, aħna sfurzati naħdmu bl-istorja. B'notifiki, l-ordni mhix importanti, jekk huma notifiki omoġenji, l-email se tkun l-istess irrispettivament minn liema ordni waslet l-ewwel. Fil-każ ta 'rifużjoni, hemm proċess ċar; jekk nibdlu l-ordni, jinqalgħu eċċezzjonijiet, ir-rifużjoni ma tinħoloqx jew tiġi pproċessata - nispiċċaw fi status differenti.
  • Konsistenza. Għandna maħżen, u issa noħolqu avvenimenti minflok API. Għandna bżonn mod kif nittrasmettu malajr u bl-irħis informazzjoni dwar avvenimenti ġodda u bidliet għal dawk eżistenti fis-servizzi tagħna. Dan jinkiseb permezz ta 'speċifikazzjoni komuni f'repożitorju git separat u ġeneraturi tal-kodiċi. Għalhekk, il-klijenti u s-servers f'servizzi differenti huma kkoordinati.

Kafka f'Lamoda

Għandna tliet installazzjonijiet Kafka:

  1. Zkuk;
  2. R&D;
  3. Avvenimenti-bus.

Illum qed nitkellmu biss fuq l-aħħar punt. Fl-avvenimenti-bus, m'għandniex installazzjonijiet kbar ħafna - sensara 3 (servers) u suġġetti 27 biss. Bħala regola, suġġett wieħed huwa proċess wieħed. Iżda dan huwa punt sottili, u se nmissuh issa.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Hawn fuq hemm il-graff rps. Il-proċess tar-rifużjonijiet huwa mmarkat b'linja lewn (iva, dik fuq l-assi X), u l-linja roża hija l-proċess ta 'aġġornament tal-kontenut.

Il-katalgu Lamoda fih miljuni ta 'prodotti, u d-dejta hija aġġornata l-ħin kollu. Xi kollezzjonijiet joħorġu mill-moda, jinħelsu oħrajn ġodda biex jissostitwixxuhom, u mudelli ġodda qed jidhru kontinwament fil-katalgu. Nippruvaw inbassru dak li se jkun interessanti għall-klijenti tagħna għada, għalhekk aħna kontinwament nixtru affarijiet ġodda, nirritrattawhom u naġġornaw il-kaxxa tal-wirja.

Il-qċaċet roża huma aġġornamenti tal-prodotti, jiġifieri bidliet fil-prodotti. Wieħed jista 'jara li l-guys ħadu ritratti, ħadu ritratti, u mbagħad għal darb'oħra! — mgħobbija pakkett ta' avvenimenti.

Każijiet ta' użu ta' Lamoda Events

Aħna nużaw l-arkitettura mibnija għall-operazzjonijiet li ġejjin:

  • Traċċar tal-istatus tar-ritorn: sejħiet għall-azzjoni u traċċar tal-istatus mis-sistemi kollha involuti. Ħlas, status, fiskalizzazzjoni, notifiki. Hawnhekk ittestjajna l-approċċ, għamilna għodod, ġbarna l-bugs kollha, ktibna dokumentazzjoni u għedna lill-kollegi tagħna kif jużawha.
  • Aġġornament tal-karti tal-prodott: konfigurazzjoni, meta-data, karatteristiċi. Sistema waħda taqra (li turi), u bosta jiktbu.
  • Email, push u sms: l-ordni tkun inġabret, l-ordni waslet, ir-ritorn ġie aċċettat, eċċ., hemm ħafna minnhom.
  • Stock, tiġdid tal-maħżen — aġġornament kwantitattiv tal-oġġetti, numri biss: wasla fil-maħżen, ritorn. Huwa meħtieġ li s-sistemi kollha assoċjati mar-riżervazzjoni tal-merkanzija joperaw bl-aktar data attwali. Bħalissa, is-sistema tal-aġġornament tal-istokk hija pjuttost kumplessa; Kafka se jissimplifikaha.
  • Analiżi tad-Data (dipartiment R&D), għodod ML, analitika, statistika. Irridu li l-informazzjoni tkun trasparenti - Kafka huwa adattat tajjeb għal dan.

Issa l-aktar parti interessanti dwar il-ħotob kbar u l-iskoperti interessanti li seħħew matul l-aħħar sitt xhur.

Problemi tad-disinn

Ejja ngħidu li rridu nagħmlu ħaġa ġdida - pereżempju, tittrasferixxi l-proċess kollu tal-kunsinna lil Kafka. Issa parti mill-proċess hija implimentata fl-Ipproċessar tal-Ordni f'BOB. Hemm mudell ta 'status wara t-trasferiment ta' ordni lis-servizz tal-kunsinna, moviment għal maħżen intermedju, eċċ. Hemm monolitu sħiħ, anke tnejn, flimkien ma 'mazz ta' APIs iddedikati għall-kunsinna. Huma jafu ħafna aktar dwar il-kunsinna.

Dawn jidhru li huma oqsma simili, iżda l-Ipproċessar tal-Ordni f'BOB u s-Sistema tat-Tbaħħir għandhom status differenti. Pereżempju, xi servizzi ta 'kurrier ma jibagħtux status intermedji, iżda dawk finali biss: "konsenjat" jew "mitluf". Oħrajn, għall-kuntrarju, jirrappurtaw fid-dettall kbir dwar il-moviment tal-merkanzija. Kulħadd għandu r-regoli tal-validazzjoni tiegħu: għal xi wħud, l-email hija valida, li jfisser li se tiġi pproċessata; għal oħrajn mhuwiex validu, iżda l-ordni xorta se tiġi pproċessata minħabba li hemm numru tat-telefon għall-kuntatt, u xi ħadd jgħid li ordni bħal din ma tiġi pproċessata xejn.

Fluss tad-dejta

Fil-każ ta' Kafka, tqum il-kwistjoni tal-organizzazzjoni tal-fluss tad-dejta. Dan il-kompitu jinvolvi l-għażla ta 'strateġija bbażata fuq diversi punti; ejja ngħaddu minnhom kollha.

F'suġġett wieħed jew f'oħrajn differenti?

Għandna speċifikazzjoni ta 'avveniment. F'BOB niktbu li tali ordni jew tali jeħtieġ li tiġi kkonsenjata, u nindikaw: in-numru tal-ordni, il-kompożizzjoni tiegħu, xi SKUs u kodiċi tal-bar, eċċ. Meta l-merkanzija tasal fil-maħżen, il-kunsinna tkun tista 'tirċievi status, timestamps u dak kollu li huwa meħtieġ. Imma mbagħad irridu nirċievu aġġornamenti dwar din id-dejta f'BOB. Għandna proċess b'lura biex nirċievu data mill-kunsinna. Dan huwa l-istess avveniment? Jew dan huwa skambju separat li jistħoqqlu s-suġġett tiegħu?

Ħafna probabbli, se jkunu simili ħafna, u t-tentazzjoni li tagħmel suġġett wieħed mhix infondata, minħabba li suġġett separat ifisser konsumaturi separati, konfigurazzjonijiet separati, ġenerazzjoni separata ta 'dan kollu. Imma mhux fatt.

Qasam ġdid jew avveniment ġdid?

Imma jekk tuża l-istess avvenimenti, allura tqum problema oħra. Pereżempju, mhux is-sistemi ta' konsenja kollha jistgħu jiġġeneraw it-tip ta' DTO li BOB jista' jiġġenera. Nibagħtulhom l-id, iżda ma jsalvawhx għax m'għandhomx bżonnha, u mil-lat tal-bidu tal-proċess event-bus, dan il-qasam huwa meħtieġ.

Jekk nintroduċu regola għal event-bus li dan il-qasam huwa meħtieġ, allura aħna sfurzati nissettjaw regoli ta 'validazzjoni addizzjonali fil-BOB jew fl-immaniġġjar tal-avveniment tal-bidu. Il-validazzjoni tibda tinfirex mas-servizz kollu - dan mhux konvenjenti ħafna.

Problema oħra hija t-tentazzjoni għal żvilupp inkrementali. Qalulna li xi ħaġa trid tiżdied mal-avveniment, u forsi, jekk naħsbu dwarha, kellu jkun avveniment separat. Iżda fl-iskema tagħna, avveniment separat huwa suġġett separat. Suġġett separat huwa l-proċess kollu li ddeskrivejt hawn fuq. L-iżviluppatur huwa t-tentazzjoni li sempliċement iżid qasam ieħor mal-iskema JSON u jirriġeneraha.

Fil-każ ta 'rifużjonijiet, wasalna għall-avveniment ta' avvenimenti f'nofs sena. Kellna meta-avveniment wieħed imsejjaħ aġġornament tar-rifużjoni, li kellu qasam tat-tip li jiddeskrivi x'kien fil-fatt dan l-aġġornament. Minħabba dan, kellna swiċċijiet "mill-isbaħ" b'validaturi li qalulna kif nivvalidaw dan l-avveniment b'dan it-tip.

Verżjoni tal-avveniment

Biex tivvalida messaġġi f'Kafka tista' tuża Avro, iżda kien meħtieġ li immedjatament tpoġġi fuqha u tuża Confluent. Fil-każ tagħna, irridu noqogħdu attenti bil-verżjoni. Mhux dejjem se jkun possibbli li jerġgħu jinqraw il-messaġġi mir-replikazzjoni log minħabba li l-mudell ikun "ħalla". Bażikament, jirriżulta li tibni verżjonijiet sabiex il-mudell ikun kompatibbli b'lura: per eżempju, agħmel qasam temporanjament fakultattiv. Jekk id-differenzi huma qawwija wisq, nibdew niktbu f'suġġett ġdid, u nittrasferixxu l-klijenti meta jispiċċaw jaqraw il-qadim.

Ordni ta' qari garantit tal-ħitan

Suġġetti ġewwa Kafka huma maqsuma f'diviżorji. Dan mhux importanti ħafna waqt li nkunu qed niddisinjaw entitajiet u skambji, iżda huwa importanti meta niddeċiedu kif nikkunsmaw u niskalaw.

Fil-każ tas-soltu, tikteb suġġett wieħed f'Kafka. B'mod awtomatiku, tintuża partizzjoni waħda, u l-messaġġi kollha f'dan is-suġġett imorru għaliha. U l-konsumatur konsegwentement jaqra dawn il-messaġġi b'mod sekwenzjali. Ejja ngħidu issa rridu nkabbru s-sistema sabiex il-messaġġi jinqraw minn żewġ konsumaturi differenti. Jekk, pereżempju, qed tibgħat SMS, allura tista 'tgħid lil Kafka biex jagħmel partizzjoni addizzjonali, u Kafka jibda jaqsam il-messaġġi f'żewġ partijiet - nofs hawn, nofs hawn.

Kif jaqsamhom Kafka? Kull messaġġ għandu korp (li fih naħżnu JSON) u ċavetta. Tista 'tehmeż funzjoni hash ma' din iċ-ċavetta, li tiddetermina f'liema partizzjoni se jidħol il-messaġġ.

Fil-każ tagħna bir-rifużjonijiet, dan huwa importanti, jekk nieħdu żewġ diviżorji, allura hemm ċans li konsumatur parallel jipproċessa t-tieni avveniment qabel l-ewwel u jkun hemm problemi. Il-funzjoni tal-hash tiżgura li l-messaġġi bl-istess ċavetta jispiċċaw fl-istess partizzjoni.

Avvenimenti vs kmandi

Din hija problema oħra li ltqajna magħhom. Avveniment huwa ċertu avveniment: ngħidu li xi ħaġa ġrat x'imkien (something_happened), pereżempju, oġġett ġie kkanċellat jew seħħ rifużjoni. Jekk xi ħadd jisma 'dawn l-avvenimenti, allura skont "oġġett ikkanċellat", tinħoloq l-entità ta' rifużjoni, u "rifużjoni seħħet" tinkiteb x'imkien fis-setups.

Imma ġeneralment, meta tfassal avvenimenti, ma tridx tiktebhom għalxejn - tistrieħ fuq il-fatt li xi ħadd se jaqrahom. Hemm tentazzjoni kbira li tikteb mhux something_happened (item_canceled, refund_refunded), imma xi ħaġa_should_be_done. Per eżempju, l-oġġett huwa lest biex jiġi rritornat.

Min-naħa waħda, tissuġġerixxi kif se jintuża l-avveniment. Min-naħa l-oħra, tinstema ħafna inqas bħal isem ta 'avveniment normali. Barra minn hekk, mhux 'il bogħod minn hawn għall-kmand do_something. Imma m'għandekx garanzija li xi ħadd jaqra dan l-avveniment; u jekk taqrah, allura taqrah b’suċċess; u jekk taqrah b'suċċess, allura għamilt xi ħaġa, u dik xi ħaġa kienet ta 'suċċess. Fil-mument li avveniment isir do_something, il-feedback isir meħtieġ, u dik hija problema.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Fi skambju mhux sinkroniku f'RabbitMQ, meta taqra l-messaġġ, mur http, għandek tweġiba - għall-inqas li l-messaġġ wasal. Meta tikteb lil Kafka, ikun hemm messaġġ li ktibt lil Kafka, imma ma taf xejn dwar kif ġie pproċessat.

Għalhekk, fil-każ tagħna, kellna nintroduċu avveniment ta’ rispons u waqqafna monitoraġġ biex jekk jintbagħtu daqstant avvenimenti, wara tali u tali ħin għandhom jaslu l-istess numru ta’ avvenimenti ta’ rispons. Jekk dan ma jseħħx, allura xi ħaġa tidher li marret ħażin. Pereżempju, jekk bgħatna l-avveniment "item_ready_to_refund", nistennew li tinħoloq rifużjoni, il-flus jintbagħtu lura lill-klijent, u l-avveniment "money_refunded" jintbagħat lilna. Iżda dan mhux ċert, għalhekk il-monitoraġġ huwa meħtieġ.

Nuqqasijiet

Hemm problema pjuttost ovvja: jekk taqra minn suġġett b'mod sekwenzjali, u jkollok xi messaġġ ħażin, il-konsumatur jaqa ', u ma tmurx lil hinn. Għandek bżonn waqqaf lill-konsumaturi kollha, ikkommetti kumpens aktar biex tkompli taqra.

Konna nafu biha, għoddna fuqha, u madankollu ġara. U dan ġara minħabba li l-avveniment kien validu mil-lat ta 'avvenimenti-bus, l-avveniment kien validu mil-lat tal-validatur tal-applikazzjoni, iżda ma kienx validu mil-lat ta' PostgreSQL, minħabba li fis-sistema tagħna MySQL b'UNSIGNED INT is-sistema kellha PostgreSQL biss b'INT. Id-daqs tiegħu huwa ftit iżgħar, u l-Id ma jaqbilx. Symfony miet b'eċċezzjoni. Aħna, ovvjament, qabad l-eċċezzjoni għaliex aħna bbażat ruħna fuqha, u konna se nimpenjaw dan l-offset, iżda qabel ridna nżidu l-counter tal-problema, peress li l-messaġġ ġie pproċessat mingħajr suċċess. Il-counters f'dan il-proġett huma wkoll fid-database, u Symfony diġà għalaq il-komunikazzjoni mad-database, u t-tieni eċċezzjoni qatlet il-proċess kollu mingħajr ċans li tikkommetti kumpens.

Is-servizz qagħad għal xi żmien – fortunatament, ma’ Kafka dan mhux daqshekk ħażin, għax il-messaġġi jibqgħu. Meta x-xogħol jiġi restawrat, tista 'tispiċċa taqrahom. Huwa komdu.

Kafka għandu l-abbiltà li jistabbilixxi offset arbitrarju permezz ta 'għodda. Iżda biex tagħmel dan, trid twaqqaf lill-konsumaturi kollha - fil-każ tagħna, ipprepara rilaxx separat li fih ma jkunx hemm konsumaturi, riallokazzjonijiet. Imbagħad f'Kafka tista 'taqleb l-offset permezz ta' għodda, u l-messaġġ jgħaddi.

Sfumatura oħra - replikazzjoni log vs rdkafka.so - hija relatata mal-ispeċifiċitajiet tal-proġett tagħna. Aħna nużaw PHP, u fil-PHP, bħala regola, il-libreriji kollha jikkomunikaw ma 'Kafka permezz tar-repożitorju rdkafka.so, u mbagħad hemm xi tip ta' tgeżwir. Forsi dawn huma d-diffikultajiet personali tagħna, iżda rriżulta li sempliċiment nerġgħu naqraw biċċa minn dak li konna diġà qrajna mhux daqshekk faċli. B'mod ġenerali, kien hemm problemi tas-softwer.

Jirritornaw għall-ispeċifiċitajiet ta 'ħidma ma' diviżorji, huwa miktub dritt fid-dokumentazzjoni konsumaturi >= diviżorji suġġett. Imma sirt naf dwar dan ħafna aktar tard milli xtaqt. Jekk trid tiskala u jkollok żewġ konsumaturi, għandek bżonn mill-inqas żewġ diviżorji. Jiġifieri, jekk kellek partizzjoni waħda li fiha akkumulaw 20 elf messaġġ, u għamilt waħda ġdida, in-numru ta 'messaġġi mhux se jiġi equalizzat dalwaqt. Għalhekk, sabiex ikollok żewġ konsumaturi paralleli, għandek bżonn tittratta ħitan.

Monitoraġġ

Naħseb li l-mod kif nissorveljawha se jkun saħansitra aktar ċar x'problemi hemm fl-approċċ eżistenti.

Pereżempju, aħna nikkalkulaw kemm prodotti fid-database reċentement bidlu l-istatus tagħhom, u, għaldaqstant, kellhom seħħew avvenimenti bbażati fuq dawn il-bidliet, u nibagħtu dan in-numru lis-sistema ta 'monitoraġġ tagħna. Imbagħad minn Kafka nġibu t-tieni numru, kemm ġew irreġistrati avvenimenti fil-fatt. Ovvjament, id-differenza bejn dawn iż-żewġ numri għandha dejjem tkun żero.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Barra minn hekk, għandek bżonn biex tissorvelja kif il-produttur qed tagħmel, jekk events-bus irċeviet messaġġi, u kif il-konsumatur qed tagħmel. Pereżempju, fiċ-ċarts hawn taħt, l-Għodda ta 'Rifużjoni sejra tajjeb, iżda BOB b'mod ċar għandu xi problemi (qċaċet blu).

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Diġà semmejt dewmien tal-grupp tal-konsumaturi. Bejn wieħed u ieħor, dan huwa n-numru ta 'messaġġi mhux moqrija. B'mod ġenerali, il-konsumaturi tagħna jaħdmu malajr, għalhekk id-dewmien huwa ġeneralment 0, iżda kultant jista 'jkun hemm quċċata għal żmien qasir. Kafka jista 'jagħmel dan barra mill-kaxxa, iżda trid tistabbilixxi ċertu intervall.

Hemm proġett bejtali jagħtik aktar informazzjoni dwar Kafka. Sempliċement juża l-API tal-grupp tal-konsumaturi biex jagħti l-istatus ta 'kif qed jagħmel dan il-grupp. Minbarra OK u Faled, hemm twissija, u tista 'ssir taf li l-konsumaturi tiegħek ma jistgħux ilaħħqu mal-pass tal-produzzjoni - m'għandhomx ħin biex jaqraw il-provi ta' dak li hemm miktub. Is-sistema hija pjuttost intelliġenti u faċli biex tużah.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Dan huwa kif tidher ir-rispons API. Hawn hu l-grupp bob-live-fifa, partition refund.update.v1, status OK, lag 0 - l-aħħar offset finali bħal dawn.

Esperjenza fl-iżvilupp tas-servizz tal-Għodda ta' Rifużjoni b'API mhux sinkroniku fuq Kafka

Monitoraġġ updated_at SLA (mwaħħla) Diġà semmejt. Pereżempju, il-prodott inbidel għall-istatus li huwa lest għar-ritorn. Aħna ninstallaw Cron, li tgħid li jekk f'5 minuti dan l-oġġett ma marx għar-rifużjoni (aħna nirritornaw il-flus permezz ta 'sistemi ta' ħlas malajr ħafna), allura xi ħaġa definittivament marret ħażin, u dan żgur huwa każ għall-appoġġ. Għalhekk, aħna sempliċiment nieħdu Cron, li jaqra affarijiet bħal dawn, u jekk huma akbar minn 0, allura jibgħat twissija.

Fil-qosor, l-użu ta 'avvenimenti huwa konvenjenti meta:

  • l-informazzjoni hija meħtieġa minn diversi sistemi;
  • ir-riżultat tal-ipproċessar mhuwiex importanti;
  • hemm ftit avvenimenti jew avvenimenti żgħar.

Jidher li l-artiklu għandu suġġett speċifiku ħafna - API mhux sinkroniku fuq Kafka, iżda b'rabta magħha nixtieq nirrakkomanda ħafna affarijiet f'daqqa.
L-ewwel, li jmiss HighLoad ++ irridu nistennew sa Novembru; f'April se jkun hemm verżjoni ta 'San Pietruburgu, u f'Ġunju ser nitkellmu dwar tagħbijiet għoljin f'Novosibirsk.
It-tieni nett, l-awtur tar-rapport, Sergei Zaika, huwa membru tal-Kumitat tal-Programm tal-konferenza l-ġdida tagħna dwar il-ġestjoni tal-għarfien KnowledgeConf. Il-konferenza hija ta' ġurnata waħda, se ssir fis-26 ta' April, iżda l-programm tagħha huwa intens ħafna.
U se jkun f'Mejju PHP Russja и RIT++ (b'DevOpsConf inkluż) - tista' wkoll tipproponi s-suġġett tiegħek hemmhekk, titkellem dwar l-esperjenza tiegħek u tilmenta dwar il-koni mimlijin tiegħek.

Sors: www.habr.com

Żid kumment