Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Menene zai iya tilasta irin wannan babban kamfani kamar Lamoda, tare da ingantaccen tsari da dumbin ayyukan haɗin gwiwa, don canza tsarinsa sosai? Ƙarfafawa na iya bambanta gaba ɗaya: daga majalisa zuwa sha'awar gwaji a cikin dukkan masu shirye-shirye.

Amma wannan ba yana nufin cewa ba za ku iya ƙidaya ƙarin fa'idodi ba. Sergey Zaika zai gaya muku ainihin abin da za ku iya cin nasara idan kun aiwatar da abubuwan da suka faru na API akan Kafka (kadan). Hakanan za a yi magana game da manyan hotuna da bincike masu ban sha'awa - gwajin ba zai iya yin ba tare da su ba.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Disclaimer: Wannan labarin ya dogara ne akan kayan daga haɗuwa da Sergey ya gudanar a watan Nuwamba 2018 akan HighLoad ++. Kwarewar Lamoda kai tsaye ta yin aiki tare da Kafka ta ja hankalin masu sauraro ba kasa da sauran rahotanni kan jadawalin. Muna tsammanin wannan kyakkyawan misali ne na gaskiyar cewa za ku iya kuma ya kamata koyaushe ku sami mutane masu tunani iri ɗaya, kuma masu shirya HighLoad ++ za su ci gaba da ƙoƙarin ƙirƙirar yanayi mai dacewa da wannan.

Game da tsari

Lamoda babban dandamali ne na kasuwancin e-commerce wanda ke da cibiyar tuntuɓar sa, sabis na isar da saƙo (da masu alaƙa da yawa), ɗakin daukar hoto, babban ɗakin ajiya, kuma duk wannan yana gudana akan nasa software. Akwai hanyoyi da yawa na biyan kuɗi, abokan b2b waɗanda za su iya amfani da wasu ko duk waɗannan ayyukan kuma suna son sanin sabbin bayanai kan samfuran su. Bugu da kari, Lamoda yana aiki a cikin kasashe uku ban da Tarayyar Rasha kuma komai ya ɗan bambanta a can. Gabaɗaya, ƙila akwai hanyoyi sama da ɗari don daidaita sabon tsari, wanda dole ne a sarrafa shi ta hanyar kansa. Duk wannan yana aiki tare da taimakon ayyuka da yawa waɗanda wani lokaci suna sadarwa ta hanyoyin da ba a bayyane ba. Hakanan akwai tsarin tsakiya wanda babban alhakinsa shine oda matsayi. Muna kiranta BOB, ina aiki da ita.

Kayan aikin mayar da kuɗi tare da API ɗin abubuwan da ke gudana

Kalmar abubuwan da suka faru da gaske an yi hackneyed; a ɗan gaba za mu bayyana dalla-dalla abin da ake nufi da wannan. Zan fara da mahallin da muka yanke shawarar gwada tsarin API na abubuwan da ke gudana a cikin Kafka.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

A kowane shago, baya ga umarni da abokan ciniki ke biya, akwai lokutan da ake buƙatar kantin sayar da kuɗi don dawo da kuɗi saboda samfurin bai dace da abokin ciniki ba. Wannan ɗan gajeren tsari ne: muna fayyace bayanan, idan ya cancanta, da canja wurin kuɗi.

Amma dawowar ta zama mafi rikitarwa saboda canje-canje a cikin dokoki, kuma dole ne mu aiwatar da wani microservice na daban don shi.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Burin mu:

  1. Dokar FZ-54 - a takaice, doka tana buƙatar bayar da rahoto ga ofishin haraji game da kowace ma'amala ta kuɗi, koma ko rasidi, cikin ɗan gajeren SLA na ƴan mintuna kaɗan. Mu, a matsayin kamfanin kasuwancin e-commerce, muna gudanar da ayyuka da yawa. A fasaha, wannan yana nufin sabon alhakin (saboda haka sabon sabis) da haɓakawa a cikin duk tsarin da abin ya shafa.
  2. BOB ya raba wani aikin cikin gida ne na kamfanin don sauke BOB daga babban adadin nauyin da ba na asali ba kuma ya rage girmansa gaba ɗaya.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Wannan zane yana nuna manyan tsarin Lamoda. Yanzu mafi yawansu sun fi yawa ƙungiyar taurari na 5-10 microservices a kusa da monolith mai raguwa. Suna girma a hankali, amma muna ƙoƙarin sanya su ƙarami, saboda ƙaddamar da guntun da aka zaɓa a tsakiya yana da ban tsoro - ba za mu iya barin shi ya fadi ba. An tilasta mana mu tanadi duk musanya (kibau) kuma muyi la'akari da gaskiyar cewa kowane ɗayansu na iya zama babu shi.

BOB kuma yana da musanya da yawa: tsarin biyan kuɗi, tsarin bayarwa, tsarin sanarwa, da sauransu.

