Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

I ka hope loa 'ōlelo Ua nānā mākou i nā kumu kumu o ka hoʻolālā reactive. ʻO ka manawa kēia e kamaʻilio e pili ana i nā kahe ʻikepili, nā ala e hoʻokō ai i nā ʻōnaehana Erlang/Elixir reactive a me nā ʻano memo i loko o lākou:

  • Noi-pane
  • Noi-Chunked pane
  • Pane me Noi
  • Hoʻopuka-kau inoa
  • Hoʻopuka hoʻopuka hoʻohuli ʻia
  • Māhele hana

SOA, MSA a me ka memo

ʻO SOA, MSA nā ʻōnaehana hoʻolālā e wehewehe i nā lula no ke kūkulu ʻana i nā ʻōnaehana, ʻoiai e hāʻawi ana ka memo i nā primitives no kā lākou hoʻokō.

ʻAʻole makemake wau e hoʻolaha i kēia a i kēlā ʻōnaehana ʻōnaehana. ʻO wau no ka hoʻohana ʻana i nā hana maikaʻi loa a pono no kahi papahana a me kahi ʻoihana. ʻO kēlā me kēia paradigm a mākou e koho ai, ʻoi aku ka maikaʻi o ka hana ʻana i nā poloka ʻōnaehana me ka maka ma ke ala Unix: nā ʻāpana me ka liʻiliʻi liʻiliʻi, kuleana no nā hui pākahi. Hana nā ala API i nā hana maʻalahi loa me nā hui.

ʻO ka memo, e like me ka inoa e hōʻike nei, he mea hoʻolaha memo. ʻO kāna kumu nui ka loaʻa a hoʻouna ʻana i nā leka. ʻO ia ke kuleana no ka hoʻouna ʻana i ka ʻike, ka hoʻokumu ʻana i nā ala kūpono no ka hoʻouna ʻana i ka ʻike i loko o ka ʻōnaehana, ke ala ʻana a me ke kaulike ʻana, a me ka mālama hewa ʻana ma ka pae ʻōnaehana.
ʻO ka memo a mākou e hoʻomohala nei ʻaʻole ia e hoʻāʻo e hoʻokūkū a hoʻololi paha i ka rabbitmq. ʻO kāna mau hiʻohiʻona nui:

  • Hoʻolaha.
    Hiki ke hana ʻia nā helu hoʻololi ma nā pūnana puʻupuʻu a pau, kokoke loa i ke code e hoʻohana ana ia mau mea.
  • Keʻano maʻalahi
    E noʻonoʻo i ka hōʻemi ʻana i ka code boilerplate a me ka maʻalahi o ka hoʻohana.
  • ʻOi aku ka maikaʻi o ka hana.
    ʻAʻole mākou e hoʻāʻo e hana hou i ka hana o ka rabbitmq, akā e hōʻike wale i ka papa hana hale a me ka halihali, a mākou e hoʻokomo ai i ka OTP me ka hiki ke hiki, e hōʻemi ana i nā kumukūʻai.
  • Hoʻololi.
    Hiki i kēlā me kēia lawelawe ke hoʻohui i nā kumu hoʻololi he nui.
  • ʻO ke kūpaʻa ma ka hoʻolālā.
  • Scalability.
    Hoʻonui ka memo me ka noi. Ke piʻi aʻe ka ukana, hiki iā ʻoe ke neʻe i nā wahi hoʻololi i nā mīkini pākahi.

Kākau. Ma nā ʻōlelo o ka hoʻonohonoho code, kūpono nā meta-projects no nā ʻōnaehana Erlang / Elixir paʻakikī. Aia nā code papahana a pau i hoʻokahi waihona - he papahana umbrella. I ka manawa like, hoʻokaʻawale ʻia nā microservices a hana i nā hana maʻalahi i kuleana no kahi hui kaʻawale. Me kēia ala, maʻalahi ka mālama ʻana i ka API o ka ʻōnaehana holoʻokoʻa, maʻalahi ke hoʻololi, maʻalahi ke kākau ʻana i nā hoʻokolohua ʻāpana a me ka hoʻohui.

