Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Unsa man ang makapugos sa usa ka dako nga kompanya sama sa Lamoda, nga adunay usa ka streamlined nga proseso ug daghang mga interconnected nga serbisyo, aron mabag-o ang pamaagi niini? Ang pagdasig mahimong hingpit nga lahi: gikan sa lehislatibo hangtod sa tinguha nga mag-eksperimento nga kinaiyanhon sa tanan nga mga programmer.

Apan wala kini magpasabut nga dili ka makasalig sa dugang nga mga benepisyo. Isulti kanimo ni Sergey Zaika kung unsa gyud ang imong madaog kung imong ipatuman ang API nga gipadagan sa mga panghitabo sa Kafka (fewald). Adunay usab siguradong paghisgot bahin sa dagkong mga shot ug makapaikag nga mga nadiskobrehan - ang eksperimento dili mahimo kung wala sila.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Disclaimer: Kini nga artikulo gibase sa mga materyales gikan sa usa ka meetup nga gihimo ni Sergey niadtong Nobyembre 2018 sa HighLoad++. Ang live nga kasinatian ni Lamoda sa pagtrabaho kauban ang Kafka nakadani sa mga tigpaminaw dili moubos sa ubang mga taho sa iskedyul. Naghunahuna kami nga kini usa ka maayo kaayo nga panig-ingnan sa kamatuoran nga mahimo nimo ug kinahanglan kanunay nga makit-an ang parehas nga panghunahuna nga mga tawo, ug ang mga nag-organisar sa HighLoad ++ magpadayon sa pagsulay sa paghimo og usa ka atmospera nga angay niini.

Mahitungod sa proseso

Ang Lamoda usa ka dako nga plataporma sa e-commerce nga adunay kaugalingon nga contact center, serbisyo sa paghatud (ug daghang mga kaubanan), usa ka studio sa litrato, usa ka dako nga bodega, ug kining tanan nagdagan sa kaugalingon nga software. Adunay daghang mga pamaagi sa pagbayad, mga kasosyo sa b2b nga mahimong mogamit sa pipila o tanan niini nga mga serbisyo ug gusto nga mahibal-an ang labing bag-ong kasayuran sa ilang mga produkto. Dugang pa, ang Lamoda naglihok sa tulo ka mga nasud gawas sa Russian Federation ug ang tanan medyo lahi didto. Sa kinatibuk-an, tingali adunay labaw pa sa usa ka gatos nga mga paagi aron ma-configure ang usa ka bag-ong order, nga kinahanglan iproseso sa kaugalingon nga paagi. Kining tanan nagtrabaho sa tabang sa daghang mga serbisyo nga usahay nakigsulti sa dili klaro nga mga paagi. Adunay usab usa ka sentral nga sistema kansang panguna nga responsibilidad mao ang mga kahimtang sa order. Tawgon namo siyag BOB, kauban nako siya.

Himan sa Pag-refund nga adunay API nga gipatuyok sa mga panghitabo

Ang pulong nga gipalihok sa mga panghitabo kay medyo hackneyed; sa usa ka gamay nga dugang atong ipasabut sa mas detalyado kung unsa ang gipasabut niini. Magsugod ko sa konteksto diin nakahukom kami nga sulayan ang pamaagi sa API nga gipadagan sa mga panghitabo sa Kafka.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Sa bisan unsang tindahan, dugang sa mga order nga gibayran sa mga kostumer, adunay mga higayon nga ang tindahan kinahanglan nga ibalik ang kuwarta tungod kay ang produkto dili angay sa kustomer. Kini usa ka medyo mubo nga proseso: among gipatin-aw ang kasayuran, kung gikinahanglan, ug gibalhin ang kuwarta.

Apan ang pagbalik nahimong mas komplikado tungod sa mga pagbag-o sa lehislasyon, ug kinahanglan namon nga ipatuman ang usa ka bulag nga microservice alang niini.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Atong motivation:

  1. Balaod FZ-54 - sa laktud, ang balaod nagkinahanglan sa pagtaho ngadto sa buhatan sa buhis mahitungod sa matag transaksyon sa kwarta, kini usa ka pagbalik o usa ka resibo, sulod sa usa ka mubo nga SLA sa pipila ka minuto. Kami, isip usa ka kompanya sa e-commerce, naghimo og daghang mga operasyon. Sa teknikal, kini nagpasabut nga bag-ong responsibilidad (ug busa usa ka bag-ong serbisyo) ug mga pag-uswag sa tanan nga nahilambigit nga mga sistema.
  2. BOB split mao ang usa ka internal nga proyekto sa kompanya sa paghupay sa BOB gikan sa usa ka dako nga gidaghanon sa mga non-core nga mga responsibilidad ug pagpakunhod sa iyang kinatibuk-ang pagkakomplikado.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Kini nga dayagram nagpakita sa mga nag-unang sistema sa Lamoda. Karon ang kadaghanan kanila mas daghan usa ka konstelasyon sa 5-10 ka microservices sa palibot sa usa ka pagkunhod sa monolith. Sila hinay-hinay nga mitubo, apan kami naningkamot sa paghimo kanila nga mas gamay, tungod kay ang pag-deploy sa tipik nga gipili sa tunga makahadlok - dili nato tugotan nga mahulog kini. Napugos kami sa pagreserba sa tanan nga mga pagbinayloay (mga pana) ug tagdon ang kamatuoran nga ang bisan kinsa niini mahimong dili magamit.