A zahiri BOB shine:

  • ~ 150k layin lambar + ~ 100k layin gwaje-gwaje;
  • php7.2 + Zend 1 & Abubuwan Symfony 3;
  • > APIs 100 & ~ 50 masu fita waje;
  • Kasashe 4 da dabarun kasuwancin su.

Aiwatar da BOB yana da tsada kuma yana da zafi, adadin code da matsalolin da yake warwarewa shine wanda ba wanda zai iya sanya shi duka a cikin kawunansu. Gabaɗaya, akwai dalilai da yawa don sauƙaƙe shi.

Tsarin Komawa

Da farko, tsarin guda biyu suna cikin tsarin: BOB da Biyan kuɗi. Yanzu wasu biyu sun bayyana:

  • Sabis na Fiscalization, wanda zai kula da matsaloli tare da kasafin kuɗi da sadarwa tare da sabis na waje.
  • Kayan aikin Maida Kuɗaɗe, wanda kawai ya ƙunshi sabbin musanya don kar a ƙara BOB.

Yanzu tsarin yayi kama da haka:

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

  1. BOB ya karɓi buƙatun maidowa.
  2. BOB yayi magana game da wannan Kayan aikin Maida Kuɗi.
  3. The Refund Tool ya gaya Biya: "Mayar da kuɗin."
  4. Biyan kuɗi yana mayar da kuɗin.
  5. Kayan aikin mayar da kuɗi da BOB suna aiki tare da matsayi tare da juna, saboda a yanzu duka suna buƙatar shi. Har yanzu ba mu shirya don canjawa gaba ɗaya zuwa Kayan Aikin Maida ba, tunda BOB yana da UI, rahotanni don lissafin kuɗi, da ma gabaɗaya bayanai da yawa waɗanda ba za a iya canjawa wuri da sauƙi ba. Dole ne ku zauna akan kujeru biyu.
  6. Buƙatun kasafin kuɗi ya tafi.

A sakamakon haka, mun yi wani irin taron bas a kan Kafka - taron-bus, wanda duk abin da ya fara. Hurray, yanzu muna da maki guda na kasawa (bagi).

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Ribobi da fursunoni a bayyane suke. Mun yi bas, wanda ke nufin cewa yanzu duk ayyuka sun dogara da ita. Wannan yana sauƙaƙe ƙira, amma yana gabatar da maki guda na gazawa a cikin tsarin. Kafka zai fadi, tsarin zai tsaya.

Menene API ɗin da ke tafiyar da al'amura

Kyakkyawan amsar wannan tambayar tana cikin rahoton Martin Fowler (GOTO 2017) "Ma'anoni da yawa na Gine-ginen Abubuwan da ke Kokawa".

A takaice abin da muka yi:

  1. Rufe duk musayar asynchronous ta hanyar abubuwan ajiya. Maimakon sanar da kowane mabukaci mai sha'awar game da canjin matsayi akan hanyar sadarwa, muna rubuta wani lamari game da canjin matsayi zuwa ma'auni na tsakiya, kuma masu amfani da sha'awar batun sun karanta duk abin da ya bayyana daga can.
  2. Lamarin a wannan yanayin sanarwa ne (sanarwar) cewa wani abu ya canza a wani wuri. Misali, yanayin oda ya canza. Mabukaci wanda ke sha'awar wasu bayanan da ke tare da canjin matsayi wanda ba a haɗa shi cikin sanarwar ba zai iya gano matsayinsa da kansa.
  3. Matsakaicin zaɓin shine cikakken tsarin samar da taron, canja wuri na jiha, a cikin abin da taron ya ƙunshi duk bayanan da ake buƙata don sarrafawa: inda ya fito da kuma wane matsayi ya tafi, yadda ainihin bayanan ya canza, da dai sauransu. Abin tambaya kawai shine yiwuwar da adadin bayanan da za ku iya adanawa.

A matsayin wani ɓangare na ƙaddamar da Kayan aikin Maidowa, mun yi amfani da zaɓi na uku. Wannan sauƙaƙe sarrafa taron tunda babu buƙatar fitar da cikakkun bayanai, ƙari kuma ya kawar da yanayin inda kowane sabon taron ke haifar da fashewar buƙatu daga masu siye.

Sabis na Kayan Aiki ba a ɗora ba, don haka Kafka akwai ɗanɗanon alkalami fiye da larura. Ba na tsammanin cewa idan sabis na mayar da kuɗi ya zama babban aiki mai kayatarwa, kasuwanci zai yi farin ciki.

Async musayar AS IS

Don musayar asynchronous, sashen PHP yawanci yana amfani da RabbitMQ. Mun tattara bayanan don buƙatun, mun sanya su a cikin layi, kuma mabukaci na wannan sabis ɗin ya karanta kuma ya aika (ko bai aika ba). Don API ɗin kanta, Lamoda yana amfani da Swagger sosai. Muna tsara API, mu kwatanta shi a cikin Swagger, kuma muna samar da abokin ciniki da lambar uwar garke. Hakanan muna amfani da ɗan haɓaka JSON RPC 2.0.

