Elementi ta' bini ta' applikazzjonijiet imqassma. It-tieni approssimazzjoni

Avviż

Kollegi, f'nofs is-sajf qed nippjana li nirrilaxxa serje oħra ta 'artikoli dwar id-disinn ta' sistemi ta 'kju: "L-Esperiment VTrade" - tentattiv biex tikteb qafas għal sistemi ta' kummerċ. Is-serje se teżamina t-teorija u l-prattika tal-bini ta 'skambju, irkant u maħżen. Fl-aħħar tal-artiklu, nistiednek tivvota għas-suġġetti li jinteressawk l-aktar.

Elementi ta' bini ta' applikazzjonijiet imqassma. It-tieni approssimazzjoni

Dan huwa l-artiklu finali fis-serje dwar applikazzjonijiet reattivi mqassma f'Erlang/Elixir. IN l-ewwel artiklu tista 'ssib il-pedamenti teoretiċi ta' arkitettura reattiva. It-tieni artiklu juri l-mudelli bażiċi u l-mekkaniżmi għall-kostruzzjoni ta 'sistemi bħal dawn.

Illum se nqajmu kwistjonijiet ta 'żvilupp tal-bażi tal-kodiċi u proġetti b'mod ġenerali.

Organizzazzjoni ta' servizzi

Fil-ħajja reali, meta tiżviluppa servizz, spiss ikollok tgħaqqad diversi mudelli ta 'interazzjoni f'kontrollur wieħed. Pereżempju, is-servizz tal-utenti, li jsolvi l-problema tal-ġestjoni tal-profili tal-utenti tal-proġett, għandu jwieġeb għal talbiet ta 'req-resp u jirrapporta aġġornamenti tal-profili permezz ta' pub-sub. Dan il-każ huwa pjuttost sempliċi: wara l-messaġġi hemm kontrollur wieħed li jimplimenta l-loġika tas-servizz u jippubblika aġġornamenti.

Is-sitwazzjoni ssir aktar ikkumplikata meta jkollna bżonn nimplimentaw servizz distribwit tolleranti għall-ħsarat. Ejja nimmaġinaw li r-rekwiżiti għall-utenti nbidlu:

  1. issa s-servizz għandu jipproċessa talbiet fuq 5 cluster nodes,
  2. tkun kapaċi twettaq kompiti ta' pproċessar fl-isfond,
  3. u tkun kapaċi wkoll timmaniġġja b'mod dinamiku listi ta 'sottoskrizzjoni għal aġġornamenti tal-profil.

Nota: Aħna ma nqisux il-kwistjoni tal-ħażna konsistenti u r-replikazzjoni tad-dejta. Ejja nassumu li dawn il-kwistjonijiet ġew solvuti qabel u s-sistema diġà għandha saff ta 'ħażna affidabbli u skalabbli, u l-handlers għandhom mekkaniżmi biex jinteraġixxu magħha.

Id-deskrizzjoni formali tas-servizz għall-utenti saret aktar ikkumplikata. Mil-lat ta' programmatur, il-bidliet huma minimi minħabba l-użu tal-messaġġi. Biex nissodisfaw l-ewwel rekwiżit, għandna bżonn nikkonfiguraw l-ibbilanċjar fil-punt ta 'skambju req-resp.

Ir-rekwiżit li jiġu pproċessati kompiti fl-isfond iseħħ ta' spiss. Fl-utenti, dan jista 'jkun il-verifika tad-dokumenti tal-utent, l-ipproċessar tal-multimedja mniżżla, jew is-sinkronizzazzjoni tad-dejta mal-midja soċjali. netwerks. Dawn il-kompiti jeħtieġ li b'xi mod jitqassmu fi ħdan il-cluster u l-progress tal-eżekuzzjoni jiġi mmonitorjat. Għalhekk, għandna żewġ għażliet ta 'soluzzjoni: jew tuża l-mudell tad-distribuzzjoni tal-kompitu mill-artiklu preċedenti, jew, jekk ma jaqbilx, ikteb skedar tal-kompiti personalizzat li se jamministra l-grupp ta' proċessuri bil-mod li għandna bżonn.

Punt 3 jeħtieġ l-estensjoni tal-mudell pub-sub. U għall-implimentazzjoni, wara li noħolqu punt ta 'skambju pub-sub, irridu wkoll inniedu l-kontrollur ta' dan il-punt fi ħdan is-servizz tagħna. Għalhekk, huwa bħallikieku qed nimxu l-loġika għall-ipproċessar ta 'sottoskrizzjonijiet u unsubscribes mis-saff ta' messaġġi fl-implimentazzjoni tal-utenti.