Ang BOB usab adunay daghang mga pagbinayloay: mga sistema sa pagbayad, mga sistema sa paghatud, mga sistema sa pagpahibalo, ug uban pa.

Sa teknikal nga BOB mao ang:

  • ~150k linya sa code + ~100k linya sa pagsulay;
  • php7.2 + Zend 1 & Symfony Components 3;
  • >100 ka API & ~50 ka outbound integrations;
  • 4 nga mga nasud nga adunay kaugalingon nga lohika sa negosyo.

Ang pag-deploy sa BOB mahal ug sakit, ang gidaghanon sa code ug mga problema nga masulbad niini mao nga walay usa nga makabutang sa tanan sa ilang mga ulo. Sa kinatibuk-an, adunay daghang mga hinungdan sa pagpayano niini.

Proseso sa Pagbalik

Sa sinugdan, duha ka sistema ang nalangkit sa proseso: BOB ug Payment. Karon duha pa ang nagpakita:

  • Serbisyo sa Fiscalization, nga mag-atiman sa mga problema sa fiscalization ug komunikasyon sa mga serbisyo sa gawas.
  • Himan sa Pag-refund, nga yano nga adunay mga bag-ong pagbinayloay aron dili mapataas ang BOB.

Karon ang proseso ingon niini:

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

  1. Ang BOB nakadawat og hangyo alang sa refund.
  2. Ang BOB naghisgot bahin sa kini nga Himan sa Pag-refund.
  3. Ang Refund Tool nagsulti sa Pagbayad: "Iuli ang kwarta."
  4. Ang pagbayad nagbalik sa kwarta.
  5. Ang Refund Tool ug BOB nag-synchronize sa mga status sa usag usa, tungod kay sa pagkakaron kinahanglan nila kini. Dili pa kami andam nga hingpit nga mobalhin sa Refund Tool, tungod kay ang BOB adunay UI, mga taho alang sa accounting, ug sa kinatibuk-an daghang mga datos nga dili dali mabalhin. Kinahanglan ka nga molingkod sa duha ka lingkuranan.
  6. Ang hangyo alang sa fiscalization mawala.

Ingon usa ka sangputanan, naghimo kami usa ka klase nga bus sa panghitabo sa Kafka - event-bus, diin nagsugod ang tanan. Hurray, karon kita adunay usa ka punto sa kapakyasan (sarcasm).

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Ang mga pro ug kontra klaro kaayo. Naghimo kami usa ka bus, nga nagpasabut nga karon ang tanan nga mga serbisyo nagdepende niini. Gipasimple niini ang disenyo, apan gipaila ang usa ka punto sa kapakyasan sa sistema. Ang Kafka ma-crash, ang proseso mohunong.

Unsa ang API nga gipatuyok sa mga panghitabo

Ang usa ka maayong tubag niini nga pangutana anaa sa taho ni Martin Fowler (GOTO 2017) "Ang Daghang Kahulugan sa Arkitektura nga Gipalihok sa Panghitabo".

Sa mubo kung unsa ang among gibuhat:

  1. Tapuson ang tanan nga asynchronous nga pagbayloay pinaagi sa pagtipig sa mga panghitabo. Imbis nga ipahibalo ang matag interesado nga konsumedor bahin sa pagbag-o sa status sa network, nagsulat kami usa ka panghitabo bahin sa pagbag-o sa status sa usa ka sentralisado nga pagtipig, ug ang mga konsumedor nga interesado sa hilisgutan nagbasa sa tanan nga makita gikan didto.
  2. Ang panghitabo niini nga kaso usa ka pahibalo (notifications) nga adunay nausab sa usa ka dapit. Pananglitan, ang kahimtang sa order nausab. Ang usa ka konsumedor nga interesado sa pipila ka mga datos nga nag-uban sa pagbag-o sa kahimtang nga wala gilakip sa pahibalo mahimong mahibal-an ang kahimtang sa iyang kaugalingon.
  3. Ang labing kadaghan nga kapilian mao ang tibuuk nga pagpangita sa panghitabo, pagbalhin sa estado, diin ang panghitabo naglangkob sa tanan nga impormasyon nga gikinahanglan alang sa pagproseso: diin kini gikan ug unsa nga status kini miadto, sa unsa nga paagi sa tukma ang data nausab, ug uban pa Ang bugtong pangutana mao ang posibilidad ug ang gidaghanon sa impormasyon nga imong maabut sa pagtipig.

Isip kabahin sa paglunsad sa Refund Tool, among gigamit ang ikatulo nga kapilian. Kini nga gipasimple nga pagproseso sa panghitabo tungod kay wala’y kinahanglan nga pagkuha sa detalyado nga kasayuran, dugang nga giwagtang ang senaryo diin ang matag bag-ong panghitabo nagmugna usa ka pagbuto sa pagpatin-aw nga makakuha mga hangyo gikan sa mga konsumedor.

Serbisyo sa Gamit sa Pag-uli wala gikarga, mao nga Kafka adunay labaw pa sa usa ka lami sa pluma kay sa usa ka kinahanglanon. Wala ko maghunahuna nga kung ang serbisyo sa pag-refund mahimong usa ka proyekto nga puno sa karga, malipay ang negosyo.

Async exchange AS IS

