Blòk konstriksyon aplikasyon distribiye. Dezyèm apwoksimasyon

Anons

Kòlèg yo, nan mitan ete mwen planifye pou lage yon lòt seri atik sou konsepsyon sistèm keuing: "Eksperyans VTrade la" - yon tantativ pou ekri yon fondasyon pou sistèm komès. Seri a pral egzamine teyori a ak pratik nan bati yon echanj, vann piblik ak magazen. Nan fen atik la, mwen envite w vote pou sijè ki pi enterese w.

Blòk konstriksyon aplikasyon distribiye. Dezyèm apwoksimasyon

Sa a se atik final la nan seri a sou distribiye aplikasyon reyaktif nan Erlang/Elixir. NAN premye atik ou ka jwenn fondasyon yo teyorik nan achitekti reyaktif. Dezyèm atik montre modèl debaz yo ak mekanis pou konstwi sistèm sa yo.

Jodi a nou pral leve pwoblèm nan devlopman nan baz la kòd ak pwojè an jeneral.

Òganizasyon sèvis yo

Nan lavi reyèl, lè w ap devlope yon sèvis, ou souvan oblije konbine plizyè modèl entèraksyon nan yon sèl kontwolè. Pou egzanp, sèvis itilizatè yo, ki rezoud pwoblèm nan jere pwofil itilizatè pwojè a, dwe reponn a demann req-resp epi rapòte mizajou pwofil atravè pub-sub. Ka sa a se byen senp: dèyè messagerie gen yon kontwolè ki aplike lojik sèvis la epi pibliye mizajou.

Sitiyasyon an vin pi konplike lè nou bezwen aplike yon sèvis distribye ki toleran fay. Ann imajine ke kondisyon pou itilizatè yo te chanje:

  1. kounye a sèvis la ta dwe trete demann sou 5 nœuds gwoup,
  2. kapab fè travay pwosesis background,
  3. epi tou li kapab jere dinamik abònman lis pou mizajou pwofil yo.

Remak: Nou pa konsidere pwoblèm nan depo konsistan ak replikasyon done. Ann sipoze ke pwoblèm sa yo te rezoud pi bonè epi sistèm nan deja gen yon kouch depo serye ak évolutive, ak moun kap okipe yo gen mekanis pou kominike avèk li.

Deskripsyon fòmèl sèvis itilizatè yo vin pi konplike. Soti nan pwen de vi yon pwogramè, chanjman yo minim akòz itilizasyon messagerie. Pou satisfè premye kondisyon an, nou bezwen konfigirasyon balanse nan pwen echanj req-resp la.

Egzijans pou trete travay background rive souvan. Nan itilizatè yo, sa a ta ka tcheke dokiman itilizatè yo, trete miltimedya telechaje, oswa senkronize done ak medya sosyal. rezo yo. Travay sa yo dwe yon jan kanmenm distribye nan gwoup la ak pwogrè nan ekzekisyon kontwole. Se poutèt sa, nou gen de opsyon solisyon: swa itilize modèl distribisyon travay ki soti nan atik anvan an, oswa, si li pa apwopriye, ekri yon pwogramasyon travay koutim ki pral jere pisin nan processeurs nan fason nou bezwen an.

Pwen 3 mande ekstansyon modèl pub-sub la. Ak pou aplikasyon, apre yo fin kreye yon pwen echanj pub-sub, nou bezwen anplis lanse kontwolè a nan pwen sa a nan sèvis nou an. Kidonk, se kòmsi nou ap deplase lojik pou trete abònman ak dezabònman nan kouch mesaj la nan aplikasyon itilizatè yo.

Kòm yon rezilta, dekonpozisyon nan pwoblèm nan te montre ke yo nan lòd yo satisfè kondisyon yo, nou bezwen lanse 5 ka nan sèvis la sou nœuds diferan ak kreye yon antite adisyonèl - yon kontwolè PUB-sub, ki responsab pou abònman an.
Pou kouri 5 moun kap okipe, ou pa bezwen chanje kòd sèvis la. Sèl aksyon anplis se mete kanpe règ balanse nan pwen echanj la, ki nou pral pale sou yon ti kras pita.
Genyen tou yon konpleksite adisyonèl: kontwolè pub-sub ak pwogramasyon travay koutim dwe travay nan yon kopi sèl. Yon fwa ankò, sèvis la messagerie, kòm yon sèl fondamantal, dwe bay yon mekanis pou chwazi yon lidè.