Bħala riżultat, id-dekompożizzjoni tal-problema wriet li sabiex nilħqu r-rekwiżiti, għandna bżonn inniedu 5 każijiet tas-servizz fuq nodi differenti u noħolqu entità addizzjonali - kontrollur pub-sub, responsabbli għall-abbonament.
Biex tmexxi 5 handlers, m'għandekx bżonn tibdel il-kodiċi tas-servizz. L-unika azzjoni addizzjonali hija t-twaqqif ta 'regoli ta' bilanċ fil-punt ta 'skambju, li se nitkellmu dwarhom ftit aktar tard.
Hemm ukoll kumplessità addizzjonali: il-kontrollur pub-sub u l-iskedar tal-kompiti tad-dwana għandhom jaħdmu f'kopja waħda. Għal darb'oħra, is-servizz tal-messaġġi, bħala wieħed fundamentali, għandu jipprovdi mekkaniżmu għall-għażla ta 'mexxej.

Għażla tal-Mexxej

F'sistemi mqassma, l-elezzjoni tal-mexxej hija l-proċedura għall-ħatra ta' proċess uniku responsabbli għall-iskedar tal-ipproċessar distribwit ta' xi tagħbija.

F'sistemi li mhumiex suxxettibbli għaċ-ċentralizzazzjoni, jintużaw algoritmi universali u bbażati fuq il-kunsens, bħal paxos jew raft.
Peress li l-messaġġi huma sensar u element ċentrali, jaf dwar il-kontrolluri tas-servizz kollha - mexxejja kandidati. Il-messaġġi jistgħu jaħtru mexxej mingħajr vot.

Wara li tibda u tikkonnettja mal-punt tal-iskambju, is-servizzi kollha jirċievu messaġġ tas-sistema #'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}. Jekk LeaderPid jikkoinċidi ma ' pid proċess attwali, huwa maħtur bħala l-mexxej, u l-lista Servers jinkludi n-nodi kollha u l-parametri tagħhom.
Fil-mument jidher wieħed ġdid u node cluster li jaħdem huwa skonnettjat, il-kontrolluri tas-servizz kollha jirċievu #'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} и #'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} rispettivament.

Dan il-mod, il-komponenti kollha huma konxji tal-bidliet kollha, u l-cluster huwa garantit li jkollu mexxej wieħed fi kwalunkwe ħin partikolari.

Intermedjarji

Biex jiġu implimentati proċessi kumplessi ta 'proċessar distribwit, kif ukoll fi problemi ta' ottimizzazzjoni ta 'arkitettura eżistenti, huwa konvenjenti li jintużaw intermedjarji.
Sabiex ma tbiddilx il-kodiċi tas-servizz u ssolvi, pereżempju, problemi ta 'messaġġi addizzjonali ta' pproċessar, rotta jew illoggjar, tista 'tippermetti proxy handler qabel is-servizz, li jwettaq ix-xogħol addizzjonali kollu.

Eżempju klassiku ta 'ottimizzazzjoni pub-sub huwa applikazzjoni mqassma b'qalba tan-negozju li tiġġenera avvenimenti ta' aġġornament, bħal bidliet fil-prezz fis-suq, u saff ta 'aċċess - N servers li jipprovdu websocket API għall-klijenti tal-web.
Jekk tiddeċiedi fuq quddiem, allura s-servizz tal-konsumatur jidher bħal dan:

  • il-klijent jistabbilixxi konnessjonijiet mal-pjattaforma. Fuq in-naħa tas-server li jtemm it-traffiku, jitnieda proċess biex iservi din il-konnessjoni.
  • Fil-kuntest tal-proċess tas-servizz, iseħħu awtorizzazzjoni u abbonament għal aġġornamenti. Il-proċess isejjaħ il-metodu ta 'sottoskrizzjoni għal suġġetti.
  • Ladarba avveniment jiġi ġġenerat fil-qalba, jiġi kkonsenjat lill-proċessi li jservu l-konnessjonijiet.

Ejja nimmaġinaw li għandna 50000 abbonat għas-suġġett "aħbarijiet". L-abbonati huma mqassma b'mod ugwali fuq 5 servers. Bħala riżultat, kull aġġornament, li jasal fil-punt tal-iskambju, se jiġi replikat 50000 darba: 10000 darba fuq kull server, skont in-numru ta 'abbonati fuqu. Mhux skema effettiva ħafna, hux?
Biex ittejjeb is-sitwazzjoni, ejja nintroduċu prokura li għandha l-istess isem bħall-punt tal-iskambju. Ir-reġistratur tal-isem globali għandu jkun jista 'jirritorna l-eqreb proċess bl-isem, dan huwa importanti.