Alang sa asynchronous nga mga pagbinayloay, ang departamento sa PHP kasagarang naggamit sa RabbitMQ. Gikolekta namo ang datos alang sa hangyo, gibutang kini sa usa ka pila, ug ang konsumidor sa samang serbisyo nagbasa niini ug nagpadala niini (o wala kini ipadala). Alang sa API mismo, ang Lamoda aktibong naggamit sa Swagger. Nagdisenyo kami og API, gihulagway kini sa Swagger, ug nagmugna og code sa kliyente ug server. Gigamit usab namo ang gamay nga gipaayo nga JSON RPC 2.0.

Sa pipila ka mga lugar gigamit ang mga ESB bus, ang uban nagpuyo sa activeMQ, apan, sa kinatibuk-an, RabbitMQ - sumbanan.

Async exchange TO BE

Kung nagdesinyo sa pagbinayloay pinaagi sa mga panghitabo-bus, usa ka analohiya ang masubay. Parehas namon nga gihulagway ang umaabot nga pagbinayloay sa datos pinaagi sa mga paghulagway sa istruktura sa panghitabo. Ang yaml format, kinahanglan namong buhaton ang code generation sa among mga kaugalingon, ang generator nagmugna og mga DTO sumala sa detalye ug nagtudlo sa mga kliyente ug mga server sa pagtrabaho uban kanila. Ang henerasyon moadto sa duha ka mga pinulongan - golang ug php. Makatabang kini nga magpabiling makanunayon ang mga librarya. Ang generator kay gisulat sa golang, hinungdan nga nakuha ang ngalan nga gogi.

Ang pagpangita sa panghitabo sa Kafka usa ka kasagaran nga butang. Adunay usa ka solusyon gikan sa nag-unang bersyon sa negosyo sa Kafka Confluent, adunay nakadi, usa ka solusyon gikan sa among domain mga igsoon Zalando. Amua kadasig sa pagsugod sa vanilla Kafka - kini nagpasabut nga biyaan ang solusyon nga libre hangtod nga kami sa katapusan makahukom kung gamiton ba namon kini bisan diin, ug biyaan usab ang among kaugalingon nga lugar alang sa pagmaniobra ug pagpaayo: gusto namon ang suporta para sa among JSON RPC 2.0, mga generator alang sa duha ka mga pinulongan ug tan-awon nato kung unsa pa.

Talagsaon nga bisan sa usa ka malipayon nga kaso, kung adunay halos parehas nga negosyo, ang Zalando, nga naghimo sa usa ka halos parehas nga solusyon, dili naton kini magamit nga epektibo.

Ang sumbanan sa arkitektura sa paglansad mao ang mga musunud: nagbasa kami direkta gikan sa Kafka, apan nagsulat lamang pinaagi sa mga panghitabo-bus. Adunay daghan nga andam alang sa pagbasa sa Kafka: mga brokers, balancer, ug kini labaw pa o dili kaayo andam alang sa horizontal scaling, gusto ko nga ipadayon kini. Gusto namon nga makompleto ang pagrekord pinaagi sa usa ka Gateway aka Events-bus, ug ania kung ngano.

Mga panghitabo-bus

O usa ka bus sa panghitabo. Kini usa lamang ka walay estado nga gateway sa http, nga adunay daghang importanteng papel:

  • Pagprodyus sa Validation - gisusi namon nga ang mga panghitabo nakab-ot sa among mga detalye.
  • Sistema sa master sa panghitabo, nga mao, kini ang panguna ug bugtong sistema sa kompanya nga nagtubag sa pangutana kung unsang mga panghitabo diin ang mga istruktura giisip nga balido. Ang pag-validate naglangkit lang sa mga tipo sa datos ug mga enum aron higpit nga ipiho ang sulud.
  • Hash function para sa sharding - ang Kafka message structure kay key-value ug gamit ang hash of key gikalkulo kung asa ibutang.

Nganong

Nagtrabaho kami sa usa ka dako nga kompanya nga adunay usa ka streamline nga proseso. Nganong usbon ang bisan unsa? Kini usa ka eksperimento, ug nagdahom kami nga makaani ug daghang kaayohan.

1:n+1 nga pagbayloay (usa ngadto sa daghan)

Gipadali sa Kafka ang pagkonektar sa mga bag-ong konsumedor sa API.

Ingnon ta nga ikaw adunay usa ka direktoryo nga kinahanglan nimo nga ipadayon ang pagka-update sa daghang mga sistema sa usa ka higayon (ug sa pipila nga mga bag-o). Kaniadto, nag-imbento kami usa ka bundle nga nagpatuman sa set-API, ug ang master system gipahibalo sa mga adres sa konsumedor. Karon ang master system nagpadala mga update sa hilisgutan, ug ang tanan nga interesado nagbasa niini. Usa ka bag-ong sistema ang nagpakita - gipirmahan namon kini alang sa hilisgutan. Oo, bundle usab, apan mas simple.

Sa kaso sa refund-tool, nga usa ka piraso sa BOB, sayon ​​​​alang kanamo nga ipadayon kini nga dungan pinaagi sa Kafka. Ang pagbayad nag-ingon nga ang kwarta gibalik: BOB, RT nahibal-an bahin niini, gibag-o ang ilang mga status, nahibal-an kini sa Fiscalization Service ug nag-isyu og tseke.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Kami adunay mga plano nga maghimo usa ka hiniusa nga Serbisyo sa Pagpahibalo nga magpahibalo sa kliyente bahin sa mga balita bahin sa iyang order / pagbalik. Karon kini nga responsibilidad mikaylap taliwala sa mga sistema. Igo na alang kanamo ang pagtudlo sa Serbisyo sa Pagpahibalo aron makuha ang may kalabutan nga kasayuran gikan sa Kafka ug tubagon kini (ug dili pag-disable kini nga mga pahibalo sa ubang mga sistema). Walay bag-ong direktang pagbayloay ang gikinahanglan.