A wasu wurare ana amfani da motocin ESB, wasu suna rayuwa akan aikiMQ, amma, gabaɗaya, RabbitMQ - misali.

Async musayar TO BE

Lokacin zayyana musayar ta hanyar bas-bas, ana iya gano kwatance. Hakazalika muna kwatanta musayar bayanai na gaba ta hanyar bayanin tsarin taron. Tsarin yaml, dole ne mu yi ƙirar code da kanmu, janareta ya ƙirƙira DTOs bisa ga ƙayyadaddun bayanai kuma yana koya wa abokan ciniki da sabar su yi aiki tare da su. Generation ya shiga cikin harsuna biyu - golan dan php. Wannan yana taimakawa kiyaye ɗakunan karatu daidai gwargwado. An rubuta janareta da Golang, shi ya sa ya samu sunan gogi.

Abubuwan da suka faru akan Kafka abu ne na yau da kullun. Akwai mafita daga babban sigar kasuwancin Kafka Confluent, akwai nakadi, mafita daga yankin mu yan'uwa Zalando. Mu dalili don farawa da vanilla Kafka - wannan yana nufin barin mafita kyauta har sai mun yanke shawarar ko za mu yi amfani da shi a ko'ina, da kuma barin kanmu dakin motsa jiki da ingantawa: muna son goyon baya ga mu. JSON RPC 2.0, janareta don harsuna biyu kuma bari mu ga menene kuma.

Yana da ban mamaki cewa ko da a cikin irin wannan yanayin farin ciki, idan akwai kusan kasuwanci irin wannan, Zalando, wanda ya yi kusan irin wannan bayani, ba za mu iya amfani da shi yadda ya kamata ba.

Tsarin gine-gine a ƙaddamarwa shine kamar haka: muna karantawa kai tsaye daga Kafka, amma rubuta kawai ta hanyar abubuwan da suka faru-bas. Akwai shirye-shiryen da yawa don karantawa a cikin Kafka: dillalai, masu daidaitawa, kuma yana da yawa ko žasa shirye don sikelin kwance, Ina so in kiyaye wannan. Mun so mu kammala rikodin ta hanyar Ƙofar Kofar guda ɗaya aka Events-bus, kuma ga dalilin.

Events-bas

Ko bas taron. Wannan kawai ƙofar http ce mara ƙasa, wacce ke ɗaukar ayyuka masu mahimmanci da yawa:

  • Samar da Tabbatarwa - muna bincika cewa abubuwan da suka faru sun dace da ƙayyadaddun mu.
  • Tsarin babban taron, Wato, wannan shine babban kuma kawai tsarin a cikin kamfanin wanda ke amsa tambayar waɗanne abubuwan da suka faru tare da tsarin da ake la'akari da inganci. Tabbatarwa kawai ya ƙunshi nau'ikan bayanai da ƙididdiga don ƙayyadadden abun ciki.
  • Aikin Hash don sharding - tsarin saƙon Kafka shine maɓalli-darajar kuma ta amfani da hash na maɓalli ana ƙididdige inda za a saka shi.

Me ya sa

Muna aiki a cikin babban kamfani tare da ingantaccen tsari. Me yasa canza wani abu? Wannan gwaji ne, kuma muna sa ran samun fa'idodi da yawa.

1: n+1 musayar (daya zuwa da yawa)

Kafka yana sa ya zama mai sauƙi don haɗa sabbin masu amfani da API.

Bari mu ce kuna da kundin adireshi wanda kuke buƙatar ci gaba da sabuntawa a cikin tsarin da yawa lokaci ɗaya (kuma a wasu sababbi). A baya can, mun ƙirƙira wani gungu wanda ya aiwatar da saiti-API, kuma an sanar da tsarin babban adireshin adireshin mabukaci. Yanzu babban tsarin yana aika sabuntawa zuwa batun, kuma duk wanda ke sha'awar karanta shi. Wani sabon tsari ya bayyana - mun sanya hannu don batun. Ee, kuma daure, amma mafi sauƙi.

Game da kayan aikin dawo da kuɗi, wanda yanki ne na BOB, ya dace mana mu kiyaye su ta hanyar Kafka. Biyan ya ce an dawo da kuɗin: ​​BOB, RT ya gano wannan, canza matsayin su, Ma'aikatar Fiscalization ta gano wannan kuma ta ba da rajistan.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Muna da tsare-tsare don ƙirƙirar haɗin kai Sabis na Fadakarwa wanda zai sanar da abokin ciniki game da labarai game da odarsa/dawowa. Yanzu wannan alhakin yana yada tsakanin tsarin. Zai ishe mu koyar da Sabis na Fadakarwa don kama bayanan da suka dace daga Kafka kuma mu amsa shi (kuma mu kashe waɗannan sanarwar a wasu tsarin). Ba za a buƙaci sabon musayar kai tsaye ba.

Bayar da bayanai

Bayani tsakanin tsarin ya zama bayyananne - komai "kasuwancin jini" da kuke da shi kuma komai girman bayanan ku. Lamoda yana da Sashen Nazarin Bayanai wanda ke tattara bayanai daga tsarin kuma yana sanya su cikin sigar da za a iya sake amfani da su, na kasuwanci da na tsarin fasaha. Kafka yana ba ku damar hanzarta ba su bayanai da yawa kuma ku ci gaba da gudana har zuwa yau.

Littafin maimaitawa

Saƙonni ba sa ɓacewa bayan karantawa, kamar a cikin RabbitMQ. Lokacin da wani abu ya ƙunshi isassun bayanai don sarrafawa, muna da tarihin canje-canje na kwanan nan ga abu, kuma, idan ana so, ikon yin amfani da waɗannan canje-canje.

Lokacin ajiya na rajistan maimaitawa ya dogara da ƙarfin rubutawa zuwa wannan batu; Kafka yana ba ku damar saita iyaka a hankali kan lokacin ajiya da ƙarar bayanai. Don batutuwa masu mahimmanci, yana da mahimmanci cewa duk masu amfani suna da lokaci don karanta bayanin kafin ya ɓace, ko da a cikin yanayin rashin aiki na ɗan gajeren lokaci. Yawancin lokaci yana yiwuwa a adana bayanai don raka'a na kwanaki, wanda ya isa don tallafi.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Na gaba, ɗan sake maimaita takardun, ga waɗanda ba su da masaniya da Kafka (hoton kuma daga takardun)

AMQP yana da jerin gwano: muna rubuta saƙonni zuwa jerin gwano don mabukaci. Yawanci, ana sarrafa layi ɗaya ta hanyar tsari ɗaya tare da dabaru iri ɗaya na kasuwanci. Idan kuna buƙatar sanar da tsarin da yawa, zaku iya koyar da aikace-aikacen don rubuta zuwa ga layukan da yawa ko saita musayar tare da tsarin fanout, wanda ke rufe su da kansa.

Kafka yana da irin wannan abstraction topic, wanda kuke rubuta saƙonni, amma ba sa bace bayan karantawa. Ta hanyar tsoho, lokacin da kuka haɗa zuwa Kafka, kuna karɓar duk saƙonni kuma kuna da zaɓi don adanawa daga inda kuka tsaya. Wato, kuna karantawa a jere, ƙila ba za ku yiwa saƙon alama kamar yadda aka karanta ba, amma ku adana id ɗin da za ku ci gaba da karantawa. Id ɗin da kuka zauna akan shi ana kiransa offset, kuma tsarin aikin shine kashewa.

Saboda haka, ana iya aiwatar da dabaru daban-daban. Misali, muna da BOB a lokuta 4 don kasashe daban-daban - Lamoda yana cikin Rasha, Kazakhstan, Ukraine, Belarus. Tunda an tura su daban, suna da tsarin saiti daban-daban da dabarun kasuwancin su. A cikin sakon mun nuna wace kasa take nufi. Kowane mai amfani da BOB a kowace ƙasa yana karantawa da ƙungiyar Id daban-daban, kuma idan sakon bai shafe su ba, sai su tsallake shi, watau. nan da nan ya aikata diyya +1. Idan Sabis ɗin Biyan Kuɗi ɗinmu yana karanta wannan batu, to yana yin haka tare da rukunin daban, sabili da haka kashewa ba sa shiga tsakani.

Bukatun taron:

  • Cikakkun bayanai. Ina son taron ya sami isassun bayanai domin a iya sarrafa shi.

  • Mutunci. Mun wakilta zuwa Events-bas tabbacin cewa taron ya daidaita kuma yana iya sarrafa shi.
  • Oda yana da mahimmanci. A yanayin dawowa, an tilasta mana muyi aiki tare da tarihi. Tare da sanarwa, odar ba ta da mahimmanci, idan sanarwar ce ta kamanni, imel ɗin zai kasance iri ɗaya ba tare da la'akari da wane tsari ya fara zuwa ba. A cikin yanayin dawo da kuɗi, akwai tsari bayyananne; idan muka canza oda, keɓancewa za su taso, ba za a ƙirƙiri ko sarrafa kuɗin dawowa ba - za mu ƙare cikin wani matsayi na daban.
  • Daidaitawa. Muna da kantin sayar da kayayyaki, kuma yanzu muna ƙirƙirar abubuwan da suka faru maimakon API. Muna buƙatar wata hanya don watsa bayanai cikin sauri da arha game da sabbin abubuwan da suka faru da canje-canje ga waɗanda suke zuwa ayyukanmu. Ana samun wannan ta hanyar ƙayyadaddun ƙayyadaddun bayanai na gama gari a cikin keɓanta ma'ajiyar git da kuma janareta na lamba. Saboda haka, abokan ciniki da sabar a cikin ayyuka daban-daban suna daidaitawa.