Seleksyon lidè

Nan sistèm distribiye, eleksyon lidè se pwosedi pou nonmen yon sèl pwosesis ki responsab pou pwograme pwosesis distribye kèk chaj.

Nan sistèm ki pa gen tandans santralizasyon, yo itilize algoritm inivèsèl ak konsansis, tankou paxos oswa kannòt.
Depi messagerie se yon koutye ak yon eleman santral, li konnen sou tout kontwolè sèvis - lidè kandida. Mesaj ka nonmen yon lidè san yo pa vote.

Apre yo fin kòmanse ak konekte ak pwen echanj la, tout sèvis yo resevwa yon mesaj sistèm #'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}. Si LeaderPid konyenside avèk pid pwosesis aktyèl la, li se nonmen kòm lidè a, ak lis la Servers gen ladan tout nœuds ak paramèt yo.
Nan moman sa a yon nouvo parèt ak yon ne k ap travay gwoup dekonekte, tout kontwolè sèvis resevwa #'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} и #'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} respektivman.

Nan fason sa a, tout eleman yo okouran de tout chanjman, epi gwoup la garanti gen yon sèl lidè nan nenpòt ki lè.

Medyatè

Pou aplike pwosesis konplèks distribiye pwosesis, osi byen ke nan pwoblèm nan optimize yon achitekti ki deja egziste, li se pratik yo sèvi ak entèmedyè.
Yo nan lòd yo pa chanje kòd sèvis la ak rezoud, pou egzanp, pwoblèm nan pwosesis adisyonèl, routage oswa antre mesaj, ou ka pèmèt yon moun k ap okipe prokurasyon anvan sèvis la, ki pral fè tout travay adisyonèl la.

Yon egzanp klasik optimize pub-sub se yon aplikasyon distribiye ak yon nwayo biznis ki jenere evènman aktyalizasyon, tankou chanjman pri nan mache a, ak yon kouch aksè - N serveurs ki bay yon API websocket pou kliyan entènèt.
Si ou deside tèt-sou, Lè sa a, sèvis kliyan sanble sa a:

  • kliyan an etabli koneksyon ak platfòm la. Sou bò a nan sèvè a ki mete fen nan trafik la, yo te lanse yon pwosesis pou sèvis koneksyon sa a.
  • Nan kontèks pwosesis sèvis la, otorizasyon ak abònman nan mizajou rive. Pwosesis la rele metòd abònman pou sijè.
  • Yon fwa yo pwodwi yon evènman nan nwayo a, li delivre nan pwosesis yo sèvis koneksyon yo.

Ann imajine ke nou gen 50000 abonnés nan sijè "nouvèl la". Abonnés yo distribye respire sou 5 sèvè. Kòm yon rezilta, chak aktyalizasyon, ki rive nan pwen echanj la, yo pral repwodui 50000 fwa: 10000 fwa sou chak sèvè, dapre kantite abònen sou li. Pa yon konplo trè efikas, dwa?
Pou amelyore sitiyasyon an, ann prezante yon proxy ki gen menm non ak pwen echanj la. Rejistrè non mondyal la dwe kapab retounen pwosesis ki pi pre a pa non, sa a enpòtan.

Ann lanse prokurasyon sa a sou sèvè kouch aksè yo, ak tout pwosesis nou yo k ap sèvi API websocket la pral abònman ak li, epi yo pa nan pwen echanj orijinal pub-sub nan nwayo a. Proxy abònman nan nwayo a sèlman nan ka a nan yon abònman inik ak replike mesaj la fèk ap rantre nan tout abonnés li yo.
Kòm yon rezilta, yo pral voye 5 mesaj ant nwayo a ak sèvè aksè, olye pou yo 50000.

Routage ak balanse

Req-Resp