Gipadagan sa datos

Ang impormasyon tali sa mga sistema nahimong transparent - bisan unsa pa ang imong "dugo nga negosyo" ug bisan unsa pa ka bug-at ang imong backlog. Ang Lamoda adunay departamento sa Data Analytics nga nagkolekta sa datos gikan sa mga sistema ug gibutang kini sa usa ka magamit nga porma, alang sa negosyo ug alang sa mga intelihente nga sistema. Gitugotan ka sa Kafka nga dali ka nga mahatagan sila daghang mga datos ug ipadayon ang pag-agay sa kasayuran hangtod karon.

Replikasyon nga log

Ang mga mensahe dili mawala human mabasa, sama sa RabbitMQ. Kung ang usa ka panghitabo adunay igo nga kasayuran alang sa pagproseso, kami adunay usa ka kasaysayan sa bag-ong mga pagbag-o sa butang, ug, kung gusto, ang abilidad sa paggamit niini nga mga pagbag-o.

Ang panahon sa pagtipig sa replication log nagdepende sa kakusog sa pagsulat niini nga hilisgutan; Gitugotan ka sa Kafka nga dali nga magtakda og mga limitasyon sa oras sa pagtipig ug gidaghanon sa datos. Alang sa intensive nga mga hilisgutan, importante nga ang tanan nga mga konsumedor adunay panahon sa pagbasa sa impormasyon sa dili pa kini mawala, bisan sa kaso sa mubo nga panahon nga inoperability. Kasagaran posible ang pagtipig sa datos alang sa yunit sa mga adlaw, nga igo na alang sa suporta.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Sunod, gamay nga pagsaysay pag-usab sa dokumentasyon, alang niadtong dili pamilyar sa Kafka (ang hulagway gikan usab sa dokumentasyon)

Ang AMQP adunay mga pila: nagsulat kami og mga mensahe sa usa ka pila para sa konsumidor. Kasagaran, ang usa ka pila giproseso sa usa ka sistema nga adunay parehas nga lohika sa negosyo. Kung kinahanglan nimo nga ipahibalo ang daghang mga sistema, mahimo nimong tudloan ang aplikasyon sa pagsulat sa daghang mga pila o i-configure ang pagbinayloay gamit ang mekanismo sa fanout, nga nag-clone mismo niini.

Ang Kafka adunay susama nga abstraction hilisgutan, diin nagsulat ka og mga mensahe, apan dili kini mawala human mabasa. Sa kasagaran, kung magkonektar ka sa Kafka, madawat nimo ang tanan nga mga mensahe ug adunay kapilian nga i-save kung diin ka mihunong. Sa ato pa, nagbasa ka nga sunud-sunod, mahimo nga dili nimo markahan ang mensahe nga nabasa, apan i-save ang id diin mahimo nimong ipadayon ang pagbasa. Ang Id nga imong gihusay gitawag og offset, ug ang mekanismo kay commit offset.

Subay niini, mahimong ipatuman ang lainlaing lohika. Pananglitan, kami adunay BOB sa 4 nga mga higayon alang sa lainlaing mga nasud - ang Lamoda naa sa Russia, Kazakhstan, Ukraine, Belarus. Tungod kay sila gi-deploy nga gilain, sila adunay gamay nga lahi nga mga config ug ilang kaugalingon nga lohika sa negosyo. Gipakita namo sa mensahe kung asa nga nasud ang gitumong niini. Ang matag konsumidor sa BOB sa matag nasud nagbasa nga adunay lahi nga groupId, ug kung ang mensahe dili magamit sa kanila, laktawan nila kini, i.e. diha-diha dayon naghimo sa offset +1. Kung ang parehas nga hilisgutan gibasa sa among Serbisyo sa Pagbayad, nan kini gibuhat sa usa ka lahi nga grupo, ug busa ang mga offset dili mag-intersect.

Mga kinahanglanon sa panghitabo:

  • Pagkakompleto sa datos. Gusto ko nga ang panghitabo adunay igo nga datos aron kini maproseso.

  • Kaligdong Gidelegar namo sa Events-bus ang pag-verify nga makanunayon ang panghitabo ug maproseso kini.
  • Importante ang order. Sa kaso sa pagbalik, napugos kita sa pagtrabaho uban sa kasaysayan. Uban sa mga pahibalo, ang order dili importante, kung sila mga homogenous nga mga pahibalo, ang email mahimong parehas bisan unsa pa ang order nga nauna. Sa kaso sa usa ka refund, adunay usa ka tin-aw nga proseso; kung usbon namon ang han-ay, ang mga eksepsiyon motungha, ang refund dili mabuhat o maproseso - matapos kami sa usa ka lahi nga kahimtang.
  • pagkamakanunayon. Adunay kami usa ka tindahan, ug karon naghimo kami mga panghitabo imbes nga usa ka API. Nagkinahanglan kami og usa ka paagi sa paspas ug barato nga pagpadala sa impormasyon mahitungod sa bag-ong mga panghitabo ug mga kausaban sa mga anaa na sa among mga serbisyo. Kini makab-ot pinaagi sa usa ka komon nga detalye sa usa ka bulag nga git repository ug code generators. Busa, ang mga kliyente ug mga server sa lainlaing mga serbisyo gi-coordinate.

