Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Pakupedzisira chinyorwa Isu takaongorora hwaro hwe theoretical reactive architecture. Yave nguva yekutaura nezve kuyerera kwedata, nzira dzekushandisa reactive Erlang/Elixir masisitimu uye mameseji mapatani mavari:

  • Chikumbiro-mhinduro
  • Chikumbiro-Chunked Response
  • Mhinduro neChikumbiro
  • Publish-kunyoresa
  • Inverted Publish-subscribe
  • Basa rekugovera

SOA, MSA uye kutumira mameseji

SOA, MSA ndiwo masisitimu ekuvaka anotsanangura iyo mitemo yekuvaka masisitimu, nepo kutumira mameseji kunopa maprimitives ekuita kwavo.

Ini handidi kusimudzira iyi kana iyo sisitimu yekuvaka. Ini ndiri wekushandisa zvakanyanya uye anobatsira maitiro kune chaiyo chirongwa uye bhizinesi. Chero paradigm yatinosarudza, zviri nani kugadzira mabhuroki ehurongwa ane ziso paUnix-nzira: zvikamu zvine hushoma hwekubatanidza, hune mutoro kune ega masangano. API nzira dzinoita zviri nyore zviito nemasangano.

Kutumira meseji, sekureva kunoita zita, meseji broker. Chinangwa chayo chikuru ndechekugamuchira uye kutumira mameseji. Iyo ine basa remainterface ekutumira ruzivo, kuumbwa kweane musoro nzira dzekufambisa ruzivo mukati mehurongwa, nzira uye kuenzanisa, pamwe nekubata kukanganisa padanho rehurongwa.
Iwo mameseji atiri kugadzira haasi kuyedza kukwikwidza kana kutsiva rabbitmq. Zvimiro zvayo zvikuru:

  • Distribution.
    Mapoinzi ekuchinjana anogona kugadzirwa pane ese masumbu node, ari padyo sezvinobvira kune kodhi inoashandisa.
  • Simplicity.
    Tarisa pakudzikisa boilerplate kodhi uye nyore kushandisa.
  • Kuita kuri nani.
    Isu hatisi kuedza kudzokorora kushanda kwerabbitmq, asi simbisa chete dhizaini yekuvaka uye yekufambisa, iyo yatinokwana muOTP zviri nyore sezvinobvira, kuderedza mutengo.
  • Kuchinja-chinja.
    Sevhisi yega yega inogona kusanganisa akawanda ekuchinjana matemplate.
  • Resiliency nekugadzira.
  • Scalability.
    Mameseji anokura pamwe nekushandisa. Sezvo mutoro unowedzera, unogona kufambisa nzvimbo dzekutsinhana kumakina ega ega.

Komenda. Panyaya yekurongeka kwekodhi, meta-mapurojekiti akanyatsokodzera kune yakaoma Erlang/Elixir masisitimu. Yese kodhi yeprojekiti iri mune imwe repository - amburera purojekiti. Panguva imwecheteyo, mamicroservices akasarudzika zvakanyanya uye anoita mashandiro ari nyore ayo ane basa kune rakaparadzana sangano. Neiyi nzira, zviri nyore kuchengetedza API yehurongwa hwese, zviri nyore kuita shanduko, zviri nyore kunyora yuniti uye yekubatanidza bvunzo.

Izvo zvikamu zvehurongwa zvinopindirana zvakananga kana kuburikidza nebroker. Kubva pamaonero ekutumira mameseji, sevhisi yega yega ine zvikamu zvehupenyu zvakati wandei:

  • Sevhisi kutanga.
    Panguva ino, maitiro ekuita sevhisi uye zvinoenderana nawo anogadziriswa uye anotangwa.
  • Kugadzira nzvimbo yekuchinjana.
    Iyo sevhisi inogona kushandisa static yekutsinhana poindi inotsanangurwa mukugadziriswa kwenode, kana kugadzira mapoinzi ekuchinjana zvine simba.
  • Kunyoresa basa.
    Kuti sevhisi ishumire zvikumbiro, inofanirwa kunyoreswa panzvimbo yekutsinhana.
  • Normal kushanda.
    Basa racho rinobudisa basa rinobatsira.
  • Vhara.
    Kune mhando mbiri dzekudzima zvinogoneka: zvakajairika uye emergency. Munguva yekushanda kwakajairika, sevhisi inobviswa kubva panzvimbo yekutsinhana uye inomira. Mumamiriro ezvinhu ekukurumidzira, kutumira mameseji kunoita imwe yezvinyorwa zvefoilover.

Inotaridzika kunge yakaoma, asi iyo kodhi haisi iyo yese inotyisa. Mienzaniso yekodhi ine makomendi ichapihwa mukuongororwa kwematemplate zvishoma gare gare.

Exchanges

Exchange point inzira yekutumira mameseji inoshandisa iyo logic yekudyidzana nezvikamu mukati memeseji template. Mumienzaniso yese iri pazasi, zvikamu zvinodyidzana kuburikidza nenzvimbo dzekutsinhana, musanganiswa unoumba meseji.

Maitiro ekuchinjisa mameseji (MEPs)

Pasi rose, maitiro ekuchinjana anogona kukamurwa kuita maviri-nzira uye nzira imwe. Yokutanga inoreva mhinduro kune meseji inouya, iyo yekupedzisira haidaro. Muenzaniso wekare wenzira mbiri-mutengi-server architecture ndiyo Chikumbiro-mhinduro pateni. Ngatitarisei template uye kugadzirisa kwayo.

Chikumbiro-mhinduro kana RPC

RPC inoshandiswa patinenge tichida kugamuchira mhinduro kubva kune imwe nzira. Iyi nzira inogona kunge ichimhanya panzvimbo imwechete kana iri pane imwe kondinendi. Pazasi pane dhayagiramu yekudyidzana pakati pemutengi neserver kuburikidza nekutumira mameseji.

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Sezvo mameseji ari asynchronous zvachose, kune mutengi kuchinjana kwakakamurwa kuita zvikamu zviviri:

  1. Kutumira chikumbiro

    messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).

    Exchange β€’ zita rakasiyana renzvimbo yekuchinjana
    ResponseMatchingTag β€’ label yemunharaunda yekugadzirisa mhinduro. Semuenzaniso, muchiitiko chekutumira akati wandei zvikumbiro zvakafanana zvevashandisi vakasiyana.
    RequestDefinition - chikumbiro muviri
    HandlerProcess - PID yemubati. Iyi nzira ichawana mhinduro kubva kune server.

  2. Kugadzirisa mhinduro

    handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)

    ResponsePayload - server mhinduro.

Kune sevha, maitiro anewo zvikamu zviviri:

  1. Kutanga nzvimbo yekuchinjana
  2. Kugadziriswa kwezvikumbiro zvakagamuchirwa

Ngatienzanisirei template iyi nekodhi. Ngatitii tinoda kushandisa sevhisi yakapfava inopa imwe nzira chaiyo yenguva.

Server code

Ngatitsanangurei sevhisi API mu api.hrl:

%% =====================================================
%%  entities
%% =====================================================
-record(time, {
  unixtime :: non_neg_integer(),
  datetime :: binary()
}).

-record(time_error, {
  code :: non_neg_integer(),
  error :: term()
}).

%% =====================================================
%%  methods
%% =====================================================
-record(time_req, {
  opts :: term()
}).
-record(time_resp, {
  result :: #time{} | #time_error{}
}).

Ngatitsanangurirei sevhisi controller mukati time_controller.erl

%% Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄. Вставив Π΅Π³ΠΎ Π² шаблон gen_server ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ сСрвис.

%% инициализация gen_server
init(Args) ->
  %% ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π°
  messaging:monitor_exchange(req_resp, ?EXCHANGE, default, self())
  {ok, #{}}.

%% ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° события ΠΏΠΎΡ‚Π΅Ρ€ΠΈ связи с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½Π°. Π­Ρ‚ΠΎ ΠΆΠ΅ событиС ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π° Π΅Ρ‰Π΅ Π½Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»Π°ΡΡŒ.
handle_info(#exchange_die{exchange = ?EXCHANGE}, State) ->
  erlang:send(self(), monitor_exchange),
  {noreply, State};

%% ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° API
handle_info(#time_req{opts = _Opts}, State) ->
  messaging:response_once(Client, #time_resp{
result = #time{ unixtime = time_utils:unixtime(now()), datetime = time_utils:iso8601_fmt(now())}
  });
  {noreply, State};

%% Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ gen_server
terminate(_Reason, _State) ->
  messaging:demonitor_exchange(req_resp, ?EXCHANGE, default, self()),
  ok.

Client code

Kuti utumire chikumbiro kushumiro, unogona kufonera chikumbiro chekutumira mameseji API chero kupi mutengi:

case messaging:request(?EXCHANGE, tag, #time_req{opts = #{}}, self()) of
    ok -> ok;
    _ -> %% repeat or fail logic
end

Muchirongwa chakagoverwa, kugadziridzwa kwezvikamu kunogona kunge kwakasiyana zvakanyanya uye panguva yekukumbira, meseji inogona kunge isati yatanga, kana sevhisi controller haingave yakagadzirira kushanda chikumbiro. Naizvozvo, isu tinofanirwa kutarisa mhinduro yemeseji uye kubata iyo yekutadza kesi.
Mushure mekubudirira kutumira, mutengi anogashira mhinduro kana kukanganisa kubva kubasa.
Ngatibate nyaya dzese mu handle_info:

handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time{unixtime = Utime}}}, State) ->
  ?debugVal(Utime),
  {noreply, State};

handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time_error{code = ErrorCode}}}, State) ->
  ?debugVal({error, ErrorCode}),
  {noreply, State};

Chikumbiro-Chunked Response

Zvakanakisa kudzivirira kutumira mameseji makuru. Kupindura uye kushanda kwakasimba kwehurongwa hwose kunoenderana neizvi. Kana mhinduro kumubvunzo ikatora ndangariro zhinji, zvino kupatsanura kuita zvikamu zvinosungirwa.

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Rega ndikupe mienzaniso miviri yezviitiko zvakadaro:

  • Izvo zvikamu zvinotsinhanisa data rebhinari, senge mafaera. Kupwanya mhinduro kuita zvidimbu zvidiki kunokubatsira kuti ushande nemafaira emhando ipi neipi uye kudzivirira kuwanda kwendangariro.
  • Lists. Semuenzaniso, isu tinofanirwa kusarudza ese marekodhi kubva patafura hombe mune dhatabhesi uye toaendesa kune chimwe chikamu.

Mhinduro idzi ndinodzidaidza kuti locomotive. Chero zvazvingava, 1024 mameseji e1 MB ari nani pane meseji imwechete ye1 GB.

Muchikwata cheErlang, tinowana imwe bhenefiti - kuderedza mutoro panzvimbo yekutsinhana uye network, sezvo mhinduro dzinobva dzatumirwa kune anogamuchira, dzichipfuura nzvimbo yekutsinhana.

Mhinduro neChikumbiro

Uku ndiko kugadziridzwa kusingawanzo kweiyo RPC pateni yekuvaka dialog masisitimu.

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Publish-subscribe (data distribution tree)

Zviitiko-zvinofambiswa masisitimu anoaendesa kune vatengi nekukurumidza kana data ragadzirira. Nekudaro, masisitimu anonyanya kuenderana neiyo push modhi pane yekudhonza kana poll modhi. Ichi chimiro chinokutendera kuti udzivise kutambisa zviwanikwa nekugara uchikumbira uye kumirira data.
Nhamba yacho inoratidza maitiro ekugovera meseji kune vatengi vakanyoreswa kune yakatarwa musoro.

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Mienzaniso yekare yekushandisa patani iyi kugovera kwehurumende: nyika yemutambo mumitambo yemakomputa, data yemusika pakutsinhana, ruzivo runobatsira mune zve data.

Ngatitarisei kodhi yemunyoreri:

init(_Args) ->
  %% подписываСмся Π½Π° ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ, ΠΊΠ»ΡŽΡ‡ = key
  messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
  {ok, #{}}.

handle_info(#exchange_die{exchange = ?SUBSCRIPTION}, State) ->
  %% Ссли Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π° нСдоступна, Ρ‚ΠΎ пытаСмся ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ
  messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
  {noreply, State};

%% ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠ΅ сообщСния
handle_info(#'$msg'{exchange = ?SUBSCRIPTION, message = Msg}, State) ->
  ?debugVal(Msg),
  {noreply, State};

%% ΠΏΡ€ΠΈ остановкС потрСбитСля - ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°
terminate(_Reason, _State) ->
  messaging:unsubscribe(?SUBSCRIPTION, key, tag, self()),
  ok.

Iyo sosi inogona kufonera iyo basa kuti iburitse meseji mune chero nzvimbo iri nyore:

messaging:publish_message(Exchange, Key, Message).

Exchange - zita renzvimbo yekuchinjana,
Key - kiyi yekufambisa
mashoko - payload

Inverted Publish-subscribe

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Nekuwedzera pub-sub, unogona kuwana pateni yakanakira kutema matanda. Iyo seti yezvinyorwa uye vatengi vanogona kunge vakasiyana zvachose. Nhamba yacho inoratidza nyaya ine mutengi mumwe uye akawanda masosi.

Basa rekugovera maitiro

Anenge ese mapurojekiti anosanganisira akamisikidzwa kugadzirisa mabasa, akadai sekugadzira mishumo, kuendesa zviziviso, uye kudzoreredza data kubva kune wechitatu-bato masisitimu. The throughput of the system inoita mabasa aya inogona kuyerwa zviri nyore nekuwedzera ma handlers. Chasara kwatiri kugadzira boka rema processor uye nekugovera mabasa pakati pavo.

Ngatitarisei mamiriro ezvinhu anomuka tichishandisa muenzaniso wevatatu vanobata. Kunyangwe padanho rekugovera basa, mubvunzo wekuenzanirana kwekugovera uye kuwanda kwevanobata unomuka. Round-robin kugovera kuchaita basa rekururamisira, uye kudzivirira mamiriro ekufashukira kwevanobata, isu tichaunza kurambidzwa. prefetch_limit. Mumamiriro enguva pfupi prefetch_limit zvinodzivirira mumwe mubato kubva kugamuchira mabasa ese.

Messaging inogadzirisa mitsetse uye kugadzirisa zvakakosha. Maprocessor anogamuchira mabasa paanosvika. Basa racho rinogona kupedza zvinobudirira kana kukundikana:

  • messaging:ack(Tack) - yakadanwa kana meseji yakagadziriswa zvinobudirira
  • messaging:nack(Tack) - yakadanwa mumamiriro ese ekukurumidzira. Kana basa rangodzoswa, kutumira meseji kunoriendesa kune mumwe mugadziri.

Zvivakwa zvekuvaka zvezvikumbiro zvakagoverwa. Nzira yekutanga

Ngatiti kutadza kwakaoma kwakaitika uchigadzirisa mabasa matatu: processor 1, mushure mekugamuchira basa, yakadonha isina nguva yekuzivisa chero chinhu kunzvimbo yekutsinhana. Muchiitiko ichi, nzvimbo yekutsinhana ichaendesa basa kune mumwe mugadziri mushure mekunge nguva yekupedza ack yapera. Nekuda kwechimwe chikonzero, mugadziri 3 akasiya basa uye akatumira nack; semugumisiro, basa racho rakaendeswa kune mumwe mubatsiri akaripedza.

Pfupiso yekutanga

Isu takafukidza ekutanga zvivharo zveakagoverwa masisitimu uye takawana kunzwisisa kwekutanga kwekushandiswa kwavo muErlang/Elixir.

Nekubatanidza mapatani ekutanga, unogona kuvaka paradigms yakaoma kugadzirisa matambudziko ari kubuda.

Muchikamu chekupedzisira cheiyi nhevedzano, isu tichatarisa kune zvakajairwa nyaya dzekuronga masevhisi, nzira uye kuenzanisa, uye zvakare kutaura nezve iyo inoshanda yedivi re scalability uye kukanganisa kushivirira kwemasystem.

Kupera kwechikamu chechipiri.

mufananidzo Marius Christensen
Mifananidzo yakagadzirwa uchishandisa websequencediagrams.com

Source: www.habr.com

Voeg