Ejja nniedu dan il-prokura fuq is-servers tas-saff ta 'aċċess, u l-proċessi kollha tagħna li jservu l-websocket api se jissottoskrivu għalih, u mhux għall-punt oriġinali ta' skambju pub-sub fil-kernel. Proxy jissottoskrivi għall-qalba biss fil-każ ta 'abbonament uniku u jirreplika l-messaġġ li jkun dieħel lill-abbonati kollha tiegħu.
Bħala riżultat, se jintbagħtu 5 messaġġi bejn is-servers tal-kernel u l-aċċess, minflok 50000.

Ir-rotot u l-ibbilanċjar

Req-Resp

Fl-implimentazzjoni attwali tal-messaġġi, hemm 7 strateġiji ta' distribuzzjoni tat-talbiet:

  • default. It-talba tintbagħat lill-kontrolluri kollha.
  • round-robin. It-talbiet huma enumerati u mqassma ċiklikament bejn il-kontrolluri.
  • consensus. Il-kontrolluri li jaqdu s-servizz huma maqsuma f'mexxejja u skjavi. It-talbiet jintbagħtu biss lill-mexxej.
  • consensus & round-robin. Il-grupp għandu mexxej, iżda t-talbiet jitqassmu fost il-membri kollha.
  • sticky. Il-funzjoni tal-hash hija kkalkulata u assenjata lil handler speċifiku. Talbiet sussegwenti b'din il-firma jmorru għand l-istess handler.
  • sticky-fun. Meta inizjalizza l-punt ta 'skambju, il-funzjoni tal-kalkolu tal-hash għal sticky ibbilanċjar.
  • fun. Simili għal sticky-fun, inti biss tista 'addizzjonalment tidderieġiha, tirrifjuta jew tipproċessah minn qabel.

L-istrateġija tad-distribuzzjoni hija stabbilita meta l-punt ta 'skambju jiġi inizjalizzat.

Minbarra l-ibbilanċjar, il-messaġġi jippermettilek li ttikketta l-entitajiet. Ejja nħarsu lejn it-tipi ta 'tikketti fis-sistema:

  • Tag tal-konnessjoni. Jippermettilek tifhem minn liema konnessjoni ġew l-avvenimenti. Użat meta proċess ta 'kontrollur jgħaqqad mal-istess punt ta' skambju, iżda b'ċwievet ta 'routing differenti.
  • Tag tas-servizz. Jippermettilek tikkombina l-handlers fi gruppi għal servizz wieħed u tespandi l-kapaċitajiet tar-rotot u l-ibbilanċjar. Għall-mudell req-resp, ir-rotta hija lineari. Nibagħtu talba lill-punt tal-iskambju, imbagħad jgħaddiha lis-servizz. Imma jekk għandna bżonn naqsmu l-handlers fi gruppi loġiċi, allura l-qsim isir bl-użu ta 'tikketti. Meta tispeċifika tikketta, it-talba tintbagħat lil grupp speċifiku ta 'kontrolluri.
  • Itlob it-tikketta. Jippermettilek tiddistingwi bejn it-tweġibiet. Peress li s-sistema tagħna hija asinkronika, biex nipproċessaw it-tweġibiet tas-servizz jeħtieġ li nkunu nistgħu nispeċifikaw RequestTag meta nibagħtu talba. Minnha nkunu nistgħu nifhmu t-tweġiba għal liema talba waslitna.

Pub-sub

Għal pub-sub kollox huwa ftit aktar sempliċi. Għandna punt ta' skambju li fih jiġu ppubblikati l-messaġġi. Il-punt tal-iskambju jqassam messaġġi fost l-abbonati li jkunu abbonaw għar-routing keys li għandhom bżonn (nistgħu ngħidu li dan huwa analogu għas-suġġetti).

Skalabbiltà u tolleranza għall-ħsarat

L-iskalabbiltà tas-sistema kollha kemm hi tiddependi fuq il-grad tal-iskalabbiltà tas-saffi u l-komponenti tas-sistema:

  • Is-servizzi jiġu skalati billi jiżdiedu nodi addizzjonali mal-cluster ma 'handlers għal dan is-servizz. Waqt l-operazzjoni ta 'prova, tista' tagħżel l-aħjar politika ta 'ibbilanċjar.
  • Is-servizz tal-messaġġi nnifsu fi ħdan cluster separat huwa ġeneralment skalat jew billi jiċċaqlaq punti ta 'skambju partikolarment mgħobbija għal nodi ta' cluster separati, jew billi żżid proċessi ta' prokura f'żoni partikolarment mgħobbija tar-raggruppament.
  • L-iskalabbiltà tas-sistema kollha bħala karatteristika tiddependi fuq il-flessibbiltà tal-arkitettura u l-abbiltà li tgħaqqad raggruppamenti individwali f'entità loġika komuni.