Kafka sa Lamoda

Adunay kami tulo ka mga instalasyon sa Kafka:

  1. Mga troso;
  2. R&D;
  3. Mga panghitabo-bus.

Karon kita naghisgot lamang mahitungod sa katapusan nga punto. Sa mga panghitabo-bus, wala kami daghang mga pag-install - 3 nga mga broker (server) ug 27 ra nga mga hilisgutan. Ingon sa usa ka lagda, ang usa ka hilisgutan usa ka proseso. Apan kini usa ka maliputon nga punto, ug atong hisgotan kini karon.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Sa ibabaw mao ang rps graph. Ang proseso sa refund gimarkahan og turquoise nga linya (oo, ang usa sa X axis), ug ang pink nga linya mao ang proseso sa pag-update sa sulod.

Ang katalogo sa Lamoda adunay minilyon nga mga produkto, ug ang datos gi-update sa tanang panahon. Ang ubang mga koleksyon wala na sa uso, ang mga bag-o gipagawas aron ilisan kini, ug ang mga bag-ong modelo kanunay nga makita sa katalogo. Gisulayan namon nga matagna kung unsa ang makapainteres sa among mga kostumer ugma, mao nga kanunay kami nga namalit og bag-ong mga butang, litrato kini ug gi-update ang display case.

Ang mga pink nga taluktok mao ang mga update sa produkto, nga mao, mga pagbag-o sa mga produkto. Makita nga ang mga lalaki nagpa-picture, nagpa-picture, ug unya na usab! β€” Nag-load sa usa ka pakete sa mga panghitabo.

Mga kaso sa paggamit sa Lamoda Events

Gigamit namo ang gitukod nga arkitektura alang sa mosunod nga mga operasyon:

  • Pagsubay sa kahimtang sa pagbalik: call-to-action ug pagsubay sa status gikan sa tanang nalambigit nga sistema. Pagbayad, mga status, fiscalization, mga pahibalo. Dinhi among gisulayan ang pamaagi, naghimo mga himan, gikolekta ang tanan nga mga bug, nagsulat sa dokumentasyon ug gisultihan ang among mga kauban kung giunsa kini gamiton.
  • Pag-update sa mga kard sa produkto: configuration, meta-data, mga kinaiya. Usa ka sistema ang nagbasa (nga nagpakita), ug daghan ang nagsulat.
  • Email, push ug sms: nakolekta na ang order, naabot na ang order, gidawat na ang pagbalik, ug uban pa, daghan sila.
  • Stock, pagbag-o sa bodega β€” quantitative update sa mga butang, mga numero lang: pag-abot sa bodega, pagbalik. Kinahanglan nga ang tanan nga mga sistema nga adunay kalabotan sa pagreserba sa mga butang molihok uban ang pinakabag-o nga datos. Sa pagkakaron, ang sistema sa pag-update sa stock medyo komplikado; Pasimplehon kini sa Kafka.
  • Pagsusi sa Data (Departamento sa R&D), mga himan sa ML, analytics, estadistika. Gusto namon nga mahimong transparent ang kasayuran - Ang Kafka angay alang niini.

Karon ang mas makapaikag nga bahin bahin sa dagkong mga bumps ug makapaikag nga mga nadiskobrehan nga nahitabo sa miaging unom ka bulan.

Mga problema sa disenyo

Ingnon ta nga gusto namong buhaton ang usa ka bag-ong butang - pananglitan, ibalhin ang tibuuk nga proseso sa paghatud sa Kafka. Karon bahin sa proseso ang gipatuman sa Order Processing sa BOB. Adunay usa ka modelo sa status luyo sa pagbalhin sa usa ka order sa serbisyo sa paghatud, paglihok sa usa ka intermediate nga bodega, ug uban pa. Adunay usa ka tibuuk nga monolith, bisan duha, dugang usa ka hugpong sa mga API nga gipahinungod sa paghatud. Daghan pa sila nahibal-an bahin sa pagpadala.

Kini daw susama nga mga dapit, apan ang Order Processing sa BOB ug ang Shipping System adunay lain-laing mga status. Pananglitan, ang pipila ka mga serbisyo sa courier wala magpadala sa mga intermediate nga kahimtang, apan ang mga katapusan ra: "gihatud" o "nawala". Ang uban, sa kasukwahi, nagtaho sa daghang detalye bahin sa paglihok sa mga butang. Ang matag usa adunay ilang kaugalingon nga mga lagda sa pag-validate: alang sa uban, ang email balido, nga nagpasabut nga kini iproseso; alang sa uban dili kini balido, apan ang order maproseso gihapon tungod kay adunay numero sa telepono nga makontak, ug adunay moingon nga ang ingon nga order dili gayud maproseso.

Dapit nga stream

Sa kaso sa Kafka, ang pangutana sa pag-organisar sa dagan sa datos mitungha. Kini nga buluhaton naglakip sa pagpili sa usa ka estratehiya nga gibase sa daghang mga punto; atong susihon ang tanan.

Sa usa ka topiko o sa lainlain?