Kafka in Lamoda

Muna da shigarwar Kafka guda uku:

  1. Logs;
  2. R&D;
  3. Events-bas.

A yau muna magana ne kawai game da batu na ƙarshe. A events-bus, ba mu da manya-manyan shigarwa - dillalai 3 (sabar) da kawai 27 batutuwa. A matsayinka na mai mulki, batu daya shine tsari daya. Amma wannan batu ne da hankali, kuma za mu taɓa shi a yanzu.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

A sama akwai jadawalin rps. Ana yiwa tsarin maidowa alama da layin turquoise (e, wanda ke kan axis X), kuma layin ruwan hoda shine tsarin sabunta abun ciki.

Kundin Lamoda ya ƙunshi miliyoyin kayayyaki, kuma ana sabunta bayanan koyaushe. Wasu tarin sun fita daga salon, an saki sababbin don maye gurbin su, kuma sababbin samfurori suna fitowa kullum a cikin kasida. Muna ƙoƙarin yin hasashen abin da zai zama mai ban sha'awa ga abokan cinikinmu gobe, don haka koyaushe muna siyan sabbin abubuwa, ɗaukar hoto da sabunta yanayin nuni.

Kololuwar ruwan hoda shine sabunta samfur, wato, canje-canje a cikin samfura. Ana iya ganin cewa mutanen sun dauki hotuna, sun dauki hotuna, sannan kuma! - loda fakitin abubuwan da suka faru.

Lamoda Events suna amfani da lokuta

Muna amfani da ginin gine-ginen don ayyuka masu zuwa:

  • Komawa halin sa ido: kira-to-aiki da bin diddigin matsayi daga duk tsarin da abin ya shafa. Biyan kuɗi, matsayi, kasafin kuɗi, sanarwa. Anan mun gwada hanyar, mun yi kayan aiki, tattara duk kwari, rubuta takardu kuma mun gaya wa abokan aikinmu yadda ake amfani da su.
  • Ana sabunta katunan samfur: daidaitawa, meta-data, halaye. Tsari ɗaya yana karantawa (wanda ke nunawa), kuma yana rubutu da yawa.
  • Imel, turawa da sms: an karbo odar, odar ta iso, an karXNUMXi dawowa, da dai sauransu, suna da yawa.
  • Hannun jari, sabuntawar sito - sabuntawar adadi na abubuwa, lambobi kawai: isowa cikin sito, dawowa. Wajibi ne duk tsarin da ke da alaƙa da ajiyar kaya yayi aiki tare da mafi yawan bayanan yanzu. A halin yanzu, tsarin sabunta hannun jari yana da wahala sosai; Kafka zai sauƙaƙa shi.
  • data Analysis (Sashen R&D), kayan aikin ML, nazari, ƙididdiga. Muna son bayanin ya kasance a bayyane - Kafka ya dace da wannan.

Yanzu mafi ban sha'awa sashi game da manyan bumps da abubuwan ban sha'awa da suka faru a cikin watanni shida da suka gabata.

Matsalolin ƙira

Bari mu ce muna son yin wani sabon abu - alal misali, canja wurin duk tsarin isarwa zuwa Kafka. Yanzu an aiwatar da wani ɓangare na tsari a cikin Tsarin oda a cikin BOB. Akwai samfurin matsayi a bayan canja wurin oda zuwa sabis na isarwa, motsi zuwa ɗakunan ajiya na tsaka-tsaki, da sauransu. Akwai gabaɗayan monolith, ko da biyu, da tarin APIs da aka sadaukar don bayarwa. Sun san abubuwa da yawa game da bayarwa.

Waɗannan suna da kama da yankuna iri ɗaya, amma Tsarin oda a cikin BOB da Tsarin jigilar kayayyaki suna da matsayi daban-daban. Misali, wasu sabis na isar da sako ba sa aika matsakaicin matsayi, amma na ƙarshe kawai: “an isar” ko “ɓatattu”. Wasu, akasin haka, suna ba da rahoto dalla-dalla game da motsin kaya. Kowane mutum yana da nasa ƙa'idodin tabbatarwa: ga wasu, imel ɗin yana aiki, wanda ke nufin za a sarrafa shi; wasu kuma ba su da inganci, amma za a ci gaba da aiwatar da odar saboda akwai lambar wayar da za a iya tuntuɓar su, sai wani ya ce ba za a yi irin wannan odar ba kwata-kwata.

Ruwan bayanai

A game da Kafka, tambaya game da tsara tsarin tafiyar da bayanai ta taso. Wannan aikin ya ƙunshi zabar dabarun da ya danganci abubuwa da yawa; bari mu bi su duka.

A daya batu ko a cikin daban-daban?

Muna da takamaiman taron. A cikin BOB mun rubuta cewa ana buƙatar isar da irin wannan odar, kuma muna nuna: lambar tsari, abun da ke ciki, wasu SKUs da lambobin bar, da sauransu. Lokacin da kayan ya isa wurin ajiyar kaya, isar da sako zai sami damar karɓar matsayi, tambura da duk abin da ake buƙata. Amma muna so mu sami sabuntawa akan wannan bayanan a cikin BOB. Muna da tsarin juyawa na karɓar bayanai daga isarwa. Shin wannan taron iri ɗaya ne? Ko kuwa wannan musayar ce ta daban wacce ta cancanci batun nata?

Mafi mahimmanci, za su kasance masu kama da juna, kuma jarabawar yin magana ɗaya ba ta da tushe, saboda wani batu na daban yana nufin masu amfani daban-daban, saiti daban-daban, tsararraki daban-daban na duk wannan. Amma ba gaskiya ba.

Sabon filin ko sabon taron?

Amma idan kuna amfani da abubuwan da suka faru iri ɗaya, to wata matsala ta taso. Misali, ba duk tsarin isar da sako ba ne ke iya samar da irin DTO da BOB zai iya samarwa. Mun aika musu da id, amma ba su ajiye shi ba saboda ba sa buƙatar shi, kuma daga mahangar fara aikin bas-bas, ana buƙatar wannan filin.

Idan muka gabatar da ka'ida don taron bas cewa ana buƙatar wannan filin, to an tilasta mana saita ƙarin ƙa'idodin tabbatarwa a cikin BOB ko a cikin mai sarrafa taron farawa. Tabbatarwa ya fara yadawa cikin sabis - wannan bai dace sosai ba.

Wata matsala ita ce jarabawar haɓaka haɓakawa. An gaya mana cewa wani abu yana buƙatar ƙarawa a cikin taron, kuma watakila, idan muka yi la'akari da shi, ya kamata ya zama wani taron daban. Amma a cikin makircinmu, wani taron daban wani batu ne daban. Wani batu na daban shine gaba ɗaya tsarin da na kwatanta a sama. Ana jarabtar mai haɓakawa don ƙara wani filin kawai zuwa tsarin JSON kuma ya sake haɓaka shi.

A cikin yanayin dawowa, mun isa taron abubuwan da suka faru a cikin rabin shekara. Muna da abu guda ɗaya da ake kira sabuntawar dawowa, wanda ke da nau'in filin da ke kwatanta ainihin abin da wannan sabuntawa yake. Saboda wannan, muna da maɓallai masu “mamamaki” tare da masu inganci waɗanda suka gaya mana yadda za mu inganta wannan taron da irin wannan.

Sigar taron

Don tabbatar da saƙonni a cikin Kafka kuna iya amfani da su Avro, amma ya zama dole a nan da nan a kwanta a kai a yi amfani da Confluent. A cikin yanayinmu, dole ne mu yi taka tsantsan tare da versioning. Ba koyaushe zai yiwu a sake karanta saƙon daga log ɗin kwafi ba saboda ƙirar tana da “hagu”. Ainihin, yana fitowa don gina nau'ikan don samfurin ya dace da baya: alal misali, sanya filin zaɓi na ɗan lokaci. Idan bambance-bambancen sun yi ƙarfi sosai, za mu fara rubutawa a cikin sabon jigo, da canja wurin abokan ciniki idan sun gama karanta tsohon.

Garantin karanta oda na partitions

Abubuwan da ke cikin Kafka sun kasu kashi-kashi. Wannan ba shi da mahimmanci yayin da muke tsara ƙungiyoyi da musayar, amma yana da mahimmanci yayin yanke shawarar yadda ake cinyewa da auna shi.

A cikin yanayin al'ada, kuna rubuta jigo ɗaya a cikin Kafka. Ta hanyar tsoho, ana amfani da bangare ɗaya, kuma duk saƙonnin da ke cikin wannan batu suna zuwa gare shi. Kuma saboda haka mabukaci yana karanta waɗannan saƙonnin a jere. Bari mu ce yanzu muna buƙatar fadada tsarin ta yadda masu amfani guda biyu za su karanta saƙonnin. Idan, alal misali, kuna aika SMS, zaku iya gaya wa Kafka don yin ƙarin sashi, kuma Kafka zai fara raba saƙonni zuwa kashi biyu - rabi anan, rabi anan.

Ta yaya Kafka ke raba su? Kowane saƙo yana da jiki (wanda muke adana JSON) da maɓalli. Kuna iya haɗa aikin hash zuwa wannan maɓalli, wanda zai ƙayyade wane bangare ne sakon zai shiga.

A cikin yanayinmu tare da mayar da kuɗi, wannan yana da mahimmanci, idan muka ɗauki kashi biyu, to akwai damar cewa mabukaci mai layi daya zai aiwatar da taron na biyu kafin na farko kuma za a sami matsala. Aikin hash yana tabbatar da cewa saƙon da ke da maɓalli ɗaya ya ƙare a bangare ɗaya.

Abubuwan da suka faru vs umarni