Hoʻopili pololei nā ʻāpana ʻōnaehana a i ʻole ma o kahi broker. Mai kahi hiʻohiʻona memo, loaʻa i kēlā me kēia lawelawe kekahi mau hanana ola:

  • Hoʻomaka lawelawe.
    I kēia pae, hoʻonohonoho ʻia a hoʻomaka ʻia ke kaʻina hana a me nā hilinaʻi e hoʻokō nei i ka lawelawe.
  • Ke hana ʻana i kahi hoʻololi.
    Hiki i ka lawelawe ke hoʻohana i kahi helu hoʻololi static i kuhikuhi ʻia i ka hoʻonohonoho node, a i ʻole e hana i nā helu hoʻololi me ka ikaika.
  • Hoʻopaʻa inoa lawelawe.
    I mea e lawelawe ai ka lawelawe i nā noi, pono e hoʻopaʻa inoa ʻia ma ka wahi hoʻololi.
  • Hana maʻamau.
    Hāʻawi ka lawelawe i nā hana pono.
  • E hoʻopio.
    Aia 2 ʻano o ka pani ʻana: maʻamau a me ka pilikia. I ka wā o ka hana maʻamau, hoʻopau ʻia ka lawelawe mai ka wahi hoʻololi a kū. Ma nā kūlana pilikia, hoʻokō ka memo i kekahi o nā palapala failover.

He mea paʻakikī ke nānā aku, akā ʻaʻole makaʻu ke code. E hāʻawi ʻia nā hiʻohiʻona code me nā manaʻo i ka nānā ʻana o nā templates ma hope iki.

kūkaʻi

He kaʻina leka hoʻololi e hoʻokō i ka loina o ka launa pū ʻana me nā ʻāpana i loko o ka laʻana memo. Ma nā hiʻohiʻona a pau i hōʻike ʻia ma lalo nei, pili nā ʻāpana ma o nā wahi hoʻololi, ʻo ka hui pū ʻana o ia mau mea e hana i ka memo.

Nā mamana hoʻololi memo (MEPs)

Ma ke ao holoʻokoʻa, hiki ke hoʻokaʻawale ʻia nā ʻano hoʻololi i ʻelua ala a hoʻokahi ala. Hōʻike ka mea mua i ka pane i kahi leka e hiki mai ana, ʻaʻole ka hope. ʻO kahi hiʻohiʻona maʻamau o kahi hiʻohiʻona ʻelua ʻaoʻao i ka hoʻolālā client-server ʻo ke ʻano noi-pane. E nānā kākou i ka la'ana a me kona mau ho'ololi.

Noi-pane a i ʻole RPC

Hoʻohana ʻia ka RPC i ka wā e pono ai mākou e loaʻa kahi pane mai kahi kaʻina hana ʻē aʻe. Ke holo nei paha kēia kaʻina hana ma ka node hoʻokahi a i ʻole ma kahi ʻāina ʻē aʻe. Aia ma lalo kahi kiʻi o ka pilina ma waena o ka mea kūʻai aku a me ke kikowaena ma o ka leka uila.

Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

No ka mea, ʻaʻohe asynchronous ka memo, no ka mea kūʻai aku ua māhele ʻia ka hoʻololi i 2 mau ʻāpana:

  1. E hoʻouna i noi

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

    mail ‒ inoa kū hoʻokahi o ka wahi hoʻololi
    ResponseMatchingTag ‒ lepili kūloko no ka hoʻoponopono ʻana i ka pane. No ka laʻana, i ka hihia o ka hoʻouna ʻana i nā noi like ʻole no nā mea hoʻohana like ʻole.
    NoiDefinition - kino noi
    Mea Hana Hana ‒ PID o ka mea lawelawe. E loaʻa i kēia kaʻina ka pane mai ke kikowaena.

  2. Ke hana nei i ka pane

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

    PanePayload - pane kikowaena.

No ke kikowaena, aia ka hana i 2 mau māhele:

  1. Ke hoʻomaka nei i ka helu hoʻololi
  2. Ka hana ʻana i nā noi i loaʻa

E hōʻike kākou i kēia laʻana me ke code. E ʻōlelo mākou pono mākou e hoʻokō i kahi lawelawe maʻalahi e hāʻawi i kahi ʻano manawa kikoʻī hoʻokahi.

Code kikowaena

E wehewehe i ka API lawelawe ma 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{}
}).

E wehewehe i ka mea hoʻoponopono lawelawe ma 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.

Code mea kūʻai aku

