Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Ni ikẹhin article a ti ṣe atupale awọn ipilẹ tumq si ti ifaseyin faaji. O to akoko lati sọrọ nipa awọn ṣiṣan data, awọn ọna lati ṣe imuse awọn ọna ṣiṣe Erlang/Elixir, ati awọn ilana fifiranṣẹ ninu wọn:

  • Ibere-idahun
  • Idahun Ibere-Chunked
  • Idahun pẹlu Ibere
  • Ṣe atẹjade-alabapin
  • Iyipada Atẹjade Alabapin
  • Pinpin iṣẹ-ṣiṣe

SOA, MSA ati fifiranṣẹ

SOA, MSA jẹ awọn ayaworan eto ti o ṣalaye awọn ofin fun awọn ọna ṣiṣe ile, lakoko ti fifiranṣẹ n pese awọn ipilẹṣẹ fun imuse wọn.

Emi ko fẹ lati elesin yi tabi ti eto faaji. Mo wa fun ohun elo ti o munadoko julọ ati awọn iṣe iwulo fun iṣẹ akanṣe ati iṣowo kan pato. Eyikeyi apẹrẹ ti a yan, o dara lati ṣẹda awọn bulọọki eto pẹlu oju lori ọna Unix: awọn paati pẹlu Asopọmọra pọọku, lodidi fun awọn nkan kọọkan. Awọn ọna API ṣe awọn iṣe ti o rọrun julọ pẹlu awọn nkan.

Fifiranṣẹ - gẹgẹbi orukọ naa ṣe tumọ si - alagbata ifiranṣẹ kan. Idi akọkọ rẹ ni lati gba ati firanṣẹ awọn ifiranṣẹ. O jẹ iduro fun awọn atọkun fun fifiranṣẹ alaye, dida awọn ikanni ọgbọn fun gbigbe alaye laarin eto, ipa-ọna ati iwọntunwọnsi, ati mimu ikuna ni ipele eto.
Ifiranṣẹ ti o dagbasoke ko gbiyanju lati dije pẹlu tabi rọpo rabbitmq. Awọn ẹya akọkọ rẹ:

  • Pinpin.
    Awọn aaye paṣipaarọ le ṣee ṣẹda lori gbogbo awọn apa ti iṣupọ, bi o ti ṣee ṣe si koodu ti o nlo wọn.
  • Irọrun.
    Fojusi lori idinku koodu igbomikana ati irọrun ti lilo.
  • Iṣe ti o dara julọ.
    A ko gbiyanju lati tun iṣẹ-ṣiṣe ti rabbitmq ṣe, ṣugbọn a yan nikan ti ayaworan ati Layer gbigbe, eyiti a baamu si OTP ni irọrun bi o ti ṣee, idinku awọn idiyele.
  • Ni irọrun.
    Iṣẹ kọọkan le darapọ ọpọlọpọ awọn awoṣe paṣipaarọ.
  • Resiliency nipa oniru.
  • Scalability.
    Fifiranṣẹ dagba pẹlu ohun elo naa. Bi ẹru naa ṣe n pọ si, o le gbe awọn aaye paṣipaarọ si awọn ẹrọ lọtọ.

Ọrọìwòye. Ni awọn ofin ti agbari koodu, awọn iṣẹ akanṣe-meta ni ibamu daradara fun awọn eto Erlang/Elixir eka. Gbogbo koodu ise agbese wa ni ibi ipamọ kan - iṣẹ agboorun kan. Ni akoko kanna, awọn iṣẹ microservices ti ya sọtọ bi o ti ṣee ṣe ati ṣe awọn iṣẹ ti o rọrun ti o jẹ iduro fun nkan lọtọ. Pẹlu ọna yii, o rọrun lati ṣetọju API ti gbogbo eto, o rọrun lati ṣe awọn ayipada, o rọrun lati kọ ẹyọkan ati awọn idanwo iṣọkan.