Adunay kami usa ka detalye sa panghitabo. Sa BOB among gisulat nga ang ingon ug ingon nga usa ka order kinahanglan nga ipadala, ug ipakita: ang numero sa order, komposisyon niini, pipila ka mga SKU ug bar code, ug uban pa. Kung moabut ang mga butang sa bodega, ang pagpadala makadawat mga kahimtang, mga timestamp ug tanan nga kinahanglan. Apan gusto namon nga makadawat mga update bahin sa kini nga datos sa BOB. Kita adunay usa ka balik nga proseso sa pagdawat sa data gikan sa delivery. Parehas ba kini nga panghitabo? O kini ba usa ka lahi nga pagbinayloay nga angay sa kaugalingon nga hilisgutan?

Lagmit, sila mahimong susama kaayo, ug ang pagtintal sa paghimo sa usa ka hilisgutan dili walay basehanan, tungod kay ang usa ka bulag nga hilisgutan nagpasabut nga lahi nga mga konsumedor, lahi nga mga config, usa ka lahi nga henerasyon sa tanan niini. Apan dili usa ka kamatuoran.

Bag-ong natad o bag-ong panghitabo?

Apan kung mogamit ka sa parehas nga mga panghitabo, unya adunay lain nga problema. Pananglitan, dili tanan nga mga sistema sa pagpadala makamugna sa matang sa DTO nga mahimo sa BOB. Gipadala namo kanila ang id, apan wala nila kini gitipigan tungod kay wala nila kini kinahanglana, ug gikan sa punto sa panglantaw sa pagsugod sa proseso sa event-bus, gikinahanglan kini nga field.

Kung gipaila namo ang usa ka lagda alang sa event-bus nga gikinahanglan kini nga field, nan mapugos kami sa pagtakda og dugang nga mga lagda sa validation sa BOB o sa start event handler. Ang pag-validate nagsugod sa pagkaylap sa tibuuk nga serbisyo - kini dili kaayo kombenyente.

Ang laing problema mao ang tentasyon sa incremental development. Gisultihan kita nga adunay kinahanglan nga idugang sa kalihokan, ug tingali, kung atong hunahunaon kini, kini kinahanglan nga lahi nga panghitabo. Apan sa among laraw, ang usa ka lahi nga panghitabo usa ka lahi nga hilisgutan. Ang usa ka lahi nga hilisgutan mao ang tibuuk nga proseso nga akong gihulagway sa ibabaw. Ang developer gitintal nga magdugang lang og laing field sa JSON schema ug i-regenerate kini.

Sa kaso sa mga refund, nakaabot kami sa panghitabo sa mga panghitabo sa tunga sa tuig. Kami adunay usa ka meta-event nga gitawag nga refund update, nga adunay usa ka tipo nga field nga naghulagway kung unsa gyud kini nga update. Tungod niini, kami adunay "katingalahan" nga mga switch nga adunay mga validator nga nagsulti kanamo kung giunsa pag-validate kini nga panghitabo sa kini nga tipo.

Pag-bersyon sa panghitabo

Aron ma-validate ang mga mensahe sa Kafka mahimo nimong gamiton Avro, apan gikinahanglan nga ibutang dayon kini ug gamiton ang Confluent. Sa among kaso, kinahanglan nga mag-amping kami sa pag-bersyon. Dili kanunay posible nga basahon pag-usab ang mga mensahe gikan sa replication log tungod kay ang modelo "wala". Sa panguna, kini nahimo nga paghimo og mga bersyon aron ang modelo nahiuyon sa likod: pananglitan, paghimo usa ka uma nga temporaryo nga opsyonal. Kung ang mga kalainan kusog kaayo, magsugod kami sa pagsulat sa usa ka bag-ong hilisgutan, ug ibalhin ang mga kliyente kung nahuman na nila pagbasa ang daan.

Garantiya nga han-ay sa pagbasa sa mga partisyon

Ang mga hilisgutan sa sulod sa Kafka gibahin sa mga partisyon. Dili kaayo kini hinungdanon samtang nagdesinyo kami og mga entidad ug mga pagbinayloay, apan hinungdanon kini kung magdesisyon kung unsaon pagkonsumo ug pagsukod niini.

Sa naandan nga kaso, nagsulat ka usa ka hilisgutan sa Kafka. Sa kasagaran, usa ka partisyon ang gigamit, ug ang tanan nga mga mensahe niini nga hilisgutan moadto niini. Ug ang konsyumer tungod niini nagbasa niini nga mga mensahe nga sunud-sunod. Ingnon ta karon kinahanglan natong palapdan ang sistema aron ang mga mensahe mabasa sa duha ka managlahing konsumidor. Kung, pananglitan, nagpadala ka og SMS, mahimo nimong sultihan si Kafka nga maghimo usa ka dugang nga partisyon, ug ang Kafka magsugod sa pagbahin sa mga mensahe sa duha ka bahin - katunga dinhi, katunga dinhi.

Giunsa sila pagbahinbahin sa Kafka? Ang matag mensahe adunay lawas (diin among gitipigan ang JSON) ug usa ka yawe. Mahimo nimong ilakip ang usa ka hash function sa kini nga yawe, nga magtino kung unsang partisyon ang mosulod sa mensahe.

Sa among kaso nga adunay mga refund, hinungdanon kini, kung magkuha kami duha nga partisyon, nan adunay higayon nga ang usa ka managsama nga konsumedor magproseso sa ikaduha nga panghitabo sa wala pa ang una ug adunay kasamok. Ang hash function nagsiguro nga ang mga mensahe nga adunay parehas nga yawe matapos sa parehas nga partisyon.

Mga panghitabo vs mga sugo

