Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Na nke ikpeazu ederede Anyị nyochara ntọala usoro iwu nke reactive architecture. Oge erugo ikwu maka usoro data na-aga, ụzọ isi mejuputa sistemu Erlang/Elixir na-arụ ọrụ yana usoro izi ozi n'ime ha:

  • Arịrịọ-azịza
  • Azịza anabatara arịrịọ
  • Azịza ya na arịrịọ
  • Bipụta-denye aha
  • Mbipụta-ịdenye aha atụgharịgharịrị
  • Nkesa ọrụ

SOA, MSA na ozi

SOA, MSA bụ ihe owuwu sistemu na-akọwapụta iwu maka sistemu ụlọ, ebe ozi na-enye ihe mbụ maka mmejuputa ha.

Achọghị m ịkwalite nke a ma ọ bụ usoro nhazi ahụ. A bụ m maka iji omume kachasị dị irè na nke bara uru maka otu ọrụ na azụmahịa. Ihe ọ bụla paradaịs anyị na-ahọrọ, ọ ka mma ịmepụta blocks na anya na Unix-way: components na obere njikọ, na-ahụ maka ndị otu. Ụzọ API na-eji ụlọ ọrụ arụ ọrụ kachasị mfe.

Izi ozi bụ, dị ka aha ahụ na-egosi, onye na-ere ahịa ozi. Ebumnuche ya bụ ịnata na izipu ozi. Ọ na-ahụ maka interfaces maka izipu ozi, ịmepụta ọwa ezi uche dị na ya maka ịnyefe ozi n'ime usoro, nhazi na nhazi, yana njikwa mmejọ na ọkwa usoro.
Ozi anyị na-etolite anaghị anwa ịsọ mpi ma ọ bụ dochie rabbitmq. Isi njirimara ya:

  • Nkesa.
    Enwere ike ịmepụta ebe mgbanwe na ọnụ ụyọkọ niile, dị ka o kwere mee na koodu na-eji ha.
  • Mfe.
    Lekwasị anya na ibelata koodu efere efere yana ịdị mfe iji.
  • Ọrụ ka mma.
    Anyị anaghị agbalị ikwugharị ọrụ nke rabbitmq, kama na-egosipụta naanị ihe owuwu ụlọ na oyi akwa njem, nke anyị dabara na OTP dị ka o kwere mee, na-ebelata ọnụ ahịa.
  • Mgbanwe.
    Ọrụ ọ bụla nwere ike ijikọta ọtụtụ ndebiri mgbanwe.
  • Resiliency site na imewe.
  • scalability.
    Ozi na-eto na ngwa. Ka ibu ahụ na-abawanye, ị nwere ike ịkwaga ebe mgbanwe na igwe n'otu n'otu.

Remark. N'ihe gbasara nhazi koodu, meta-projects dabara nke ọma maka sistemụ Erlang/Elixir siri ike. Koodu oru ngo niile dị n'otu ebe nchekwa - ọrụ nche anwụ. N'otu oge ahụ, microservices na-anọpụ iche ma na-arụ ọrụ dị mfe nke na-ahụ maka ụlọ ọrụ dị iche. Site na usoro a, ọ dị mfe ịnọgide na-enwe API nke usoro dum, ọ dị mfe ime mgbanwe, ọ dị mfe iji dee otu na ule ntinye.

Akụkụ sistemụ na-emekọrịta ozugbo ma ọ bụ site na onye na-ere ahịa. Site n'echiche izi ozi, ọrụ ọ bụla nwere usoro ndụ dị iche iche:

  • Mmalite ọrụ.
    N'oge a, a na-ahazi usoro na ịdabere na-arụ ọrụ ahụ ma malite ya.
  • Ịmepụta ebe mgbanwe.
    Ọrụ ahụ nwere ike iji ebe mgbanwe kwụ ọtọ akọwapụtara na nhazi ọnụ, ma ọ bụ mepụta ebe mgbanwe n'ike.
  • Ndebanye aha ọrụ.
    Ka ọrụ ahụ wee nye arịrịọ, a ga-edebanye aha ya na ebe mgbanwe.
  • Ịrụ ọrụ nkịtị.
    Ọrụ ahụ na-arụpụta ọrụ bara uru.
  • Mechie.
    Enwere ụdị mmechi abụọ enwere ike: nkịtị na ihe mberede. N'oge ọrụ nkịtị, a na-ewepụ ọrụ ahụ site na ebe mgbanwe ma kwụsị. N'ọnọdụ mberede, izipu na-eme otu n'ime edemede ndị na-emezughị.

Ọ na-adị nnọọ mgbagwoju anya, ma koodu abụghị ihe niile na-atụ egwu. A ga-enye ihe atụ koodu na nkọwa na nyocha nke ndebiri obere oge.

Exchanges

Ebe mgbanwe bụ usoro izi ozi nke na-emejuputa mgbagha nke mmekọrịta na ihe ndị dị n'ime ndebiri ozi. N'ihe atụ niile dị n'okpuru ebe a, ihe mejupụtara ya na-emekọrịta ihe site na mgbanwe mgbanwe, nchikota nke na-emepụta ozi.

Ụkpụrụ mgbanwe ozi (MEPs)

N'ụwa niile, enwere ike kewaa usoro mgbanwe n'ụzọ abụọ na otu ụzọ. Nke mbụ pụtara nzaghachi nye ozi na-abata, nke ikpeazụ adịghị. Ọmụmaatụ mara mma nke ụkpụrụ ụzọ abụọ n'ime ụlọ ahịa-ihe nkesa bụ ụkpụrụ nzaghachi arịrịọ. Ka anyị leba anya na template na mgbanwe ya.

Arịrịọ-azịza ma ọ bụ RPC

A na-eji RPC eme ihe mgbe anyị kwesịrị ịnata nzaghachi site na usoro ọzọ. Usoro a nwere ike na-aga n'otu ọnụ ọnụ ma ọ bụ dị na kọntinent dị iche. N'okpuru bụ eserese ngosi nke mmekọrịta dị n'etiti onye ahịa na nkesa site na izi ozi.

Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Ebe ọ bụ na izipu ozi asynchronous kpamkpam, maka onye ahịa, a na-ekewa mgbanwe ahụ n'ime usoro abụọ:

  1. Nyefee arịrịọ

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

    Exchange - aha pụrụ iche nke ebe mgbanwe
    ResponseMatchingTag - akara mpaghara maka ịhazi nzaghachi. Dịka ọmụmaatụ, n'ihe gbasara izipu ọtụtụ arịrịọ yiri nke ndị ọrụ dị iche iche.
    ArịrịọNkọwa - arịrịọ ahu
    Usoro njikwa - PID nke onye njikwa. Usoro a ga-enweta nzaghachi site na ihe nkesa.

  2. Na-ahazi nzaghachi

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

    Nzaghachi Ịkwụ ụgwọ - nzaghachi nkesa.

Maka ihe nkesa, usoro a nwekwara akụkụ abụọ:

  1. Na-amalite ebe mgbanwe
  2. Nhazi nke arịrịọ natara

Ka anyị jiri koodu kọwaa ndebiri a. Ka anyị kwuo na anyị kwesịrị iji mejuputa a mfe ọrụ na-enye otu kpọmkwem oge usoro.

Koodu nkesa

Ka anyị kọwapụta API ọrụ na 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{}
}).

Ka anyị kọwapụta onye njikwa ọrụ na 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 onye ahịa

Iji zipu arịrịọ na ọrụ ahụ, ị ​​nwere ike ịkpọ arịrịọ API n'ebe ọ bụla n'ime onye ahịa:

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

N'ime usoro nkesa, nhazi nke akụrụngwa nwere ike ịdị nnọọ iche na n'oge arịrịọ ahụ, ozi nwere ike ọ gaghị amalite, ma ọ bụ onye na-ahụ maka ọrụ agaghị adị njikere ịnye arịrịọ ahụ. Ya mere, anyị kwesịrị ịlele nzaghachi ozi ma jikwaa ikpe ọdịda.
Mgbe izipu nke ọma, onye ahịa ga-enweta nzaghachi ma ọ bụ njehie site na ọrụ ahụ.
Ka anyị leba anya n'okwu abụọ ahụ na 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};

Azịza anabatara arịrịọ

Ọ kacha mma izere izipu nnukwu ozi. Nzaghachi na ịrụ ọrụ kwụsiri ike nke usoro dum dabere na nke a. Ọ bụrụ na nzaghachi nye ajụjụ na-ewelite ọtụtụ ebe nchekwa, mgbe ahụ ikewa ya na akụkụ bụ iwu.

Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Ka m nye gị ihe atụ ole na ole gbasara ụdị ikpe a:

  • Ngwa ndị ahụ na-agbanwe data ọnụọgụ abụọ, dị ka faịlụ. Ịmebi nzaghachi n'ime obere akụkụ na-enyere gị aka ịrụ ọrụ nke ọma na faịlụ nke nha ọ bụla ma zere oke ebe nchekwa.
  • Ndepụta. Dịka ọmụmaatụ, anyị kwesịrị ịhọrọ ndekọ niile site na nnukwu tebụl dị na nchekwa data ma nyefee ha na mpaghara ọzọ.

Ana m akpọ azịza ndị a locomotive. N'ọnọdụ ọ bụla, ozi 1024 nke 1 MB dị mma karịa otu ozi nke 1 GB.

Na ụyọkọ Erlang, anyị na-enweta uru ọzọ - ibelata ibu na ebe mgbanwe na netwọk, ebe ọ bụ na a na-ezigara onye nnata nzaghachi ozugbo, na-agafe ebe mgbanwe.

Azịza ya na arịrịọ

Nke a bụ mgbanwe dị ụkọ nke ụkpụrụ RPC maka iwulite sistemụ mkparịta ụka.

Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Bipụta-senye aha (osisi nkesa data)