Is-suċċess ta 'proġett ħafna drabi jiddependi fuq is-sempliċità u l-veloċità tal-iskala. Il-messaġġi fil-verżjoni attwali tiegħu jikbru flimkien mal-applikazzjoni. Anke jekk neqsin minn raggruppament ta’ 50-60 magna, nistgħu nirrikorru għall-federazzjoni. Sfortunatament, is-suġġett tal-federazzjoni huwa lil hinn mill-ambitu ta 'dan l-artikolu.

Riżerva

Meta analizzaw l-ibbilanċjar tat-tagħbija, diġà ddiskutejna s-sensja tal-kontrolluri tas-servizz. Madankollu, il-messaġġi għandhom ikunu riżervati wkoll. Fil-każ ta 'ħabta ta' node jew magna, il-messaġġi għandhom jirkupraw awtomatikament, u fl-iqsar żmien possibbli.

Fil-proġetti tiegħi nuża nodi addizzjonali li jtellgħu t-tagħbija f'każ ta 'waqgħa. Erlang għandu implimentazzjoni standard ta' mod distribwit għal applikazzjonijiet OTP. Il-mod distribwit iwettaq l-irkupru f'każ ta 'falliment billi jniedi l-applikazzjoni falluta fuq node ieħor imniedi qabel. Il-proċess huwa trasparenti; wara falliment, l-applikazzjoni tiċċaqlaq awtomatikament għan-nodu ta' failover. Tista' taqra aktar dwar din il-funzjonalità hawn.

Produttività

Ejja nippruvaw għall-inqas inqabblu bejn wieħed u ieħor il-prestazzjoni tal-fenekmq u l-messaġġi personalizzati tagħna.
Sibt riżultati uffiċjali ttestjar rabbitmq mit-tim openstack.

Fil-paragrafu 6.14.1.2.1.2.2. Id-dokument oriġinali juri r-riżultat tal-RPC CAST:
Elementi ta' bini ta' applikazzjonijiet imqassma. It-tieni approssimazzjoni

Aħna mhux se nagħmlu xi settings addizzjonali għall-kernel tal-OS jew l-erlang VM bil-quddiem. Kundizzjonijiet għall-ittestjar:

  • erl jagħżel: +A1 +sbtu.
  • It-test fi ħdan node erlang wieħed jitmexxa fuq laptop b'i7 antik fil-verżjoni mobbli.
  • It-testijiet tal-cluster jitwettqu fuq servers b'netwerk 10G.
  • Il-kodiċi jaħdem f'kontenituri docker. Netwerk fil-modalità NAT.

Kodiċi tat-test:

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.

Xenarju 1: It-test jitmexxa fuq laptop b'verżjoni mobbli i7 antika. It-test, il-messaġġi u s-servizz huma esegwiti fuq nodu wieħed f'kontenitur Docker wieħed:

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)

Xenarju 2: 3 nodi li jaħdmu fuq magni differenti taħt 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)

Fil-każijiet kollha, l-użu tas-CPU ma qabiżx il-250%

Riżultati ta '

Nittama li dan iċ-ċiklu ma jidhirx qisu mind dump u l-esperjenza tiegħi tkun ta’ benefiċċju reali kemm għar-riċerkaturi tas-sistemi distribwiti kif ukoll għall-prattikanti li huma fil-bidu nett tal-bini ta’ arkitetturi distribwiti għas-sistemi tan-negozju tagħhom u qed iħarsu lejn Erlang/Elixir b’interess. , imma għandek dubji ta' min...

Фото @chuttersnap

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

Liema suġġetti għandi nkopri f'aktar dettall bħala parti mis-serje VTrade Experiment?

  • Teorija: Swieq, ordnijiet u ż-żmien tagħhom: JUM, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC

  • Ktieb ta' ordnijiet. Teorija u prattika ta 'implimentazzjoni ta' ktieb ma 'raggruppamenti

  • Viżwalizzazzjoni tal-kummerċ: qurdien, bars, riżoluzzjonijiet. Kif taħżen u kif twaħħal

  • Backoffice. Ippjanar u żvilupp. Monitoraġġ tal-impjegati u investigazzjoni tal-inċidenti

  • API. Ejja nsemmu liema interfaces huma meħtieġa u kif nimplimentawhom

  • Ħażna ta 'informazzjoni: PostgreSQL, Timescale, Tarantool fis-sistemi tal-kummerċ

  • Reattività fis-sistemi tal-kummerċ

  • Oħrajn. Nikteb fil-kummenti

Ivvutaw 6 utent. 4 utent astjenew.

Sors: www.habr.com

Żid kumment