Kini usa pa ka problema nga among nasugatan. Ang panghitabo usa ka piho nga panghitabo: giingon namon nga adunay nahitabo sa usa ka lugar (something_happened), pananglitan, usa ka butang ang nakansela o usa ka refund ang nahitabo. Kung adunay maminaw niini nga mga panghitabo, unya sumala sa "gikanselar ang butang," ang refund entity pagabuhaton, ug ang "refund nahitabo" isulat sa usa ka dapit sa mga setup.

Apan kasagaran, kung magdesinyo ka og mga panghitabo, dili nimo gusto nga isulat kini nga walay kapuslanan - nagsalig ka sa kamatuoran nga adunay usa nga mobasa niini. Adunay usa ka taas nga tentasyon sa pagsulat dili usa ka butang_nahitabo (item_canceled, refund_refund), apan usa ka butang_kinahanglan_buhaton. Pananglitan, ang butang andam na nga ibalik.

Sa usa ka bahin, gisugyot niini kung giunsa ang paggamit sa kalihokan. Sa laing bahin, kini dili kaayo sama sa usa ka normal nga ngalan sa panghitabo. Gawas pa, dili layo dinhi ang do_something nga sugo. Apan wala ka'y ​​garantiya nga adunay makabasa niini nga panghitabo; ug kon imo kining basahon, nan imong gibasa kini nga malampuson; ug kung malampuson nimo nga nabasa kini, nan nakahimo ka og usa ka butang, ug kana usa ka butang nga malampuson. Sa higayon nga ang usa ka panghitabo mahimong usa ka butang, ang feedback mahimong kinahanglanon, ug kana usa ka problema.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Sa asynchronous nga pagbinayloay sa RabbitMQ, kung imong basahon ang mensahe, adto sa http, ikaw adunay tubag - labing menos nga ang mensahe nadawat. Kung nagsulat ka sa Kafka, adunay mensahe nga imong gisulat sa Kafka, apan wala ka nahibal-an kung giunsa kini giproseso.

Busa, sa among kaso, kinahanglan namon nga ipaila ang usa ka panghitabo sa pagtubag ug i-set up ang pag-monitor aron kung daghang mga panghitabo ang ipadala, pagkahuman sa ingon ug ingon nga oras ang parehas nga gidaghanon sa mga panghitabo sa pagtubag kinahanglan moabut. Kung dili kini mahitabo, nan adunay usa ka butang nga dili maayo. Pananglitan, kung kami nagpadala sa "item_ready_to_refund" nga panghitabo, kami nagpaabut nga ang usa ka refund pagabuhaton, ang kwarta ibalik sa kliyente, ug ang "money_refund" nga panghitabo ipadala kanamo. Apan dili kini sigurado, busa gikinahanglan ang pagmonitor.

Nuances

Adunay usa ka klaro nga problema: kung magbasa ka gikan sa usa ka hilisgutan nga sunud-sunod, ug adunay usa ka dili maayo nga mensahe, mahulog ang konsumedor, ug dili ka mopadayon. Kinahanglan nimo hunong sa tanang konsumidor, pasalig sa dugang nga offset aron makapadayon sa pagbasa.

Nahibal-an namon kini, nagsalig kami niini, ug bisan pa kini nahitabo. Ug kini nahitabo tungod kay ang panghitabo balido gikan sa punto sa panglantaw sa mga panghitabo-bus, ang panghitabo balido gikan sa punto sa panglantaw sa aplikasyon validator, apan kini dili balido gikan sa punto sa panglantaw sa PostgreSQL, tungod kay sa atong sistema MySQL uban sa UNSIGNED INT ang sistema adunay PostgreSQL lang sa INT. Ang iyang gidak-on mas gamay, ug ang Id dili mohaum. Si Symfony namatay nga adunay eksepsiyon. Kami, siyempre, nakakuha sa eksepsiyon tungod kay nagsalig kami niini, ug buhaton kini nga offset, apan sa wala pa kana gusto namon nga madugangan ang kontra sa problema, tungod kay ang mensahe giproseso nga wala magmalampuson. Ang mga counter niini nga proyekto naa usab sa database, ug gisirado na ni Symfony ang komunikasyon sa database, ug ang ikaduha nga eksepsiyon nagpatay sa tibuuk nga proseso nga wala’y higayon nga mag-offset.

Ang serbisyo nagpabilin sulod sa pipila ka panahon - swerte, uban sa Kafka kini dili kaayo daotan, tungod kay ang mga mensahe nagpabilin. Kung nabalik ang trabaho, mahimo nimong tapuson ang pagbasa niini. Kini komportable.

Ang Kafka adunay katakus nga magbutang usa ka arbitraryong offset pinaagi sa tooling. Apan aron mahimo kini, kinahanglan nimo nga hunongon ang tanan nga mga konsumedor - sa among kaso, pag-andam usa ka lahi nga pagpagawas diin wala’y mga konsumedor, pag-redeploy. Dayon sa Kafka mahimo nimong ibalhin ang offset pinaagi sa tooling, ug ang mensahe moagi.

Laing nuance - replication log vs rdkafka.so - may kalabutan sa mga detalye sa among proyekto. Gigamit namon ang PHP, ug sa PHP, ingon nga usa ka lagda, ang tanan nga mga librarya nakigsulti sa Kafka pinaagi sa rdkafka.so repository, ug unya adunay usa ka matang sa wrapper. Tingali kini ang atong mga personal nga kalisud, apan nahimo nga ang pagbasa pag-usab sa usa ka piraso sa atong nabasa na dili kaayo sayon. Sa kinatibuk-an, adunay mga problema sa software.