Wannan wata matsala ce da muka fuskanta. Lamarin wani lamari ne: muna cewa wani abu ya faru a wani wuri (wani abu_ya faru), misali, an soke abu ko an dawo da kuɗi. Idan wani ya saurari waɗannan abubuwan da suka faru, to bisa ga "an soke abu," za a ƙirƙiri mahaɗin maido, kuma "dawo ya faru" za a rubuta wani wuri a cikin saitin.

Amma yawanci, lokacin da kuke tsara abubuwan da suka faru, ba kwa son rubuta su a banza - kun dogara da gaskiyar cewa wani zai karanta su. Akwai babban jaraba don rubuta ba wani abu ya faru (abu_canceled, mayar da kuɗi), amma wani abu_ yakamata a yi. Misali, abu yana shirye don mayarwa.

A gefe guda, yana nuna yadda za a yi amfani da taron. A gefe guda, yana ƙara ƙasa da sunan taron al'ada. Bayan haka, bashi da nisa daga nan zuwa umarnin do_something. Amma ba ku da tabbacin cewa wani ya karanta wannan taron; idan kuma ka karanta, to ka karanta cikin nasara; kuma idan kun karanta shi cikin nasara, to kun yi wani abu, kuma wani abu ya ci nasara. Lokacin da wani al'amari ya zama yi_something, martani ya zama dole, kuma wannan matsala ce.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

A cikin musayar asynchronous a cikin RabbitMQ, lokacin da kuka karanta saƙon, je zuwa http, kuna da amsa - aƙalla an karɓi saƙon. Lokacin da ka rubuta wa Kafka, akwai saƙon da ka rubuta wa Kafka, amma ba ka san komai game da yadda aka sarrafa shi ba.

Don haka, a cikin yanayinmu, dole ne mu gabatar da wani taron amsawa kuma mu kafa sa ido ta yadda idan an aika da yawa abubuwan da suka faru, bayan irin wannan kuma irin wannan lokacin ya kamata adadin amsa ya zo. Idan hakan bai faru ba, to da alama wani abu ya ɓace. Misali, idan muka aika taron "item_ready_to_refund", muna sa ran za a mayar da kuɗaɗen, za a mayar da kuɗin ga abokin ciniki, kuma za a aiko mana da taron "kuɗin da aka mayar". Amma wannan bai tabbata ba, don haka ana buƙatar sa ido.

Nuoms

Akwai matsala a bayyane: idan kun karanta daga wani batu a jere, kuma kuna da saƙo mara kyau, mabukaci zai faɗi, kuma ba za ku ci gaba ba. Kuna bukata dakatar da duk masu amfani, ƙara kashewa don ci gaba da karatu.

Mun san game da shi, mun lissafta shi, amma duk da haka ya faru. Kuma wannan ya faru ne saboda taron yana da inganci daga mahangar abubuwan da suka faru-bas, taron ya kasance mai inganci daga mahangar mai tabbatar da aikace-aikacen, amma bai inganta ba daga mahangar PostgreSQL, saboda a cikin tsarinmu ɗaya. MySQL tare da UNSIGNED INT, kuma a cikin sabon tsarin tsarin yana da PostgreSQL tare da INT kawai. Girmansa ya ɗan ƙarami, kuma Id ɗin bai dace ba. Symfony ta mutu tare da banda. Mu, ba shakka, mun sami keɓanta ne saboda mun dogara da shi, kuma za mu yi wannan aikin, amma kafin nan muna son ƙara matakan matsalar, tunda an yi nasarar sarrafa saƙon. Masu lissafin wannan aikin suma suna cikin ma'ajiyar bayanai, kuma Symfony ta riga ta rufe sadarwa tare da ma'ajiyar bayanai, kuma na biyun ya kashe dukkan tsarin ba tare da samun damar yin diyya ba.

Sabis ɗin ya kwanta na ɗan lokaci - sa'a, tare da Kafka wannan ba mummunan ba ne, saboda saƙonnin sun kasance. Lokacin da aka dawo da aikin, zaku iya gama karanta su. Yana da dadi.

Kafka yana da ikon saita saɓani na sabani ta hanyar kayan aiki. Amma don yin wannan, kana buƙatar dakatar da duk masu amfani - a cikin yanayinmu, shirya wani saki daban wanda ba za a sami masu amfani ba, redeployments. Sa'an nan a cikin Kafka za ka iya matsar da diyya ta hanyar kayan aiki, kuma sakon zai shiga.

Wani nuance - replication log vs rdkafka.so - yana da alaƙa da ƙayyadaddun aikin mu. Muna amfani da PHP, kuma a cikin PHP, a matsayin doka, duk ɗakunan karatu suna sadarwa da Kafka ta wurin ajiyar rdkafka.so, sannan akwai wani nau'i na wrapper. Wataƙila waɗannan matsalolin namu ne, amma ya zamana cewa sake karanta wani yanki na abin da muka riga muka karanta ba shi da sauƙi. Gabaɗaya, an sami matsalolin software.