No ka hoʻouna ʻana i kahi noi i ka lawelawe, hiki iā ʻoe ke kāhea i ka API noi leka uila ma nā wahi āpau o ka mea kūʻai:

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

Ma kahi ʻōnaehana i hoʻolaha ʻia, hiki ke ʻokoʻa loa ka hoʻonohonoho ʻana o nā ʻāpana a i ka manawa o ke noi, ʻaʻole i hoʻomaka ka hoʻouna ʻana, a i ʻole e mākaukau ka luna lawelawe e lawelawe i ka noi. No laila, pono mākou e nānā i ka pane memo a mālama i ka hihia hemahema.
Ma hope o ka hoʻouna maikaʻi ʻana, e loaʻa i ka mea kūʻai aku kahi pane a i ʻole hewa mai ka lawelawe.
E mālama kākou i nā hihia ʻelua ma 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};

Noi-Chunked pane

ʻOi aku ka maikaʻi e pale i ka hoʻouna ʻana i nā leka nui. ʻO ka pane a me ka hana paʻa o ka ʻōnaehana holoʻokoʻa e pili ana i kēia. Inā nui ka hoʻomanaʻo ʻana i ka pane i kahi nīnau, a laila pono e hoʻokaʻawale iā ia i mau ʻāpana.

Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

E hāʻawi wau iā ʻoe i ʻelua mau hiʻohiʻona o ia mau hihia:

  • Hoʻololi nā ʻāpana i ka ʻikepili binary, e like me nā faila. ʻO ka uhaki ʻana i ka pane i nā ʻāpana liʻiliʻi e kōkua iā ʻoe e hana maikaʻi me nā faila o kēlā me kēia nui a pale i ka nui o ka hoʻomanaʻo.
  • Nā papa inoa. No ka laʻana, pono mākou e koho i nā moʻolelo āpau mai kahi papa nui i ka waihona a hoʻoili iā lākou i kahi ʻāpana ʻē aʻe.

Kapa au i kēia mau pane locomotive. ʻOi aku ka maikaʻi o nā memo 1024 o 1 MB ma mua o hoʻokahi memo o 1 GB.

I loko o ka hui Erlang, loaʻa iā mākou kahi pōmaikaʻi hou - e hoʻemi ana i ka ukana ma ka wahi hoʻololi a me ka pūnaewele, no ka mea, ua hoʻouna koke ʻia nā pane i ka mea loaʻa, e kāpae ana i ka helu hoʻololi.

Pane me Noi

He hoʻololi kakaikahi kēia o ke ʻano RPC no ke kūkulu ʻana i nā ʻōnaehana kamaʻilio.

Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

Publish-subscribe (lāʻau hāʻawi ʻikepili)

Hāʻawi nā ʻōnaehana hanana hanana iā lākou i nā mea kūʻai aku i ka wā e mākaukau ai ka ʻikepili. No laila, ʻoi aku ka maʻalahi o nā ʻōnaehana i kahi hiʻohiʻona paʻi ma mua o kahi hiʻohiʻona huki a koho paha. Hāʻawi kēia hiʻohiʻona iā ʻoe e pale i ka hoʻopau ʻana i nā kumuwaiwai ma ke noi mau ʻana a kali i ka ʻikepili.
Hōʻike ke kiʻi i ke kaʻina o ka hāʻawi ʻana i kahi leka i nā mea kūʻai aku i kākau inoa i kahi kumuhana kikoʻī.

Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

ʻO nā hiʻohiʻona maʻamau o ka hoʻohana ʻana i kēia hiʻohiʻona ʻo ia ka māhele ʻana o ka mokuʻāina: ka honua pāʻani i nā pāʻani kamepiula, ka ʻikepili mākeke ma nā hoʻololi, ka ʻike pono i nā hānai ʻikepili.

E nānā kākou i ke code mea kākau inoa:

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.

Hiki i ke kumu ke kāhea i ka hana e hoʻolaha i kahi memo ma nā wahi kūpono:

messaging:publish_message(Exchange, Key, Message).

mail - inoa o ka wahi hoʻololi,
Key - kī ala ala
Message - ka ukana

Hoʻopuka hoʻopuka hoʻohuli ʻia

Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

