Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Anns an àm a dh ’fhalbh artaigil Rinn sinn sgrùdadh air bunaitean teòiridheach ailtireachd reactive. Tha an t-àm ann bruidhinn mu shruthan dàta, dòighean air siostaman Erlang/Elixir reactive a chuir an gnìomh agus pàtrain teachdaireachd annta:

  • Iarrtas-freagairt
  • Freagairt Iarr-Chumaichte
  • Freagairt le Iarrtas
  • Foillsich-fo-sgrìobhadh
  • Inverted Foillsich-fo-sgrìobhadh
  • Sgaoileadh gnìomhan

SOA, MSA agus Teachdaireachdan

Is e ailtireachd siostam a th’ ann an SOA, MSA a tha a’ mìneachadh nan riaghailtean airson siostaman togail, fhad ‘s a tha teachdaireachdan a’ toirt seachad prìomhaidean airson an cur an gnìomh.

Chan eil mi airson seo no an ailtireachd siostam sin a bhrosnachadh. Tha mi airson na cleachdaidhean as èifeachdaiche agus as fheumaile a chleachdadh airson pròiseact agus gnìomhachas sònraichte. Ge bith dè am paradigm a thaghas sinn, tha e nas fheàrr blocaichean siostam a chruthachadh le sùil air an t-slighe Unix: co-phàirtean le glè bheag de cheangal, le uallach airson buidhnean fa leth. Bidh modhan API a’ coileanadh na gnìomhan as sìmplidh le buidhnean.

Tha teachdaireachdan, mar a tha an t-ainm a’ moladh, na broker teachdaireachd. Is e am prìomh adhbhar aige teachdaireachdan fhaighinn agus a chuir. Tha e an urra ris an eadar-aghaidh airson fiosrachadh a chuir, cruthachadh shianalan loidsigeach airson a bhith a’ sgaoileadh fiosrachadh taobh a-staigh an t-siostam, slighe agus cothromachadh, a bharrachd air làimhseachadh sgàinidhean aig ìre an t-siostaim.
Chan eil na teachdaireachdan a tha sinn a 'leasachadh a' feuchainn ri farpais ri rabbitmq no a chur an àite. Na prìomh fheartan aige:

  • Sgaoileadh.
    Faodar puingean iomlaid a chruthachadh air a h-uile nod brabhsair, cho faisg ‘s a ghabhas air a’ chòd a bhios gan cleachdadh.
  • Sìmplidh.
    Fòcas air a bhith a 'lùghdachadh còd boilerplate agus furasta a chleachdadh.
  • Coileanadh nas fheàrr.
    Chan eil sinn a’ feuchainn ri gnìomhachd rabbitmq ath-aithris, ach dìreach cuir cuideam air an ìre ailtireil is còmhdhail, a bhios sinn a’ freagairt air an OTP cho sìmplidh ‘s a ghabhas, a’ lughdachadh chosgaisean.
  • Sùbailteachd.
    Faodaidh gach seirbheis iomadh teamplaid iomlaid a chur còmhla.
  • Seasmhachd a rèir dealbhadh.
  • Scalability.
    Bidh teachdaireachdan a 'fàs leis an tagradh. Mar a bhios an luchd ag àrdachadh, faodaidh tu na puingean iomlaid a ghluasad gu innealan fa leth.

Comharraich A thaobh eagrachadh còd, tha meta-phròiseactan gu math freagarrach airson siostaman iom-fhillte Erlang/Elixir. Tha a h-uile còd pròiseict suidhichte ann an aon stòr - pròiseact sgàile. Aig an aon àm, tha microservices air an dealachadh gu ìre mhòr agus bidh iad a ’dèanamh obrachaidhean sìmplidh a tha an urra ri eintiteas fa leth. Leis an dòigh-obrach seo, tha e furasta API an t-siostam gu lèir a chumail suas, tha e furasta atharrachaidhean a dhèanamh, tha e goireasach deuchainnean aonad agus amalachaidh a sgrìobhadh.

Bidh co-phàirtean an t-siostaim ag eadar-obrachadh gu dìreach no tro broker. Bho shealladh teachdaireachd, tha grunn ìrean beatha aig gach seirbheis:

  • Tòiseachadh seirbheis.
    Aig an ìre seo, tha am pròiseas agus na eisimeileachd a tha a’ coileanadh na seirbheis air an rèiteachadh agus air an cur air bhog.
  • A 'cruthachadh puing iomlaid.
    Faodaidh an t-seirbheis puing iomlaid statach a tha air a shònrachadh ann an rèiteachadh an nód a chleachdadh, no puingean iomlaid a chruthachadh gu dinamach.
  • Clàradh seirbheis.
    Gus am bi an t-seirbheis a 'frithealadh iarrtasan, feumaidh e a bhith clàraichte aig a' phuing iomlaid.
  • Obrachadh àbhaisteach.
    Bidh an t-seirbheis a’ toirt a-mach obair fheumail.
  • Dùin sìos.
    Tha dà sheòrsa de dhùnadh ann: àbhaisteach agus èiginn. Rè obrachadh àbhaisteach, tha an t-seirbheis air a sgaradh bhon àite iomlaid agus stad. Ann an suidheachaidhean èiginneach, bidh teachdaireachdan a’ cur an gnìomh aon de na sgriobtaichean failover.

Tha e a’ coimhead gu math toinnte, ach chan eil an còd cho eagallach. Thèid eisimpleirean còd le beachdan a thoirt seachad ann am mion-sgrùdadh teamplaidean beagan nas fhaide air adhart.

iomlaidean

Is e pròiseas teachdaireachd a th’ ann an Exchange point a chuireas an gnìomh loidsig eadar-obrachadh le co-phàirtean taobh a-staigh an teamplaid teachdaireachd. Anns a h-uile h-eisimpleirean a tha air an taisbeanadh gu h-ìosal, tha na co-phàirtean ag eadar-obrachadh tro phuingean iomlaid, agus bidh an cothlamadh dhiubh a ’cruthachadh teachdaireachdan.

Pàtranan iomlaid teachdaireachdan (BPE)

Gu cruinneil, faodar pàtrain iomlaid a roinn ann an dà-shligheach agus aon-shligheach. Tha a’ chiad fhear a’ ciallachadh freagairt do theachdaireachd a tha a’ tighinn a-steach, chan eil an tè mu dheireadh. Is e eisimpleir clasaigeach de phàtran dà-shligheach ann an ailtireachd frithealaiche teachdaiche am pàtran freagairt Iarrtas. Bheir sinn sùil air an teamplaid agus na h-atharrachaidhean aige.

Iarrtas-freagairt no RPC

Bithear a’ cleachdadh RPC nuair a dh’fheumas sinn freagairt fhaighinn bho phròiseas eile. Faodaidh am pròiseas seo a bhith a’ ruith air an aon nód no suidhichte air mòr-thìr eile. Gu h-ìosal tha diagram den eadar-obrachadh eadar teachdaiche agus frithealaiche tro theachdaireachdan.

Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Leis gu bheil teachdaireachdan gu tur asyncronach, airson an neach-dèiligidh tha an iomlaid air a roinn ann an 2 ìre:

  1. A 'cur iarrtas

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

    Exchange - ainm sònraichte a’ phuing iomlaid
    ResponseMatchingTag - bileag ionadail airson an fhreagairt a làimhseachadh. Mar eisimpleir, a thaobh a bhith a 'cur grunn iarrtasan co-ionann a bhuineas do dhiofar luchd-cleachdaidh.
    Iarr Mìneachadh - corp iarraidh
    Pròiseas làimhseachaidh - PID an neach-làimhseachaidh. Gheibh am pròiseas seo freagairt bhon fhrithealaiche.

  2. A 'làimhseachadh an fhreagairt

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

    Freagairt Pàigheadh - freagairt frithealaiche.

Airson an fhrithealaiche, tha am pròiseas cuideachd air a dhèanamh suas de 2 ìre:

  1. A 'tòiseachadh air a' phuing iomlaid
  2. Làimhseachadh iarrtasan a gheibhear

Leig dhuinn an teamplaid seo a shoilleireachadh le còd. Canaidh sinn gum feum sinn seirbheis shìmplidh a chuir an gnìomh a bheir seachad aon dòigh cheart ùine.

Còd an fhrithealaiche

Nach mìnich sinn an API seirbheis ann an 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{}
}).

Nach mìnich sinn rianadair na seirbheis ann an 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.

Còd cliant

Gus iarrtas a chuir chun t-seirbheis, faodaidh tu fios a chuir gu API iarrtas teachdaireachdan àite sam bith san neach-dèiligidh:

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

Ann an siostam sgaoilte, faodaidh rèiteachadh phàirtean a bhith gu math eadar-dhealaichte agus aig àm an iarrtais, is dòcha nach tòisich teachdaireachdan fhathast, no cha bhith rianadair na seirbheis deiseil gus an t-iarrtas a fhrithealadh. Mar sin, feumaidh sinn sgrùdadh a dhèanamh air freagairt teachdaireachdan agus làimhseachadh a ’chùis teip.
Às deidh an cur gu soirbheachail, gheibh an neach-dèiligidh freagairt no mearachd bhon t-seirbheis.
Feuch an làimhsich sinn an dà chùis ann an 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};

Freagairt Iarr-Chumaichte

Tha e nas fheàrr teachdaireachdan mòra a sheachnadh. Tha freagairteachd agus obrachadh seasmhach an t-siostam gu lèir an urra ri seo. Ma thogas freagairt ceist tòrr cuimhne, tha e riatanach a roinn ann am pàirtean.

Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Leig dhomh eisimpleir no dhà a thoirt dhut de leithid de chùisean:

  • Bidh na pàirtean ag iomlaid dàta binary, leithid faidhlichean. Le bhith a’ briseadh an fhreagairt gu pàirtean beaga bidh e gad chuideachadh ag obair gu h-èifeachdach le faidhlichean de mheud sam bith agus a’ seachnadh cus cuimhne.
  • Clàran. Mar eisimpleir, feumaidh sinn a h-uile clàr a thaghadh bho chlàr mòr san stòr-dàta agus an gluasad gu pàirt eile.

Canaidh mi locomotaibh ris na freagairtean sin. Ann an suidheachadh sam bith, tha teachdaireachdan 1024 de 1 MB nas fheàrr na aon teachdaireachd de 1 GB.

Ann am buidheann Erlang, gheibh sinn buannachd a bharrachd - a’ lughdachadh an luchd air a’ phuing iomlaid agus an lìonra, leis gu bheil freagairtean air an cur sa bhad chun neach a gheibh e, a’ dol seachad air a’ phuing iomlaid.

Freagairt le Iarrtas

Is e atharrachadh caran ainneamh a tha seo air pàtran RPC airson siostaman còmhraidh togail.

Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Foillsich-fo-sgrìobhadh (craobh sgaoileadh dàta)

Bidh siostaman air an stiùireadh le tachartas gan lìbhrigeadh do luchd-cleachdaidh cho luath ‘s a bhios an dàta deiseil. Mar sin, tha siostaman nas buailtiche do mhodail putadh na modail tarraing no bhòtaidh. Leigidh am feart seo leat goireasan a sheachnadh le bhith an-còmhnaidh ag iarraidh agus a’ feitheamh ri dàta.
Tha am figear a’ sealltainn a’ phròiseas airson teachdaireachd a sgaoileadh gu luchd-cleachdaidh a tha fo-sgrìobhadh do chuspair sònraichte.

Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Is e eisimpleirean clasaigeach de bhith a ’cleachdadh a’ phàtran seo cuairteachadh stàite: saoghal a ’gheama ann an geamannan coimpiutair, dàta margaidh air iomlaidean, fiosrachadh feumail ann am biadhan dàta.

Bheir sinn sùil air còd an fho-sgrìobhaidh:

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.

Faodaidh an stòr fios a chuir chun ghnìomh gus teachdaireachd fhoillseachadh ann an àite iomchaidh sam bith:

messaging:publish_message(Exchange, Key, Message).

Exchange - ainm a 'phuing iomlaid,
prìomh - iuchair slighe
Teachdaireachd - eallach pàighidh

