Pakupedzisira
- 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.
Sezvo mameseji ari asynchronous zvachose, kune mutengi kuchinjana kwakakamurwa kuita zvikamu zviviri:
-
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. -
Kugadzirisa mhinduro
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)
ResponsePayload - server mhinduro.
Kune sevha, maitiro anewo zvikamu zviviri:
- Kutanga nzvimbo yekuchinjana
- 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.
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.
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.
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
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 zvinobudiriramessaging:nack(Tack)
- yakadanwa mumamiriro ese ekukurumidzira. Kana basa rangodzoswa, kutumira meseji kunoriendesa kune mumwe mugadziri.
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
Mifananidzo yakagadzirwa uchishandisa websequencediagrams.com
Source: www.habr.com