Pagbalik sa mga detalye sa pagtrabaho sa mga partisyon, gisulat kini mismo sa dokumentasyon mga konsumidor >= mga partisyon sa hilisgutan. Apan nahibal-an nako kini labi pa sa akong gusto. Kung gusto nimo nga sukdon ug adunay duha ka mga konsumedor, kinahanglan nimo labing menos duha ka partisyon. Kana mao, kung ikaw adunay usa ka partisyon diin 20 ka libo nga mga mensahe ang natipon, ug naghimo ka usa ka bag-o, ang gidaghanon sa mga mensahe dili ma-equalize sa dili madugay. Busa, aron adunay duha ka managsama nga mga konsumedor, kinahanglan nimo nga atubangon ang mga partisyon.

Pagbantay

Sa akong hunahuna ang paagi sa pag-monitor niini mas klaro kung unsa ang mga problema nga naa sa kasamtangan nga pamaagi.

Pananglitan, among gikalkulo kung pila ka mga produkto sa database ang bag-o lang nagbag-o sa ilang kahimtang, ug, sumala niana, ang mga panghitabo kinahanglan nga nahitabo base sa kini nga mga pagbag-o, ug gipadala namon kini nga numero sa among sistema sa pag-monitor. Unya gikan sa Kafka atong makuha ang ikaduhang numero, pila ka mga panghitabo ang aktuwal nga natala. Dayag, ang kalainan tali niining duha ka numero kinahanglan kanunay nga zero.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Dugang pa, kinahanglan nimo nga bantayan kung giunsa ang paghimo sa prodyuser, kung ang mga panghitabo-bus nakadawat mga mensahe, ug kung giunsa ang gibuhat sa konsumedor. Pananglitan, sa mga tsart sa ubos, maayo ang gibuhat sa Refund Tool, apan ang BOB klaro nga adunay pipila ka mga problema (asul nga mga taluktok).

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Nahisgotan na nako ang consumer-group lag. Sa kinatibuk-an, kini ang gidaghanon sa wala pa mabasa nga mga mensahe. Sa kinatibuk-an, ang among mga konsumedor dali nga nagtrabaho, mao nga ang lag kasagaran 0, apan usahay adunay usa ka mubo nga termino nga peak. Mahimo kini ni Kafka sa gawas sa kahon, apan kinahanglan nimo nga magbutang usa ka piho nga agwat.

Adunay usa ka proyekto Burrownga maghatag kanimo ug dugang impormasyon sa Kafka. Gigamit lang niini ang consumer-group API aron mahatagan ang kahimtang kung giunsa kini nga grupo. Dugang pa sa OK ug Napakyas, adunay usa ka pasidaan, ug imong mahibal-an nga ang imong mga konsumedor dili makasagubang sa dagan sa produksiyon - wala silay panahon sa pag-proofread sa nahisulat. Ang sistema intelihente ug dali gamiton.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Kini ang hitsura sa tubag sa API. Ania ang grupo bob-live-fifa, partition refund.update.v1, status OK, lag 0 - ang katapusan nga katapusan nga offset ingon ug ingon niana.

Kasinatian sa pagpalambo sa serbisyo sa Refund Tool nga adunay asynchronous nga API sa Kafka

Pagbantay updated_at SLA (na-stuck) nahisgotan na nako. Pananglitan, ang produkto nausab sa kahimtang nga kini andam na nga ibalik. Gi-install namon ang Cron, nga nag-ingon nga kung sa 5 minuto kini nga butang wala ma-refund (nagbalik kami sa salapi pinaagi sa mga sistema sa pagbayad nga dali), nan adunay usa ka butang nga sayup, ug kini siguradong usa ka kaso alang sa suporta. Busa, gikuha lang namo ang Cron, nga nagbasa sa ingon nga mga butang, ug kung kini labaw pa sa 0, nan kini nagpadala usa ka alerto.

Sa pag-summarize, ang paggamit sa mga panghitabo kombenyente kung:

  • gikinahanglan ang impormasyon sa daghang sistema;
  • ang resulta sa pagproseso dili importante;
  • adunay pipila ka mga panghitabo o gagmay nga mga panghitabo.

Mopatim-aw nga ang artikulo adunay usa ka piho nga hilisgutan - asynchronous nga API sa Kafka, apan bahin niini gusto nako nga irekomenda ang daghang mga butang sa usa ka higayon.
Una, sunod Taas nga Load++ kinahanglan nga maghulat kita hangtod sa Nobyembre, sa Abril adunay bersyon sa St. Petersburg, ug sa Hunyo maghisgot kita bahin sa taas nga mga karga sa Novosibirsk.
Ikaduha, ang tagsulat sa taho, si Sergei Zaika, usa ka miyembro sa Program Committee sa among bag-ong komperensya sa pagdumala sa kahibalo KahibaloConf. Ang komperensya usa ka adlaw, mahitabo sa Abril 26, apan ang programa niini grabe kaayo.
Ug kini mahitabo sa Mayo PHP Russia ΠΈ RIT++ (uban ang DevOpsConf) - mahimo usab nimo nga isugyot ang imong hilisgutan didto, isulti ang bahin sa imong kasinatian ug ireklamo ang imong giputos nga mga cone.

Source: www.habr.com

Idugang sa usa ka comment