Awọn paati eto nlo taara tabi nipasẹ alagbata kan. Lati ipo ti fifiranṣẹ, iṣẹ kọọkan ni ọpọlọpọ awọn ipele igbesi aye:

  • Ibẹrẹ iṣẹ.
    Ni ipele yii, iṣeto ati ifilọlẹ ilana ti n ṣiṣẹ iṣẹ ati awọn igbẹkẹle waye.
  • Ṣẹda aaye paṣipaarọ.
    Iṣẹ naa le lo aaye paṣipaarọ aimi kan pato ninu iṣeto ile-iṣẹ, tabi ṣẹda awọn aaye paṣipaarọ ni agbara.
  • Iforukọsilẹ iṣẹ.
    Ni ibere fun iṣẹ naa lati sin awọn ibeere, o gbọdọ forukọsilẹ lori aaye paṣipaarọ.
  • Iṣiṣẹ deede.
    Iṣẹ naa ṣe iṣẹ ti o wulo.
  • Ipari iṣẹ.
    Awọn oriṣi meji ti tiipa: deede ati pajawiri. Pẹlu iṣẹ deede, o ge asopọ lati aaye paṣipaarọ ati awọn iduro. Ni awọn iṣẹlẹ pajawiri, fifiranṣẹ ṣiṣẹ ọkan ninu awọn oju iṣẹlẹ ti kuna.

O wulẹ oyimbo idiju, ṣugbọn awọn koodu ni ko bẹ idẹruba. Awọn apẹẹrẹ koodu pẹlu awọn asọye yoo fun ni itupalẹ awọn awoṣe diẹ diẹ nigbamii.

pasipaaro

Ojuami paṣipaarọ jẹ ilana fifiranṣẹ ti o ṣe imuse ọgbọn ibaraenisepo pẹlu awọn paati laarin awoṣe fifiranṣẹ. Ninu gbogbo awọn apẹẹrẹ ti o wa ni isalẹ, awọn paati ṣe ajọṣepọ nipasẹ awọn aaye paṣipaarọ, apapọ eyiti o jẹ fifiranṣẹ.

Awọn ilana paṣipaarọ ifiranṣẹ (MEPs)

Ni agbaye, awọn ilana paṣipaarọ le pin si awọn ẹgbẹ meji ati ọkan-ẹgbẹ. Awọn tele tumo si a esi si awọn ti nwọle ifiranṣẹ, awọn igbehin se ko. Apeere Ayebaye ti ilana ọna meji ni faaji olupin-olupin jẹ apẹrẹ-idahun ibeere. Wo awoṣe ati awọn iyipada rẹ.

Idahun ibeere tabi RPC

RPC ti lo nigba ti a nilo lati gba esi lati ilana miiran. Ilana yii le ṣiṣẹ lori agbalejo kanna tabi lori kọnputa ti o yatọ. Ni isalẹ ni aworan atọka ti ibaraenisepo laarin alabara ati olupin nipasẹ fifiranṣẹ.

Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Niwọn igba ti fifiranṣẹ jẹ asynchronous patapata, paṣipaarọ fun alabara ti pin si awọn ipele 2:

  1. Fi ibeere ranṣẹ

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

    Exchange - Orukọ aaye paṣipaarọ alailẹgbẹ
    ResponseMatchingTag - aami agbegbe fun sisẹ esi naa. Fun apẹẹrẹ, ninu ọran ti fifiranṣẹ ọpọlọpọ awọn ibeere kanna ti o jẹ ti awọn olumulo oriṣiriṣi.
    Beere Itumọ - ara ìbéèrè
    Ilana Handler - PID ti olutọju. Ilana yii yoo gba esi lati ọdọ olupin naa.

  2. Sise idahun

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

    ResponsePayload - server esi.

Fun olupin naa, ilana naa tun ni awọn ipele meji:

  1. Ibẹrẹ ojuami paṣipaarọ
  2. Ṣiṣe awọn ibeere ti nwọle

Jẹ ki a ṣe apejuwe awoṣe yii pẹlu koodu. Jẹ ki a sọ pe a nilo lati ṣe iṣẹ ti o rọrun ti o pese ọna akoko deede kan.

koodu olupin

Jẹ ki a gbe itumọ API iṣẹ si 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{}
}).

Ṣetumo oluṣakoso iṣẹ ni 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.

koodu onibara

Lati fi ibeere ranṣẹ si iṣẹ kan, o le pe ibeere fifiranṣẹ API nibikibi lori alabara:

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

Ninu eto pinpin, iṣeto ni awọn paati le yatọ pupọ, ati ni akoko ibeere naa, fifiranṣẹ le ma bẹrẹ, tabi oludari iṣẹ kii yoo ṣetan lati sin ibeere naa. Nitorinaa, a nilo lati ṣayẹwo esi fifiranṣẹ ati mu ọran ikuna naa.
Lẹhin fifiranṣẹ aṣeyọri si alabara, iṣẹ naa yoo gba esi tabi aṣiṣe kan.
Jẹ ki a mu awọn ọran mejeeji mu ni 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};

Idahun Ibere-Chunked

O dara julọ lati yago fun fifiranṣẹ awọn ifiranṣẹ nla. Iṣeduro ati iṣẹ iduroṣinṣin ti gbogbo eto da lori eyi. Ti idahun si ibeere ba gba iranti pupọ, lẹhinna pipin jẹ dandan.

Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Eyi ni awọn apẹẹrẹ meji ti iru awọn ọran:

  • Awọn paati ṣe paṣipaarọ data alakomeji, gẹgẹbi awọn faili. Pipin idahun si awọn apakan kekere ṣe iranlọwọ lati ṣiṣẹ daradara pẹlu awọn faili ti iwọn eyikeyi ati pe ko yẹ awọn iṣan omi iranti.
  • Awọn akojọ. Fun apẹẹrẹ, a nilo lati yan gbogbo awọn igbasilẹ lati tabili nla kan ninu ibi ipamọ data ki o gbe lọ si paati miiran.

Mo pe iru awọn idahun ni locomotive. Ni eyikeyi idiyele, awọn ifiranṣẹ 1024 1MB dara ju ifiranṣẹ 1GB kan lọ.

Ninu iṣupọ Erlang, a gba anfani afikun - idinku fifuye lori aaye paṣipaarọ ati nẹtiwọọki, niwọn igba ti awọn idahun ti firanṣẹ lẹsẹkẹsẹ si olugba, ni ikọja aaye paṣipaarọ naa.

Idahun pẹlu Ibere

Eyi jẹ iyipada ti o ṣọwọn kuku ti ilana RPC fun kikọ awọn eto ibaraẹnisọrọ.

Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Ṣe atẹjade-alabapin (igi pinpin data)

Awọn ọna ṣiṣe-iṣẹlẹ nfi data ranṣẹ si awọn alabara ni kete ti o ti ṣetan. Nitorinaa, awọn ọna ṣiṣe jẹ ifaragba si awoṣe titari ju si fa tabi awoṣe ibo. Ẹya yii ngbanilaaye lati maṣe sọfo awọn orisun nipa bibeere nigbagbogbo ati nduro fun data.
Nọmba naa fihan ilana ti pinpin ifiranṣẹ si awọn alabara ti o ṣe alabapin si koko-ọrọ kan pato.

Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Awọn apẹẹrẹ Ayebaye ti lilo ilana yii jẹ pinpin ipinlẹ: agbaye ere ni awọn ere kọnputa, data ọja lori awọn paṣipaarọ, alaye to wulo ni awọn kikọ sii data.

Wo koodu alabapin naa:

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.

Orisun le pe iṣẹ atẹjade ti ifiranṣẹ ni eyikeyi aaye irọrun:

messaging:publish_message(Exchange, Key, Message).

Exchange - orukọ aaye paṣipaarọ,
Key - bọtini ipa ọna
Message - fifuye