Nan aplikasyon mesaj aktyèl la, gen 7 estrateji distribisyon demann:

  • default. Yo voye demann lan bay tout kontwolè.
  • round-robin. Demann yo enimere ak siklik distribye ant kontwolè.
  • consensus. Kontwolè ki sèvi sèvis la divize an lidè ak esklav. Demann yo voye sèlman bay lidè a.
  • consensus & round-robin. Gwoup la gen yon lidè, men demann yo distribye pami tout manm yo.
  • sticky. Fonksyon hash la kalkile ak asiyen nan yon moun kap okipe espesifik. Demann ki vin apre ak siyati sa a ale nan menm moun k ap okipe a.
  • sticky-fun. Lè inisyalize pwen an echanj, fonksyon an kalkil hash pou sticky balanse.
  • fun. Menm jan ak sticky-plezi, sèlman ou ka anplis redireksyon, rejte oswa pre-pwosesis li.

Se estrateji distribisyon an mete lè pwen echanj la inisyalize.

Anplis de balans, messagerie pèmèt ou tag antite. Ann gade kalite tags nan sistèm nan:

  • Tag koneksyon. Pèmèt ou konprann nan ki koneksyon evènman yo te vini. Itilize lè yon pwosesis kontwolè konekte nan menm pwen echanj la, men ak kle routage diferan.
  • Tag sèvis. Pèmèt ou konbine moun kap okipe yo an gwoup pou yon sèvis epi elaji kapasite routage ak balanse. Pou modèl req-resp, routage se lineyè. Nou voye yon demann nan pwen echanj la, Lè sa a, li pase li sou sèvis la. Men, si nou bezwen divize moun kap okipe yo an gwoup ki lojik, Lè sa a, divize an fè lè l sèvi avèk Tags. Lè w ap espesifye yon tag, demann lan pral voye bay yon gwoup espesifik kontwolè.
  • Mande tag. Pèmèt ou fè distenksyon ant repons yo. Piske sistèm nou an asynchrone, pou nou trete repons sèvis nou bezwen pou nou kapab presize yon RequestTag lè nou voye yon demann. Apati li nou pral kapab konprann repons ki demann ki te vin jwenn nou.

Pub-sub

Pou pub-sub tout bagay se yon ti kras pi senp. Nou gen yon pwen echanj kote mesaj yo pibliye. Pwen echanj la distribye mesaj nan mitan abonnés ki te abònman nan kle yo routage yo bezwen (nou ka di ke sa a se analoji ak sijè).

Évolutivité ak tolerans fay

Évolutivité nan sistèm nan kòm yon antye depann sou degre nan évolutivité nan kouch yo ak eleman nan sistèm nan:

  • Sèvis yo ogmante lè yo ajoute nœuds adisyonèl nan gwoup la ak moun kap okipe sèvis sa a. Pandan operasyon jijman, ou ka chwazi politik la balanse optimal.
  • Anjeneral, sèvis mesaje nan yon gwoup separe se echèl swa lè w deplase pwen echanj patikilyèman chaje yo nan nœud gwoup separe, oswa lè w ajoute pwosesis prokurasyon nan zòn patikilyèman chaje nan gwoup la.
  • Évolutivité tout sistèm nan kòm yon karakteristik depann sou fleksibilite nan achitekti a ak kapasite nan konbine gwoup endividyèl yo nan yon antite komen lojik.

Siksè yon pwojè souvan depann de senplisite ak vitès dekale. Mesaj nan vèsyon aktyèl li yo ap grandi ansanm ak aplikasyon an. Menm si nou manke yon grap 50-60 machin, nou ka ale nan federasyon. Malerezman, sijè federasyon an depase limit atik sa a.

Rezèvasyon

Lè nou analize balans chaj, nou deja diskite sou redondance nan kontwolè sèvis yo. Sepandan, mesaj yo dwe rezève tou. Nan evènman an nan yon ne oswa aksidan machin, messagerie ta dwe otomatikman refè, ak nan tan ki pi kout posib.

Nan pwojè mwen yo mwen itilize nœuds adisyonèl ki ranmase chaj la nan ka ta gen yon tonbe. Erlang gen yon aplikasyon mòd distribye estanda pou aplikasyon OTP. Mòd distribiye fè rekiperasyon an ka ta gen echèk pa lanse aplikasyon an echwe sou yon lòt ne te deja lanse. Pwosesis la se transparan; apre yon echèk, aplikasyon an otomatikman deplase nan ne la failover. Ou ka li plis sou fonksyonalite sa a isit la.

Pwodiktivite

Ann eseye omwen apeprè konpare pèfòmans rabbitmq ak mesaj koutim nou an.
mwen jwenn rezilta ofisyèl yo rabbitmq tès soti nan ekip la openstack.

Nan paragraf 6.14.1.2.1.2.2. Dokiman orijinal la montre rezilta RPC CAST la:
Blòk konstriksyon aplikasyon distribiye. Dezyèm apwoksimasyon

Nou pa pral fè okenn lòt paramèt nan nwayo OS oswa erlang VM an davans. Kondisyon pou fè tès la:

  • erl opts: +A1 +sbtu.
  • Tès la nan yon sèl ne erlang kouri sou yon laptop ak yon ansyen i7 nan vèsyon mobil.
  • Tès Cluster yo fèt sou sèvè ki gen yon rezo 10G.
  • Kòd la kouri nan resipyan Docker. Rezo nan mòd NAT.

Kòd tès:

req_resp_bench(_) ->
  W = perftest:comprehensive(10000,
    fun() ->
      messaging:request(?EXCHANGE, default, ping, self()),
      receive
        #'$msg'{message = pong} -> ok
      after 5000 ->
        throw(timeout)
      end
    end
  ),
  true = lists:any(fun(E) -> E >= 30000 end, W),
  ok.

Senaryo 1: Tès la kouri sou yon laptop ak yon ansyen vèsyon mobil i7. Tès la, mesaj ak sèvis yo egzekite sou yon sèl ne nan yon sèl veso Docker:

Sequential 10000 cycles in ~0 seconds (26987 cycles/s)
Sequential 20000 cycles in ~1 seconds (26915 cycles/s)
Sequential 100000 cycles in ~4 seconds (26957 cycles/s)
Parallel 2 100000 cycles in ~2 seconds (44240 cycles/s)
Parallel 4 100000 cycles in ~2 seconds (53459 cycles/s)
Parallel 10 100000 cycles in ~2 seconds (52283 cycles/s)
Parallel 100 100000 cycles in ~3 seconds (49317 cycles/s)

Senaryo 2: 3 nœuds kouri sou diferan machin anba docker (NAT).

Sequential 10000 cycles in ~1 seconds (8684 cycles/s)
Sequential 20000 cycles in ~2 seconds (8424 cycles/s)
Sequential 100000 cycles in ~12 seconds (8655 cycles/s)
Parallel 2 100000 cycles in ~7 seconds (15160 cycles/s)
Parallel 4 100000 cycles in ~5 seconds (19133 cycles/s)
Parallel 10 100000 cycles in ~4 seconds (24399 cycles/s)
Parallel 100 100000 cycles in ~3 seconds (34517 cycles/s)

Nan tout ka yo, itilizasyon CPU pa depase 250%.

Rezilta

Mwen espere ke sik sa a pa sanble yon pil fatra lespri ak eksperyans mwen pral nan yon benefis reyèl pou tou de chèchè nan sistèm distribiye ak pratik ki nan kòmansman an nan bati achitekti distribiye pou sistèm biznis yo epi yo ap gade nan Erlang / Elixir ak enterè. , men gen dout èske li vo ...

Photo tire @chuttersnap

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Ki sijè mwen ta dwe kouvri an plis detay kòm yon pati nan seri VTrade Eksperyans lan?

  • Teyori: Mache yo, lòd ak distribisyon yo: DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC

  • Liv lòd. Teyori ak pratik nan aplikasyon yon liv ak gwoupman

  • Vizyalizasyon komès: tik, ba, rezolisyon. Ki jan yo estoke ak ki jan yo lakòl

  • Dèyè biwo. Planifikasyon ak devlopman. Siveyans anplwaye ak envestigasyon ensidan

  • API. Ann chèche konnen ki entèfas ki nesesè ak kijan pou aplike yo

  • Depo enfòmasyon: PostgreSQL, Timecale, Tarantool nan sistèm komès

  • Reyaktivite nan sistèm komès

  • Lòt. Mwen pral ekri nan kòmantè yo

6 itilizatè yo te vote. 4 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè