Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Yechipiri kufungidzira

Chiziviso

Shamwari, pakati pezhizha ndinoronga kuburitsa imwe nhevedzano yezvinyorwa nezve dhizaini yemamitsetse masisitimu: "The VTrade Experiment" - kuyedza kunyora hurongwa hwekutengesa masisitimu. Iwo akateedzana anoongorora dzidziso uye tsika yekuvaka shanduko, auction uye chitoro. Pakupera kwechinyorwa, ndinokukoka kuti uvhotere misoro yaunonyanya kufarira.

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Yechipiri kufungidzira

Ichi ndicho chinyorwa chekupedzisira munhevedzano yezvakagoverwa reactive application muErlang/Elixir. IN chinyorwa chekutanga unogona kuwana theoretical hwaro hwe reactive architecture. Chinyorwa chechipiri inoratidza maitiro ekutanga uye nzira dzekugadzira masisitimu akadaro.

Nhasi tichasimudza nyaya dzekuvandudzwa kweiyo code base uye mapurojekiti zvakazara.

Sangano remabasa

Muhupenyu chaihwo, paunenge uchigadzira sevhisi, iwe kazhinji unofanirwa kusanganisa akati wandei ekudyidzana mapatani mune imwechete controller. Semuenzaniso, sevhisi yevashandisi, iyo inogadzirisa dambudziko rekugadzirisa mapurojekiti evashandisi veprojekiti, inofanirwa kupindura kune req-resp zvikumbiro uye kushuma zvigadziriso zveprofile kuburikidza ne-pub-sub. Mhosva iyi iri nyore: kuseri kwemeseji kune mutongi mumwe chete anoshandisa iyo sevhisi logic uye anoburitsa zvigadziriso.

Mamiriro ezvinhu anowedzera kuoma kana tichida kuita sevhisi inoshivirira inoparadzirwa. Ngatimbofungidzira kuti zvinodikanwa zvevashandisi zvachinja:

  1. ikozvino sevhisi inofanirwa kugadzirisa zvikumbiro pa5 cluster node,
  2. kukwanisa kuita mabasa ekugadzirisa kumashure,
  3. uye zvakare kukwanisa kubata zvine simba kunyoreswa zvinyorwa zvekugadziridzwa kweprofile.

Comment: Isu hatitarise nyaya yekuenderana kuchengetedza uye kudzokorora data. Ngatifungei kuti nyaya idzi dzakagadziriswa kare uye sisitimu yatove neyakavimbika uye ine scalable yekuchengetedza layer, uye vanobata vane nzira dzekudyidzana nayo.

Tsanangudzo yepamutemo yevashandisi sevhisi yakave yakaoma. Kubva pakuona kwemugadziri, shanduko ishoma nekuda kwekushandiswa kwemeseji. Kuti tigutse chinodikanwa chekutanga, isu tinofanirwa kugadzirisa kuenzanisa pane req-resp exchange point.

Chinodiwa chekugadzirisa mabasa ekumashure chinowanzoitika. Muvashandisi, izvi zvinogona kunge zviri kutarisa magwaro emushandisi, kugadzirisa yakatorwa multimedia, kana kuwiriranisa data nesocial media. networks. Aya mabasa anofanirwa kugovaniswa neimwe nzira mukati me cluster uye kufambira mberi kwekuitwa kunotariswa. Naizvozvo, isu tine sarudzo mbiri dzemhinduro: ingave shandisa iyo basa rekugovera template kubva kuchinyorwa chakapfuura, kana, kana isingaenderane, nyora yakajairwa basa kuronga iyo inozobata dziva rema processor nenzira yatinoda.

Point 3 inoda iyo pub-sub template yekuwedzera. Uye kuti uite, mushure mekugadzira pub-sub exchange poindi, isu tinofanirwa kuwedzera mutongi weiyi poindi mukati mesevhisi yedu. Nekudaro, zvinoita sekunge isu tiri kufambisa iyo logic yekugadzirisa kunyoreswa uye kusanyoreswa kubva kune messaging layer kupinda mukuita kwevashandisi.

Nekuda kweizvozvo, kuparara kwedambudziko kwakaratidza kuti kuti tisangane nezvinodiwa, isu tinofanirwa kutangisa 5 zviitiko zvesevhisi pane dzakasiyana node uye kugadzira chimwe chinhu - pub-sub controller, inotarisira kunyoreswa.
Kuti umhanye vabati ve5, haufanire kushandura kodhi yebasa. Chinhu chimwe chete chekuwedzera ndechekumisa mitemo yekuenzanisa panzvimbo yekutsinhana, iyo yatichataura nezvayo zvishoma gare gare.
Iko kune zvakare kuwedzera kuoma: iyo pub-sub controller uye tsika yebasa scheduler inofanirwa kushanda mukopi imwe chete. Zvekare, sevhisi yekutumira mameseji, seyakakosha, inofanirwa kupa nzira yekusarudza mutungamiri.

Kusarudzwa kwemutungamiri

Mune masisitimu akagoverwa, sarudzo yemutungamiri inzira yekugadza nzira imwe chete ine chekuita nekuronga kugoverwa kufambiswa kwemumwe mutoro.

Mune masisitimu asingatarisike kune centralization, pasi rose uye kubvumirana-based algorithms, senge paxos kana raft, anoshandiswa.
Sezvo kutumira mameseji kuri bhuroka uye chinhu chepakati, inoziva nezvese vatariri vebasa - vatungamiriri vevamiriri. Kutumira meseji kunogona kugadza mutungamiri pasina kuvhota.

Mushure mekutanga uye nekubatanidza kunzvimbo yekutsinhana, masevhisi ese anogamuchira sisitimu meseji #'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}. Kana LeaderPid zvinoenderana ne pid maitiro azvino, anogadzwa semutungamiri, uye rondedzero Servers inosanganisira ese nodes uye paramita dzawo.
Parizvino imwe nyowani inoonekwa uye node inoshanda yesumbu inobviswa, vese vatariri vebasa vanogamuchira #'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} и #'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts} maererano.

Nenzira iyi, zvikamu zvese zvinoziva shanduko dzese, uye sumbu rinovimbiswa kuve nemutungamiri mumwechete chero nguva.

Varevereri

Kuti uite maitiro akaoma akagoverwa ekugadzirisa, pamwe nezvinetso zvekugadzirisa chivako chiripo, zviri nyore kushandisa vamiririri.
Kuti urege kushandura kodhi yebasa uye kugadzirisa, semuenzaniso, matambudziko ekuwedzera kugadzirisa, kutenderera kana kutema mameseji, unogona kugonesa mubati weproxy pamberi pesevhisi, iyo ichaita ese ekuwedzera basa.

Muenzaniso wekare we pub-sub optimization iapplication yakagovaniswa ine bhizinesi musimboti inogadzira zviitiko zvekuvandudza, sekuchinja kwemitengo pamusika, uye yekuwana layer - N maseva anopa websocket API yevashandisi vewebhu.
Kana ukasarudza musoro-mberi, saka sevhisi yevatengi inoita seizvi:

  • mutengi anotanga hukama nepuratifomu. Padivi pesevha inomisa traffic, maitiro anotangwa kusevhisi iyi kubatana.
  • Muchirevo chemaitiro ebasa, mvumo uye kunyorera kune zvigadziriso zvinoitika. Maitiro acho anodana nzira yekunyorera yemisoro.
  • Kamwe chiitiko chikagadzirwa mu kernel, chinounzwa kumatanho ekushandira zvinongedzo.

Ngatimbofungidzira kuti isu tine 50000 vanyoreri kune "nhau" musoro. Vanyoreri vanogoverwa zvakaenzana pamaseva mashanu. Nekuda kweizvozvo, imwe neimwe yekuvandudza, ichisvika panzvimbo yekutsinhana, ichadzokororwa ka5 nguva: 50000 nguva pane yega sevha, zvichienderana nehuwandu hwevanyoreri pairi. Kwete chirongwa chinoshanda, handiti?
Kuti tigadzirise mamiriro ezvinhu, ngatitangei proxy ine zita rakafanana nerekuchinjana. The global name registrar anofanira kukwanisa kudzosa nzira yepedyo nezita, izvi zvakakosha.

Ngatitangei iyi proxy pane yekuwana layer maseva, uye maitiro edu ese anoshandira websocket api anozonyorera kwairi, uye kwete kune yekutanga pub-sub exchange point mukernel. Proxy inonyoresa kumusimboti chete mune yakasarudzika kunyoreswa uye inodzokorora iyo inouya meseji kune vese vanyoreri.
Nekuda kweizvozvo, mameseji mashanu achatumirwa pakati pe kernel uye maseva ekuwana, panzvimbo ye5.

Routing uye kuenzanisa

Req-Resp

Mukuita kwemameseji kwazvino, kune 7 nzira dzekugovera dzekukumbira:

  • default. Chikumbiro chinotumirwa kune vese vatongi.
  • round-robin. Zvikumbiro zvinoverengerwa uye zvakagoverwa cyclically pakati pevatongi.
  • consensus. Vatongi vanoshandira sevhisi vakakamurwa kuita vatungamiriri nevaranda. Zvikumbiro zvinotumirwa kumutungamiri chete.
  • consensus & round-robin. Boka rine mutungamiri, asi zvikumbiro zvinogoverwa pakati penhengo dzese.
  • sticky. Iyo hash basa inoverengerwa uye inopihwa kune chaiyo inobata. Zvikumbiro zvinozotevera zvine siginicha inoenda kumubato mumwe chete.
  • sticky-fun. Paunenge uchitanga nzvimbo yekutsinhana, iyo hashi yekuverenga basa re sticky kuenzanisa.
  • fun. Zvakafanana nekunamira-kunakidzwa, iwe chete ndiwe unogona kuwedzera kutungamira, kuramba kana kufanogadzirisa.

Nzira yekugovera inogadziriswa kana nzvimbo yekutsinhanisa yatangwa.

Pamusoro pekuenzanisa, kutumira mameseji kunokubvumira kuti utege masangano. Ngatitarisei mhando dzema tag musystem:

  • Connection tag. Inokutendera kuti unzwisise kuti zviitiko zvakauya kuburikidza nei. Inoshandiswa kana controller process yakabatana kune imwechete yekutsinhana nzvimbo, asi nemakiyi akasiyana ekufambisa.
  • Service tag. Inokutendera kuti ubatanidze zvibatiso kuita mapoka sevhisi imwe chete uye kuwedzera nzira uye kugona kuenzanisa. Kune iyo req-resp pateni, routing ine mutsara. Isu tinotumira chikumbiro kunzvimbo yekutsinhana, zvino inochipfuudza kushumiro. Asi kana tichida kupatsanura vanobata mumapoka ane musoro, ipapo kupatsanura kunoitwa uchishandisa ma tag. Paunenge uchitsanangura tag, chikumbiro chinotumirwa kune rimwe boka revatongi.
  • Kumbira tag. Inokubvumira kusiyanisa pakati pemhinduro. Sezvo sisitimu yedu iri asynchronous, kugadzirisa mhinduro dzesevhisi tinoda kukwanisa kutsanangura ChikumbiroTag pakutumira chikumbiro. Kubva mairi tichakwanisa kunzwisisa mhinduro kune chikumbiro chakauya kwatiri.

Pub-sub

Kune pub-sub zvese zviri nyore zvishoma. Tine nzvimbo yekuchinjana iyo mameseji anoburitswa. Nzvimbo yekutsinhana inogovera mameseji pakati pevanyoreri vakanyoresa kune makiyi ekufambisa avanoda (tinogona kutaura kuti izvi zvakafanana nemisoro).

Scalability uye kukanganisa kushivirira

Iyo scalability yehurongwa hwakazara zvinoenderana nechiyero che scalability yezvikamu uye zvikamu zvehurongwa:

  • Masevhisi anoyerwa nekuwedzera mamwe ma node kune cluster nevabati vesevhisi iyi. Panguva yekushanda kwekuedza, unogona kusarudza iyo yakakwana yekuenzanisa mutemo.
  • Sevhisi yekutumira mameseji pachayo mukati meboka rakaparadzana rinowanzo kuyerwa kungave nekufambisa zvakanyanya akaremerwa nzvimbo dzekuchinjana kuti dziparadzanise node dzesumbu, kana nekuwedzera maproxy maitiro kune kunyanya akaremerwa nzvimbo dzesumbu.
  • Iyo scalability yehurongwa hwese sehunhu hunoenderana nekuchinjika kwezvivakwa uye kugona kusanganisa masumbu ega ega kuita chinhu chakafanana chine musoro.

Kubudirira kweprojekti kunowanzoenderana nekureruka uye nekukurumidza kwekuyera. Kutumira meseji mune yayo yazvino vhezheni inokura pamwe nekushandisa. Kunyangwe tikashaya boka remichina makumi mashanu-50, tinogona kutendeukira kumubatanidzwa. Nehurombo, musoro wemubatanidzwa uri pamusoro pechikamu chechinyorwa ichi.

Reservation

Kana tichiongorora kuyera kuyera, isu takatokurukura nezve redundancy yevatongi vebasa. Nekudaro, kutumira meseji kunofanirwawo kuchengetwa. Muchiitiko chenode kana kuparara kwemuchina, meseji inofanirwa kupora otomatiki, uye munguva pfupi inobvira.

Mumapurojekiti angu ini ndinoshandisa dzimwe node dzinotora mutoro kana ukadonha. Erlang ine yakajairwa yakagovaniswa modhi yekushandisa kune OTP maapplication. Distributed mode inoita kudzoreredza kana ikatadza nekutangisa iyo yakakundikana application pane imwe yakambotangwa node. Maitiro acho ari pachena; mushure mekutadza, application yacho inongoenda kune iyo failover node. Unogona kuverenga zvakawanda pamusoro pekushanda uku pano.

Kubudirira

Ngatiedzei kuenzanisa kuenzanisa kuita kwerabbitmq uye tsika yedu yekutumira mameseji.
ndawana zvawanikwa zviri pamutemo rabbitmq kuyedza kubva kune openstack timu.

Mundima 6.14.1.2.1.2.2. Gwaro rekutanga rinoratidza mhedzisiro yeRPC CAST:
Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Yechipiri kufungidzira

Isu hatizogadzirise mamwe ekuwedzera kune OS kernel kana erlang VM pamberi. Mamiriro ekuedzwa:

  • erl opts: +A1 +sbtu.
  • Muedzo mukati meimwe erlang node inoitiswa palaptop ine yekare i7 mune mobile version.
  • Cluster bvunzo dzinoitwa pamaseva ane 10G network.
  • Iyo kodhi inomhanya mumidziyo yedocker. Network muNAT modhi.

Test code:

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.

Muenzaniso 1: Muedzo unoitwa palaptop ine yekare i7 mobile version. Muedzo, kutumira mameseji uye sevhisi zvinoitwa pane imwe node mune imwe Docker mudziyo:

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)

Scenario 2: 3 node dzinomhanya pamakina akasiyana pasi pedocker (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)

Muzviitiko zvese, kushandiswa kweCPU hakuna kupfuura 250%

Migumisiro

Ndinovimba kutenderera uku hakuratidzike sekurasa pfungwa uye ruzivo rwangu ruchabatsira chaizvo kune vese vanotsvaga masisitimu akagoverwa uye varapi vari pakutanga kwekuvaka zvivakwa zvakagoverwa zvebhizinesi ravo masisitimu uye vari kutarisa Erlang/Elixir nechido. , asi shuwa zvine basa here...

mufananidzo @chuttersnap

Vashandisi vakanyoresa chete ndivo vanogona kutora chikamu muongororo. Nyorera mu, Munogamuchirwa.

Ndedzipi misoro yandinofanira kufukidza zvakadzama sechikamu cheVTrade Experiment series?

  • Dzidziso: Misika, maodha uye nguva yavo: ZUVA, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC

  • Bhuku remirairo. Dzidziso uye maitiro ekushandisa bhuku rine mapoka

  • Kuona kwekutengesa: Matiki, mabara, zvigadziriso. Nzira yekuchengetedza uye sei kunama

  • Backoffice. Kuronga nekusimudzira. Kutariswa kwevashandi uye kuongorora zviitiko

  • API. Ngationei kuti ndeapi mainterfaces anodiwa uye maitiro ekuashandisa

  • Kuchengetedza ruzivo: PostgreSQL, Timescale, Tarantool mune zvekutengesa masisitimu

  • Reactivity mune zvekutengesa masisitimu

  • Zvimwe. Ndichanyora mumacomments

6 vashandisi vakavhota. 4 vashandisi vakaramba.

Source: www.habr.com

Tenga inovimbika yekutambira kwemasaiti ane DDoS dziviriro, VPS VDS maseva 🔥 Tenga webhusaiti yakavimbika ine dziviriro yeDDoS, maseva eVPS VDS | ProHoster