Ma ka hoʻonui ʻana i ka pub-sub, hiki iā ʻoe ke kiʻi i kahi kumu kūpono no ka logging. Hiki keʻokoʻa loa ka hoʻonohonoho o nā kumu a me nā mea kūʻai. Hōʻike ke kiʻi i kahi hihia me hoʻokahi mea kūʻai aku a me nā kumu he nui.

Ke kumu hoʻohele hana

Ma kahi kokoke i kēlā me kēia pāhana e pili ana i nā hana hoʻoponopono i hoʻopaneʻe ʻia, e like me ka hana ʻana i nā hōʻike, ka hoʻolaha ʻana i nā leka hoʻomaopopo, a me ka lawe ʻana i ka ʻikepili mai nā ʻōnaehana ʻaoʻao ʻekolu. Hiki ke hoʻonui maʻalahi i ka throughput o ka ʻōnaehana e hana nei i kēia mau hana me ka hoʻohui ʻana i nā mea lawelawe. ʻO nā mea a pau i koe iā mākou, ʻo ia ka hana ʻana i kahi pūʻulu o nā kaʻina hana a puʻunaue like i nā hana ma waena o lākou.

E nānā kākou i nā kūlana e kū mai ana me ka hoʻohana ʻana i ka laʻana o 3 mau mea lawelawe. ʻOiai ma ke kahua o ka hāʻawi ʻana i nā hana, kū mai ka nīnau o ka pono o ka hoʻohele a me ka hoʻomāhuahua ʻana o nā mea lawelawe. ʻO ka hāʻawi ʻana i ka round-robin ke kuleana no ka kaulike, a no ka pale ʻana i kahi kūlana o ka hoʻomāhuahua ʻana o nā mea lawelawe, e hoʻolauna mākou i kahi palena. prefetch_limit. I nā kūlana kuewa prefetch_limit e pale aku i ka loaʻa ʻana o nā hana a pau.

Mālama ʻo Messaging i nā pila a me ka hana mua. Loaʻa i nā mea hana nā hana i ko lākou hōʻea ʻana. Hiki ke hoʻopau maikaʻi a hāʻule paha ka hana:

  • messaging:ack(Tack) - kāhea ʻia inā hoʻokō pono ʻia ka memo
  • messaging:nack(Tack) - kāhea ʻia i nā kūlana pilikia āpau. Ke hoʻihoʻi ʻia ka hana, e hāʻawi ʻia ka memo i kahi mea lawelawe ʻē aʻe.

Nā papa kūkulu o nā noi i hoʻolaha ʻia. ʻO ke ala mua

Inā paha ua hiki ʻole ka paʻakikī i ka wā e hana ana i ʻekolu mau hana: ʻo ka mea hana 1, ma hope o ka loaʻa ʻana o ka hana, hāʻule me ka loaʻa ʻole o ka manawa e hōʻike i kekahi mea i ka wahi hoʻololi. I kēia hihia, e hoʻololi ka wahi hoʻololi i ka hana i kahi mea lawelawe ʻē aʻe ma hope o ka pau ʻana o ka manawa ack. No kekahi kumu, ua haʻalele ka mea lawelawe 3 i ka hana a hoʻouna i ka nack; ʻo ka hopena, ua hoʻoili ʻia ka hana i kahi mea lawelawe ʻē aʻe i hoʻopau pono.

Hōʻuluʻulu manaʻo mua

Ua uhi mākou i nā poloka kūkulu kumu o nā ʻōnaehana puʻupuʻu a loaʻa iā mākou kahi ʻike kumu o kā lākou hoʻohana ʻana ma Erlang/Elixir.

Ma ka hoʻohui ʻana i nā kumu maʻamau, hiki iā ʻoe ke kūkulu i nā paradigms paʻakikī e hoʻoponopono i nā pilikia e kū mai ana.

Ma ka ʻāpana hope o ka moʻo, e nānā mākou i nā pilikia maʻamau o ka hoʻonohonoho ʻana i nā lawelawe, ke ala ʻana a me ke kaulike ʻana, a kamaʻilio pū kekahi e pili ana i ka ʻaoʻao kūpono o ka scalability a me ka hoʻomanawanui hewa o nā ʻōnaehana.

Ka pau ana o ka mahele elua.

Photo Marius Christensen
Hoʻomākaukau ʻia nā kiʻi me ka hoʻohana ʻana i websequencediagrams.com

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka