I ka hope loa
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.
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:
-
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. -
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:
- Ke hoʻomaka nei i ka helu hoʻololi
- 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.
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.
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ʻī.
ʻ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
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 memomessaging: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.
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
Hoʻomākaukau ʻia nā kiʻi me ka hoʻohana ʻana i websequencediagrams.com
Source: www.habr.com