Iyipada Atẹjade Alabapin

Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Nipa gbigbi ile-ọti, o le gba apẹrẹ ti o rọrun fun gedu. Eto awọn orisun ati awọn onibara le yatọ patapata. Nọmba naa fihan ọran pẹlu olumulo kan ati ọpọlọpọ awọn orisun.

Àpẹẹrẹ pinpin iṣẹ-ṣiṣe

Ni fere gbogbo iṣẹ akanṣe, awọn iṣẹ ṣiṣe ti idaduro idaduro wa, gẹgẹbi awọn iroyin ti o npese, fifiranṣẹ awọn iwifunni, ati gbigba data lati awọn eto ẹnikẹta. Ṣiṣejade ti eto ti o ṣe awọn iṣẹ-ṣiṣe wọnyi ni irọrun ni iwọn nipasẹ fifi awọn ilana sii. Gbogbo ohun ti o ku fun wa ni lati ṣẹda iṣupọ ti awọn ilana ati pinpin awọn iṣẹ ṣiṣe ni deede laarin wọn.

Ro awọn ipo ti o dide nipa lilo apẹẹrẹ ti 3 handlers. Paapaa ni ipele ti pinpin iṣẹ-ṣiṣe, ibeere ti iṣotitọ ti pinpin ati ṣiṣan ti awọn olutọju dide. Pinpin-robin yoo jẹ iduro fun ododo, ati lati yago fun ipo ti iṣan omi ti awọn olutọju, a yoo ṣafihan ihamọ kan. prefetch_limit. Ni awọn ipo iyipada prefetch_limit kii yoo gba laaye olutọju kan lati gba gbogbo awọn iṣẹ-ṣiṣe.

Fifiranṣẹ ṣakoso awọn laini ati iṣaju sisẹ. Awọn isise gba awọn iṣẹ-ṣiṣe bi wọn ti de. Iṣẹ naa le pari ni aṣeyọri tabi kuna:

  • messaging:ack(Tack) - ti a pe ni ọran ti ṣiṣe aṣeyọri ti ifiranṣẹ naa
  • messaging:nack(Tack) - ti a npe ni gbogbo awọn ipo pajawiri. Lẹhin ti iṣẹ naa ba pada, fifiranṣẹ yoo fi ranṣẹ si oluṣakoso miiran.

Awọn bulọọki ile ti awọn ohun elo ti a pin. Ọna akọkọ

Jẹ ki a ro pe lakoko ṣiṣe awọn iṣẹ-ṣiṣe mẹta, ikuna eka kan waye: olutọju 1, lẹhin gbigba iṣẹ naa, kọlu laisi akoko lati jabo ohunkohun si aaye paṣipaarọ. Ni idi eyi, aaye paṣipaarọ yoo gbe iṣẹ naa lọ si olutọju miiran lẹhin igbati ack ti pari. Olutọju 3 fun idi kan ti kọ iṣẹ naa silẹ o si fi nack ranṣẹ, bi abajade, iṣẹ naa tun kọja si olutọju miiran ti o pari ni aṣeyọri.

Lakotan Lakotan

A ti fọ awọn bulọọki ile ipilẹ ti awọn ọna ṣiṣe pinpin ati ni oye ipilẹ ti lilo wọn ni Erlang/Elixir.

Nipa apapọ awọn awoṣe ipilẹ, awọn paradigms eka le jẹ itumọ lati yanju awọn iṣoro ti n yọ jade.

Ni apakan ikẹhin ti ọmọ naa, a yoo ṣe akiyesi awọn ọran gbogbogbo ti siseto awọn iṣẹ, ipa-ọna ati iwọntunwọnsi, ati tun sọrọ nipa ẹgbẹ iṣe ti scalability ati ifarada ẹbi ti awọn eto.

Ipari ti awọn keji apa.

Fọto Marius Christensen
Awọn aworan atọwọdọwọ ti websequencediagrams.com

orisun: www.habr.com

Fi ọrọìwòye kun