Sistemu na-eme emume na-ebuga ha ndị na-azụ ahịa ozugbo data dị njikere. N'ihi ya, usoro na-adịkarị mfe maka ihe nrụnye karịa n'ụdị ịdọrọ ma ọ bụ ntuli aka. Njirimara a na-enye gị ohere izere ịla n'iyi site na ịrịọ na ichere data mgbe niile.
Ọnụọgụ a na-egosi usoro ikesa ozi nye ndị ahịa debanyere aha na otu isiokwu.

Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Ihe atụ ochie nke iji ụkpụrụ a bụ nkesa steeti: ụwa egwuregwu na egwuregwu kọmputa, data ahịa na mgbanwe, ozi bara uru na ntanetị data.

Ka anyị leba anya na koodu ntinye aha:

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.

Isi mmalite ahụ nwere ike ịkpọ ọrụ ka ibipụta ozi n'ebe ọ bụla dabara adaba:

messaging:publish_message(Exchange, Key, Message).

Exchange - aha ebe mgbanwe,
Key - igodo ụzọ
Message - ibu ibu

Mbipụta-ịdenye aha atụgharịgharịrị

Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Site n'ịgbasa ụlọ mmanya, ị nwere ike nweta ụkpụrụ dabara adaba maka ịkụ osisi. Ntọala nke isi mmalite na ndị na-azụ ahịa nwere ike ịdị iche kpamkpam. Ọnụọgụ ahụ na-egosi ikpe nwere otu onye na-azụ ahịa na ọtụtụ isi mmalite.

Ụkpụrụ nkesa ọrụ

Ihe fọrọ nke nta ka ọ bụrụ oru ngo ọ bụla na-agụnye ọrụ nhazi ebugharị, dị ka ịmepụta akụkọ, ịnye ọkwa, na iweghachite data sitere na sistemụ ndị ọzọ. Enwere ike ịgbatị mmepụta nke sistemu na-arụ ọrụ ndị a n'ụzọ dị mfe site n'ịgbakwunye ndị njikwa. Naanị ihe fọdụrụ anyị bụ imepụta ụyọkọ nke nhazi na kesaa ọrụ n'etiti ha nke ọma.

Ka anyị leba anya n'ọnọdụ ndị na-ebilite na-eji ihe atụ nke ndị njikwa 3. Ọbụna n'oge nkesa nkesa ọrụ, ajụjụ maka izi ezi nke nkesa na njupụta nke ndị na-elekọta ya na-ebilite. Nkesa gburugburu-robin ga-abụ maka ikpe ziri ezi, yana iji zere ọnọdụ nke njupụta nke ndị na-elekọta ya, anyị ga-ewebata mmachi. prefetch_limit. N'ọnọdụ ndị na-agafe agafe prefetch_limit ga-egbochi otu onye njikwa ịnata ọrụ niile.

Izi ozi na-ejikwa kwụ n'ahịrị na nhazi ụzọ. Ndị nhazi na-enweta ọrụ ka ha rutere. Ọrụ ahụ nwere ike rụchaa nke ọma ma ọ bụ daa:

  • messaging:ack(Tack) - akpọọ ya ma ọ bụrụ na edoziziri ozi ahụ nke ọma
  • messaging:nack(Tack) - akpọ na ọnọdụ mberede niile. Ozugbo eweghachiri ọrụ ahụ, ozi ga-ebufe ya n'aka onye ọrụ ọzọ.

Ihe owuwu ụlọ nke ngwa ekesa. Ụzọ mbụ

Were ya na ọdịda mgbagwoju anya mere mgbe ị na-ahazi ọrụ atọ: processor 1, mgbe ọ natara ọrụ ahụ, daa n'enweghị oge ịkọ ihe ọ bụla na ebe mgbanwe. N'okwu a, ebe mgbanwe ahụ ga-ebufe ọrụ ahụ na onye ọrụ ọzọ mgbe oge ack kwụsịrị. N'ihi ihe ụfọdụ, onye na-ahụ maka 3 hapụrụ ọrụ ahụ wee ziga ya nack; n'ihi ya, e bufere ọrụ ahụ n'aka onye ọrụ ọzọ nke mezuru ya nke ọma.

Mbido nchịkọta

Anyị ekpuchila isi ihe ụlọ nke sistemu ekesa wee nweta nghọta bụ isi maka ojiji ha na Erlang/Elixir.

Site na ijikọta ụkpụrụ ndị bụ isi, ị nwere ike wulite paradigms dị mgbagwoju anya iji dozie nsogbu ndị na-apụta.

N'akụkụ ikpeazụ nke usoro a, anyị ga-eleba anya n'okwu gbasara nhazi ọrụ, nhazi na nhazi, ma na-ekwukwa banyere akụkụ bara uru nke scalability na mmejọ nke usoro.

Ọgwụgwụ akụkụ nke abụọ.

Photography Marius Christensen
Ihe atụ ejiri websequencediagrams.com akwadoro

isi: www.habr.com

Tinye a comment