Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Ekugcineni isihloko Sihlole izisekelo zetiyori zezakhiwo ezisebenzayo. Isikhathi sokukhuluma ngokugeleza kwedatha, izindlela zokuqalisa amasistimu e-Erlang/Elixir namaphethini emiyalezo kuwo:

  • Isicelo-impendulo
  • Isicelo-Impendulo Ehlanganisiwe
  • Impendulo ngesicelo
  • Shicilela-bhalisa
  • Okuhlanekezelwe Shicilela-bhalisa
  • Ukusabalalisa umsebenzi

I-SOA, i-MSA kanye nemiyalezo

I-SOA, i-MSA yizakhiwo zesistimu ezichaza imithetho yezinhlelo zokwakha, kuyilapho ukuthumela imiyalezo kuhlinzeka ngezinto zokuqala zokusetshenziswa kwazo.

Angifuni ukukhuthaza lokhu noma leya sakhiwo sesistimu. Ngingowokusebenzisa izinqubo eziphumelela kakhulu nezilusizo zephrojekthi ethile kanye nebhizinisi. Kungakhathaliseki ukuthi iyiphi i-paradigm esiyikhethayo, kungcono ukudala amabhulokhi wesistimu ngeso le-Unix-way: izingxenye ezinokuxhumeka okuncane, ezibhekele izinhlangano ngazinye. Izindlela ze-API zenza izenzo ezilula ezingenzeka ngezinhlangano.

Ukuthumela imiyalezo, njengoba negama liphakamisa, umthengisi womlayezo. Inhloso yayo enkulu ukuthola nokuthumela imiyalezo. Inesibopho sezindawo zokusebenzelana zokuthumela ulwazi, ukwakhiwa kwamashaneli anengqondo okudlulisa ulwazi ngaphakathi kwesistimu, umzila nokulinganisa, kanye nokuphatha amaphutha ezingeni lesistimu.
Imiyalezo esiyithuthukisayo ayizami ukuncintisana noma ukufaka esikhundleni sika-rabbitmq. Izici zayo eziyinhloko:

  • Ukusabalalisa.
    Amaphoyinti okushintshana angadalwa kuwo wonke ama-cluster node, eduze kakhulu nekhodi ewasebenzisayo.
  • Ukulula.
    Gxila ekunciphiseni ikhodi ye-boilerplate kanye nokusebenziseka kalula.
  • Ukusebenza okungcono.
    Asizami ukuphinda ukusebenza kwe-rabbitmq, kodwa sigqamisa kuphela isendlalelo sezakhiwo nezokuthutha, esisifaka ku-OTP kalula ngangokunokwenzeka, sinciphisa izindleko.
  • Ukuvumelana nezimo.
    Isevisi ngayinye ingahlanganisa izifanekiso eziningi zokushintshanisa.
  • Ukuqina ngokuklama.
  • I-Scalability.
    Ukuthumela imiyalezo kuyakhula nohlelo lokusebenza. Njengoba umthwalo ukhula, ungahambisa amaphuzu okushintshanisa emishinini ngayinye.

Beka amazwana. Mayelana nokuhlelwa kwekhodi, amaphrojekthi e-meta afaneleka kahle kuzinhlelo eziyinkimbinkimbi ze-Erlang/Elixir. Yonke ikhodi yephrojekthi itholakala endaweni eyodwa - iphrojekthi yesambulela. Ngesikhathi esifanayo, ama-microservices ahlukaniswa kakhulu futhi enza imisebenzi elula enesibopho sebhizinisi elihlukile. Ngale ndlela, kulula ukugcina i-API yesistimu yonke, kulula ukwenza izinguquko, kulula ukubhala ukuhlolwa kweyunithi nokuhlanganiswa.

Izingxenye zesistimu zisebenzisana ngokuqondile noma ngomthengisi. Ngokombono wemiyalezo, isevisi ngayinye inezigaba zempilo ezimbalwa:

  • Ukuqaliswa kwesevisi.
    Kulesi sigaba, inqubo yokwenza isevisi kanye nokuncika kwayo kuyamiswa futhi kwethulwe.
  • Ukudala iphoyinti lokushintshisana.
    Isevisi ingasebenzisa iphoyinti lokushintshana elimile elicaciswe ekucushweni kwenodi, noma idale amaphuzu okushintshana ngamandla.
  • Ukubhaliswa kwesevisi.
    Ukuze isevisi inikeze izicelo, kufanele ibhaliswe endaweni yokushintshisana.
  • Ukusebenza okuvamile.
    Isevisi ikhiqiza umsebenzi owusizo.
  • Vala shaqa.
    Kunezinhlobo ezi-2 zokuvalwa okungenzeka: okuvamile kanye nezimo eziphuthumayo. Ngesikhathi sokusebenza okuvamile, isevisi iyanqanyulwa endaweni yokushintshana bese iyama. Ezimweni eziphuthumayo, umlayezo usebenzisa eyodwa yezikripthi ze-failiver.

Kubukeka kuyinkimbinkimbi, kepha ikhodi akuyona yonke into esabisayo. Izibonelo zekhodi namazwana zizonikezwa ekuhlaziyweni kwezifanekiso ngokuhamba kwesikhathi.

Ukuhwebelana

Iphoyinti lokushintshisana liyinqubo yemiyalezo esebenzisa ingqondo yokusebenzisana nezingxenye ezingaphakathi kwesifanekiso semiyalezo. Kuzo zonke izibonelo ezivezwe ngezansi, izingxenye ziyasebenzisana ngamaphoyinti okushintshana, inhlanganisela yawo eyenza umlayezo.

Amaphethini okushintshana ngemilayezo (MEPs)

Emhlabeni jikelele, amaphethini okushintshana angahlukaniswa abe indlela ezimbili kanye nendlela eyodwa. Owokuqala uchaza impendulo yomlayezo ongenayo, owesibili awusho. Isibonelo sakudala sephethini yezindlela ezimbili ekwakhiweni kweseva yeklayenti iphethini yempendulo yokucela. Ake sibheke isifanekiso nezinguqulo zaso.

Isicelo-impendulo noma i-RPC

I-RPC isetshenziswa uma sidinga ukuthola impendulo evela kwenye inqubo. Le nqubo kungenzeka ukuthi isebenza endaweni eyodwa noma isezwenikazi elihlukile. Ngezansi kunomdwebo wokusebenzelana phakathi kweklayenti neseva ngokuthumela imiyalezo.

Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Njengoba ukuthumela imiyalezo ku-asynchronous ngokuphelele, kuklayenti ukushintshana kuhlukaniswe izigaba ezi-2:

  1. Thumela isicelo

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

    Exchange β€’ igama eliyingqayizivele lephoyinti lokushintshisana
    ResponseMatchingTag β€’ ilebula yendawo yokucubungula impendulo. Isibonelo, endabeni yokuthumela izicelo ezifanayo ezimbalwa zabasebenzisi abahlukene.
    Cela Incazelo - isicelo umzimba
    I-HandlerProcess β€’ I-PID yesibambi. Le nqubo izothola impendulo evela kuseva.

  2. Icubungula impendulo

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

    ImpenduloPayload - impendulo yeseva.

Kuseva, inqubo futhi iqukethe izigaba ezi-2:

  1. Ukuqala iphoyinti lokushintshisana
  2. Ukucutshungulwa kwezicelo ezitholiwe

Ake sifanekise lesi sifanekiso ngekhodi. Ake sithi sidinga ukusebenzisa isevisi elula enikeza indlela eyodwa yesikhathi esiqondile.

Ikhodi yeseva

Ake sichaze i-API yesevisi ku-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{}
}).

Ake sichaze isilawuli sesevisi kokuthi 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.

Ikhodi yeklayenti

Ukuze uthumele isicelo kusevisi, ungashayela i-API yesicelo somlayezo noma yikuphi kuklayenti:

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

Kuhlelo olusabalalisiwe, ukucushwa kwezingxenye kungahluka kakhulu futhi ngesikhathi sesicelo, umlayezo ungase ungakaqali, noma isilawuli sesevisi ngeke silungele ukusevisa isicelo. Ngakho-ke, sidinga ukuhlola impendulo yomlayezo futhi siphathe icala lokwehluleka.
Ngemva kokuthumela ngempumelelo, iklayenti lizothola impendulo noma iphutha kusukela kusevisi.
Masiphathe zombili izimo ku-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};

Isicelo-Impendulo Ehlanganisiwe

Kungcono ukugwema ukuthumela imiyalezo emikhulu. Ukusabela nokusebenza okuzinzile kwalo lonke uhlelo kuncike kulokhu. Uma impendulo yombuzo ithatha inkumbulo eningi, khona-ke ukuyihlukanisa ibe izingxenye kuyimpoqo.

Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Ake ngikunike izibonelo ezimbalwa zalezi zimo:

  • Izingxenye zishintshanisa idatha kanambambili, njengamafayela. Ukuhlukanisa impendulo ibe izingxenye ezincane kukusiza ukuthi usebenze kahle ngamafayela anoma yimuphi usayizi futhi ugweme ukuchichima kwememori.
  • Uhlu. Isibonelo, sidinga ukukhetha wonke amarekhodi etafuleni elikhulu kusizindalwazi bese siwadlulisela kwenye ingxenye.

Lezi zimpendulo ngizibiza ngesitimela. Kunoma ikuphi, imilayezo engu-1024 ka-1 MB ingcono kunomlayezo owodwa ongu-1 GB.

Kuqoqo le-Erlang, sithola inzuzo eyengeziwe - ukunciphisa umthwalo endaweni yokushintshanisa kanye nenethiwekhi, njengoba izimpendulo zithunyelwa ngokushesha kumamukeli, zidlula iphuzu lokushintshanisa.

Impendulo ngesicelo

Lokhu ukuguqulwa okungajwayelekile kwephethini ye-RPC yokwakha amasistimu engxoxo.

Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Shicilela-bhalisa (isihlahla sokusabalalisa idatha)

Amasistimu aqhutshwa yimicimbi aziletha kubathengi ngokushesha nje lapho idatha isilungile. Ngakho-ke, amasistimu athambekele kakhulu kumodeli yokuphusha kunemodeli yokudonsa noma yokuvota. Lesi sici sikuvumela ukuthi ugweme ukumosha izinsiza ngokucela njalo nangokulinda idatha.
Isibalo sibonisa inqubo yokusabalalisa umlayezo kubathengi ababhalisele isihloko esithile.

Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Izibonelo zakudala zokusebenzisa le phethini ukusatshalaliswa kombuso: umhlaba wegeyimu emidlalweni yekhompyutha, idatha yemakethe ngokuhwebelana, ulwazi oluwusizo kokuphakelayo kwedatha.

Ake sibheke ikhodi yababhalisile:

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.

Umthombo ungashayela umsebenzi ukuze ushicilele umlayezo kunoma iyiphi indawo elula:

messaging:publish_message(Exchange, Key, Message).

Exchange - Igama lephuzu lokushintshisana,
Key - ukhiye womzila
Umlayezo - umthwalo wokukhokha

Okuhlanekezelwe Shicilela-bhalisa

Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Ngokwandisa i-pub-sub, ungathola iphethini elungele ukugawulwa kwemithi. Iqoqo lemithombo nabathengi lingahluka ngokuphelele. Isibalo sibonisa icala elinomthengi oyedwa kanye nemithombo eminingi.

Iphethini yokusabalalisa umsebenzi

Cishe yonke iphrojekthi ihilela imisebenzi ehlehlisiwe yokucubungula, njengokukhiqiza imibiko, ukuletha izaziso, nokubuyisa idatha kumasistimu ezinkampani zangaphandle. Ukusebenza kwesistimu eyenza le misebenzi kungalinganiswa kalula ngokungeza izibambi. Osekusele kithi wukwakha iqoqo lamaphrosesa futhi sisabalalise ngokulinganayo imisebenzi phakathi kwabo.

Ake sibheke izimo ezivelayo sisebenzisa isibonelo sabaphathi aba-3. Ngisho nasesigabeni sokusatshalaliswa komsebenzi, umbuzo wokulunga kokusabalalisa nokuchichima kwabaphathi uyavela. Ukusatshalaliswa kwe-round-robin kuzoba nesibopho sobulungisa, futhi ukugwema isimo sokuchichima kwabaphathi, sizokwethula umkhawulo umkhawulo_wokulanda kuqala. Ezimweni zesikhashana umkhawulo_wokulanda kuqala izovimbela isibambi esisodwa ekutholeni yonke imisebenzi.

Imilayezo ilawula imigqa nokucubungula okubalulekile. Amaprosesa athola imisebenzi njengoba efika. Umsebenzi ungaqedwa ngempumelelo noma wehluleke:

  • messaging:ack(Tack) - kubizwa uma umlayezo ucutshungulwe ngempumelelo
  • messaging:nack(Tack) - kubizwe kuzo zonke izimo eziphuthumayo. Uma umsebenzi usubuyisiwe, umlayezo uzowudlulisela kwesinye isibambi.

Amabhulokhi wokwakha wezinhlelo zokusebenza ezisabalalisiwe. Indlela yokuqala

Ake sithi ukwehluleka okuyinkimbinkimbi kwenzeke ngenkathi kucutshungulwa imisebenzi emithathu: iprosesa 1, ngemva kokuthola umsebenzi, iphahlazekile ngaphandle kokuba nesikhathi sokubika noma yini endaweni yokushintshanisa. Kulesi simo, indawo yokushintshisana izodlulisela umsebenzi kwesinye isibambi ngemva kokuphelelwa yisikhathi kwe-ak. Ngesizathu esithile, umphathi 3 ushiye umsebenzi futhi wathumela i-nack; ngenxa yalokho, umsebenzi waphinde wadluliselwa komunye umphathi owuqede ngempumelelo.

Isifinyezo sokuqala

Sihlanganise amabhlogo okwakha ayisisekelo amasistimu asabalalisiwe futhi sazuza ukuqonda okuyisisekelo kokusetshenziswa kwawo ku-Erlang/Elixir.

Ngokuhlanganisa amaphethini ayisisekelo, ungakha ama-paradigms ayinkimbinkimbi ukuxazulula izinkinga ezivelayo.

Engxenyeni yokugcina yochungechunge, sizobheka izindaba ezijwayelekile zokuhlela izinsizakalo, umzila nokulinganisa, futhi siphinde sikhulume ngohlangothi olusebenzayo lokuqina nokubekezelela amaphutha kwezinhlelo.

Ukuphela kwengxenye yesibili.

Photography UMarius Christensen
Imifanekiso elungiselelwe kusetshenziswa websequencediagrams.com

Source: www.habr.com

Engeza amazwana