Ekugcineni
- 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.
Njengoba ukuthumela imiyalezo ku-asynchronous ngokuphelele, kuklayenti ukushintshana kuhlukaniswe izigaba ezi-2:
-
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. -
Icubungula impendulo
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)
ImpenduloPayload - impendulo yeseva.
Kuseva, inqubo futhi iqukethe izigaba ezi-2:
- Ukuqala iphoyinti lokushintshisana
- 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.
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.
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.
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
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 ngempumelelomessaging:nack(Tack)
- kubizwe kuzo zonke izimo eziphuthumayo. Uma umsebenzi usubuyisiwe, umlayezo uzowudlulisela kwesinye isibambi.
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
Imifanekiso elungiselelwe kusetshenziswa websequencediagrams.com
Source: www.habr.com