Inverted Foillsich-fo-sgrìobhadh

Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Le bhith a 'leudachadh taigh-seinnse, gheibh thu pàtran a tha freagarrach airson logadh. Faodaidh an t-seata de stòran agus luchd-cleachdaidh a bhith gu tur eadar-dhealaichte. Tha am figear a’ sealltainn cùis le aon neach-cleachdaidh agus grunn stòran.

Pàtran sgaoileadh ghnìomhan

Tha cha mhòr a h-uile pròiseact a’ toirt a-steach gnìomhan giullachd dàil, leithid cruthachadh aithisgean, lìbhrigeadh fiosan, agus faighinn air ais dàta bho shiostaman treas-phàrtaidh. Faodar trochur an t-siostaim a tha a’ coileanadh nan gnìomhan sin a sgèileadh gu furasta le bhith a’ cur innealan-làimhseachaidh ris. Chan eil air fhàgail againn ach cruinneachadh de phròiseasan a chruthachadh agus gnìomhan a sgaoileadh gu cothromach eatorra.

Bheir sinn sùil air na suidheachaidhean a tha ag èirigh a’ cleachdadh eisimpleir 3 làimhseachadh. Fiù 's aig ìre sgaoileadh ghnìomhan, tha a' cheist mu chothromachd sgaoilidh agus thar-shruth de luchd-làimhseachaidh ag èirigh. Bidh cuairteachadh robin cruinn an urra ri cothromachd, agus gus suidheachadh thar-shruth de luchd-làimhseachaidh a sheachnadh, bheir sinn a-steach cuingealachadh prefetch_limit. Ann an suidheachaidhean sealach prefetch_limit cuiridh e casg air aon neach-làimhseachaidh bho bhith a’ faighinn a h-uile gnìomh.

Bidh teachdaireachdan a’ riaghladh ciudhaichean agus prìomhachas giollachd. Bidh pròiseasairean a 'faighinn gnìomhan nuair a ruigeas iad. Faodaidh an obair a choileanadh gu soirbheachail no fàilligeadh:

  • messaging:ack(Tack) - ris an canar ma thèid an teachdaireachd a phròiseasadh gu soirbheachail
  • messaging:nack(Tack) - air a ghairm anns a h-uile suidheachadh èiginneach. Aon uair ‘s gu bheil an obair air a thilleadh, cuiridh teachdaireachdan air adhart e gu neach-làimhseachaidh eile.

Blocaichean togail de thagraidhean sgaoilte. A 'chiad dòigh-obrach

Seach gun do thachair fàilligeadh iom-fhillte fhad ‘s a bha thu a’ giullachd trì gnìomhan: thuit pròiseasar 1, às deidh dha a ’ghnìomh fhaighinn, gun a bhith ùine airson dad innse don phuing iomlaid. Anns a 'chùis seo, gluaisidh am puing iomlaid an obair gu neach-làimhseachaidh eile an dèidh don ùine-ama a bhith air a dhol seachad. Air adhbhar air choireigin, thrèig neach-làimhseachaidh 3 an obair agus chuir e nack; mar thoradh air an sin, chaidh an obair a ghluasad gu neach-làimhseachaidh eile a chrìochnaich e gu soirbheachail.

Geàrr-chunntas tòiseachaidh

Tha sinn air na blocaichean togail bunaiteach de shiostaman sgaoilte a chòmhdach agus air tuigse bhunasach fhaighinn air an cleachdadh ann an Erlang/Elixir.

Le bhith a’ cothlamadh phàtranan bunaiteach, faodaidh tu paradigms iom-fhillte a thogail gus fuasgladh fhaighinn air duilgheadasan a tha a’ tighinn am bàrr.

Anns a 'phàirt mu dheireadh den t-sreath, seallaidh sinn ri cùisean coitcheann a thaobh eagrachadh sheirbheisean, slighe agus cothromachadh, agus bruidhnidh sinn cuideachd air taobh practaigeach scalability agus fulangas sgàinidhean siostaman.

Deireadh an dàrna pàirt.

photo Marius Christensen
Dealbhan air an ullachadh a’ cleachdadh websequencediagrams.com

Source: www.habr.com

Cuir beachd ann