Komawa ga ƙayyadaddun aiki tare da ɓangarori, an rubuta shi daidai a cikin takaddun mabukaci >> yanki yanki. Amma na sami labarin wannan a baya fiye da yadda nake so. Idan kuna son sikelin kuma ku sami masu amfani biyu, kuna buƙatar aƙalla ɓangarori biyu. Wato da ace kana da bangare guda wanda saqonni dubu 20 suka taru a cikinsa, ka yi sabo, ba za a yi daidai ba nan da nan. Don haka, don samun masu amfani guda biyu masu daidaitawa, kuna buƙatar mu'amala da ɓangarori.

Kulawa

Ina ganin yadda muke sa ido a kai zai fi bayyana irin matsalolin da ake samu a tsarin da ake da su.

Misali, muna ƙididdige samfuran samfuran nawa a cikin bayanan kwanan nan sun canza matsayinsu, kuma, saboda haka, yakamata abubuwan da suka faru sun faru dangane da waɗannan canje-canje, kuma mun aika wannan lambar zuwa tsarin sa ido. Sannan daga Kafka mun sami lamba na biyu, nawa ne ainihin abubuwan da aka rubuta. Babu shakka, bambancin waɗannan lambobi biyu yakamata koyaushe ya zama sifili.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Bugu da ƙari, kuna buƙatar saka idanu kan yadda mai samarwa ke aiki, ko abubuwan da suka faru-bas sun karɓi saƙonni, da yadda mabukaci ke yi. Misali, a cikin sigogin da ke ƙasa, Kayan aikin Refund yana aiki da kyau, amma BOB a fili yana da wasu matsaloli (kololuwa shuɗi).

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Na riga na ambata rashin jin daɗi-ƙungiyar mabukaci. Kusan magana, wannan shine adadin saƙonnin da ba a karanta ba. Gabaɗaya, masu amfani da mu suna aiki da sauri, don haka lag yawanci 0 ne, amma wani lokacin ana iya samun kololuwar ɗan gajeren lokaci. Kafka na iya yin wannan daga cikin akwatin, amma kuna buƙatar saita wani tazara.

Akwai aiki Burrowwanda zai baka karin bayani kan Kafka. Yana kawai amfani da API ɗin mabukaci-group don ba da matsayin yadda wannan ƙungiyar ke aiki. Bugu da ƙari, OK da kasa, akwai gargadi, kuma za ku iya gano cewa masu amfani da ku ba za su iya jimre wa taki na samarwa ba - ba su da lokaci don karanta abin da aka rubuta. Tsarin yana da wayo kuma mai sauƙin amfani.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Wannan shine yadda martanin API yayi kama. Anan ga rukunin bob-live-fifa, partition refund.update.v1, matsayi Ok, lag 0 - na ƙarshe na ƙarshe kamar haka.

Ƙwarewa wajen haɓaka sabis ɗin Kayan aikin Refunda tare da API asynchronous akan Kafka

Kulawa updated_at SLA (manne) Na riga na ambata. Misali, samfurin ya canza zuwa matsayin da yake shirye don dawowa. Mun shigar da Cron, wanda ya ce idan a cikin mintuna 5 wannan abu bai tafi don dawo da kuɗi ba (muna dawo da kuɗi ta hanyar tsarin biyan kuɗi da sauri), to tabbas wani abu ya faru ba daidai ba, kuma wannan tabbas lamari ne na tallafi. Don haka, muna ɗaukar Cron kawai, wanda ya karanta irin waɗannan abubuwan, kuma idan sun fi 0, to yana aika faɗakarwa.

Don taƙaitawa, amfani da abubuwan da suka faru ya dace lokacin:

  • ana buƙatar bayanai ta tsarin da yawa;
  • sakamakon sarrafawa ba shi da mahimmanci;
  • akwai 'yan abubuwan da suka faru ko ƙananan al'amura.

Zai yi kama da cewa labarin yana da takamaiman batu - asynchronous API akan Kafka, amma dangane da shi Ina so in ba da shawarar abubuwa da yawa a lokaci ɗaya.
Na farko, na gaba HighLoad++ muna bukatar mu jira har zuwa Nuwamba, a watan Afrilu za a yi wani St. Petersburg version, kuma a watan Yuni za mu yi magana game da babban lodi a Novosibirsk.
Na biyu, mawallafin rahoton, Sergei Zaika, memba ne na Kwamitin Shirye-shiryen na sabon taronmu kan kula da ilimi. KnowledgeConf. Taron na kwana daya, zai gudana ne a ranar 26 ga Afrilu, amma shirinsa yana da zafi sosai.
Kuma zai kasance a watan Mayu PHP Rasha и RIT++ (tare da DevOpsConf an haɗa) - Hakanan zaka iya ba da shawarar batun ku a can, kuyi magana game da gogewar ku kuma ku koka game da cushewar ku.

source: www.habr.com

Add a comment