Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

Qetellong sehlooho Re ile ra hlahloba metheo ea theory of reactive architecture. Ke nako ea ho bua ka phallo ea data, mekhoa ea ho kenya ts'ebetsong lits'ebetso tse sebetsang tsa Erlang/Elixir le mekhoa ea melaetsa ho tsona:

  • Kopo-karabo
  • Kopo-Chunked Karabo
  • Karabo ka Kopo
  • Phatlalatsa-ngolisa
  • Phatlalatsang-ingolise
  • Kabo ea mosebetsi

SOA, MSA le Melaetsa

SOA, MSA ke meralo ea meralo e hlalosang melao ea lits'ebetso tsa kaho, athe melaetsa e fana ka lits'ebetso tsa mantlha tsa ts'ebetsong ea eona.

Ha ke batle ho khothaletsa sena kapa sebopeho sa sistimi. Ke bakeng sa ho sebelisa mekhoa e sebetsang ka ho fetisisa le e molemo bakeng sa morero o itseng le khoebo. Ho sa tsotellehe hore na re khetha paradigm efe, ho molemo ho theha li-block tsa tsamaiso ka leihlo la Unix-way: likarolo tse nang le khokahanyo e fokolang, tse ikarabellang bakeng sa mekhatlo ka bomong. Mekhoa ea API e etsa liketso tse bonolo ka ho fetesisa le mekhatlo.

Ho romella melaetsa, joalo ka ha lebitso le bolela, ke morekisi oa melaetsa. Sepheo sa eona se seholo ke ho amohela le ho romela melaetsa. E ikarabella bakeng sa li-interfaces tsa ho romela tlhahisoleseding, ho thehoa ha likanale tse utloahalang bakeng sa ho fetisa tlhahisoleseding ka har'a tsamaiso, ho tsamaisa le ho leka-lekanya, hammoho le ho sebetsana le liphoso boemong ba tsamaiso.
Melaetsa eo re e hlahisang ha e leke ho qothisana lehlokoa le rabbitmq kapa ho e nkela sebaka. Likarolo tsa eona tsa mantlha:

  • Kabo.
    Lintlha tsa phapanyetsano li ka etsoa ho li-node tsohle tsa lihlopha, haufi le khoutu e li sebelisang ka hohle kamoo ho ka khonehang.
  • Bonolo
    Tsepamisa maikutlo ho fokotsa khoutu ea boilerplate le boiketlo ba tšebeliso.
  • Tshebetso e betere.
    Ha re leke ho pheta ts'ebetso ea rabbitmq, empa re totobatsa feela lera la meralo le lipalangoang, tseo re li kenyang ho OTP habonolo kamoo ho ka khonehang, ho fokotsa litšenyehelo.
  • Ho tenyetseha.
    Tšebeletso e 'ngoe le e' ngoe e ka kopanya litempele tse ngata tsa phapanyetsano.
  • Ho tsitsa ka moralo.
  • Scalability.
    Melaetsa e hola ka ts'ebeliso. Ha mojaro o ntse o eketseha, o ka tsamaisa lintlha tsa phapanyetsano ho mechini ka bomong.

Hopola. Mabapi le tlhophiso ea khoutu, merero ea meta e loketse hantle litsamaiso tse rarahaneng tsa Erlang/Elixir. Khoutu eohle ea projeke e sebakeng sa polokelo e le 'ngoe - projeke ea sekhele. Ka nako e ts'oanang, li-microservices li arohane haholo 'me li etsa mesebetsi e bonolo e ikarabellang bakeng sa mokhatlo o ikemetseng. Ka mokhoa ona, ho bonolo ho boloka API ea tsamaiso eohle, ho bonolo ho etsa liphetoho, ho bonolo ho ngola liteko tsa lihlopha le tsa ho kopanya.

Likarolo tsa sistimi li sebelisana ka kotloloho kapa ka broker. Ho ea ka pono ea melaetsa, tšebeletso ka 'ngoe e na le mekhahlelo e mengata ea bophelo:

  • Ho qala tšebeletso.
    Mothating ona, ts'ebetso ea ts'ebeletso le litšepeho tsa eona lia hlophisoa le ho qala.
  • Ho theha sebaka sa phapanyetsano.
    Ts'ebeletso e ka sebelisa sebaka sa phapanyetsano e tsitsitseng e boletsoeng ho tlhophiso ea node, kapa ea theha lintlha tsa phapanyetsano ka matla.
  • Ngoliso ea litšebeletso.
    E le hore tšebeletso e sebetse likōpo, e tlameha ho ngolisoa sebakeng sa phapanyetsano.
  • Tshebetso e tlwaelehileng.
    Tšebeletso e fana ka mesebetsi e molemo.
  • Koala.
    Ho na le mefuta e 2 ea ho koala ho ka khonehang: e tloaelehileng le ea tšohanyetso. Nakong ea ts'ebetso e tloaelehileng, tšebeletso e khaotsoe sebakeng sa phapanyetsano ebe e emisa. Maemong a tshohanyetso, melaetsa e phethahatsa e 'ngoe ea lingoloa tsa failover.

E shebahala e rarahane haholo, empa khoutu ha se eona e tšosang. Mehlala ea khoutu e nang le litlhaloso e tla fanoa ha ho hlahlojoa litempele hamorao.

fapanyetsana

Exchange point ke mokhoa oa ho romella melaetsa o sebelisang mohopolo oa ho sebelisana le likarolo tse ka har'a template ea melaetsa. Mehlaleng eohle e fanoeng ka tlase, likarolo li sebelisana ka lintlha tsa phapanyetsano, motsoako oa tsona o etsang melaetsa.

Mekhoa ea phapanyetsano ea melaetsa (MEPs)

Lefatšeng ka bophara, mekhoa ea phapanyetsano e ka aroloa ka litsela tse peli le tsela e le 'ngoe. Ea pele e fana ka maikutlo a karabelo molaetseng o tlang, ea morao ha e bolele joalo. Mohlala oa khale oa mokhoa oa litsela tse peli mohahong oa li-server-server ke mokhoa oa ho arabela kopo. Ha re shebeng template le liphetoho tsa eona.

Kopo-karabo kapa RPC

RPC e sebelisoa ha re hloka ho fumana karabo ho tsoa ts'ebetsong e 'ngoe. Ts'ebetso ena e kanna ea sebetsa sebakeng se le seng kapa e fumaneha k'honthinenteng e 'ngoe. Ka tlase ke setšoantšo sa tšebelisano lipakeng tsa moreki le seva ka melaetsa.

Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

Kaha melaetsa ha e lumellane ka botlalo, bakeng sa moreki phapanyetsano e arotsoe ka mekhahlelo e 'meli:

  1. Kenya kopo

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

    phapanyetsano ‒ lebitso le ikhethileng la sebaka sa phapanyetsano
    ResponseMatchingTag ‒ leibole ea lehae bakeng sa ho sebetsana le karabo. Ka mohlala, tabeng ea ho romela likopo tse 'maloa tse tšoanang tsa basebelisi ba fapaneng.
    KopaDefinition - kopa 'mele
    HandlerProcess ‒ PID ea motho ea sebetsang. Ts'ebetso ena e tla fumana karabo ho tsoa ho seva.

  2. E sebetsa karabelo

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

    ResponsePayload - karabo ea seva.

Bakeng sa seva, ts'ebetso e boetse e na le mekhahlelo e 2:

  1. Ho qala sebaka sa phapanyetsano
  2. Ts'ebetso ea likopo tse amoheloang

Ha re hlahise template ena ka khoutu. Ha re re re hloka ho kenya ts'ebeletso e bonolo e fanang ka mokhoa o le mong oa nako.

Khoutu ea seva

Ha re hlalose API ea ts'ebeletso ho 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{}
}).

Ha re hlalose molaoli oa litšebeletso ho 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.

Khoutu ea bareki

Bakeng sa ho romella kopo ts'ebeletso, o ka letsetsa kopo ea melaetsa API kae kapa kae ho moreki:

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

Tsamaisong e ajoang, ho hlophisoa ha likarolo ho ka fapana haholo mme ka nako ea kopo, melaetsa e kanna ea se qale, kapa molaoli oa litšebeletso a ke ke a itokisetsa ho sebeletsa kopo. Ka hona, re hloka ho hlahloba karabo ea melaetsa le ho sebetsana le nyeoe ea ho hlōleha.
Kamora ho romella ka katleho, moreki o tla fumana karabo kapa phoso ho tsoa ts'ebeletso.
Ha re sebetsaneng le linyeoe tseo ka bobeli ho 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};

Kopo-Chunked Karabo

Ho molemo ho qoba ho romela melaetsa e meholo. Karabelo le ts'ebetso e tsitsitseng ea tsamaiso eohle e itšetlehile ka sena. Haeba karabo ea potso e nka mohopolo o mongata, joale ho e arola likarolo ke tlamo.

Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

E re ke u fe mehlala e 'maloa ea linyeoe tse joalo:

  • Likarolo li fapanyetsana data ea binary, joalo ka lifaele. Ho arola karabelo likarolong tse nyenyane ho u thusa hore u sebetse ka katleho ka lifaele tsa boholo leha e le bofe 'me u qobe ho tlala mohopolo.
  • Mananeo. Ka mohlala, re hloka ho khetha lirekoto tsohle ho tloha tafoleng e kholo ea polokelo ea litaba ebe re li fetisetsa karolong e 'ngoe.

Ke bitsa likarabo tsena hore ke tsa locomotive. Leha ho le joalo, melaetsa ea 1024 ea 1 MB e molemo ho feta molaetsa o le mong oa 1 GB.

Sehlopheng sa Erlang, re fumana phaello e eketsehileng - ho fokotsa mojaro sebakeng sa phapanyetsano le marang-rang, kaha likarabo li romeloa hang-hang ho moamoheli, li feta sebaka sa phapanyetsano.

Karabo ka Kopo

Ena ke phetoho e sa tloaelehang ea mokhoa oa RPC oa ho aha litsamaiso tsa lipuisano.

Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

Phatlalatsa-ngolisa (sefate sa kabo ea lintlha)

Litsamaiso tse tsamaisoang ke liketsahalo li li isa ho bareki hang ha data e se e lokile. Ka hona, litsamaiso li na le tšekamelo ea ho hula mohlala ho feta mokhoa oa ho hula kapa oa ho khetha. Sebopeho sena se u lumella ho qoba ho senya lisebelisoa ka ho kopa kamehla le ho emela data.
Setšoantšo se bontša mokhoa oa ho aba molaetsa ho bareki ba ngolisitseng sehlooho se itseng.

Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

Mehlala ea khale ea ho sebelisa mokhoa ona ke kabo ea mmuso: lefats'e la lipapali lipapaling tsa likhomphutha, lintlha tsa 'maraka mabapi le phapanyetsano, tlhaiso-leseling e sebetsang ho liphepelo tsa data.

Ha re shebeng khoutu ea ba ngolisitseng:

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.

Mohloli o ka letsetsa tšebetso ho phatlalatsa molaetsa sebakeng sefe kapa sefe se loketseng:

messaging:publish_message(Exchange, Key, Message).

phapanyetsano - lebitso la sebaka sa phapanyetsano,
Key - senotlolo sa ho tsamaisa
Molaetsa - mojaro oa moputso

Phatlalatsang-ingolise

Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

Ka ho holisa li-pub-sub, u ka fumana mohlala o loketseng ho rema lifate. Sehlopha sa mehloli le bareki se ka fapana ka ho feletseng. Palo e bonts'a nyeoe e nang le moreki a le mong le mehloli e mengata.

Mokhoa oa kabo ea mosebetsi

Hoo e ka bang projeke e 'ngoe le e 'ngoe e kenyelletsa mesebetsi e chechisetsoang morao, joalo ka ho hlahisa litlaleho, ho fana ka litsebiso, le ho khutlisa data ho tsoa litsing tsa batho ba bang. Ts'ebetso ea sistimi e etsang mesebetsi ena e ka fokotsoa habonolo ka ho eketsa li- handlers. Sohle se setseng ho rona ke ho theha sehlopha sa li-processor le ho arolelana mesebetsi ka ho lekana lipakeng tsa bona.

Ha re shebeng maemo a hlahang re sebelisa mohlala oa 3 handlers. Le mothating oa ho ajoa ha mosebetsi, ho hlaha taba ea toka ea kabo le ho tlala-tlala ha bahlokomeli. Kabo ea li-round-robin e tla ikarabella bakeng sa toka, 'me ho qoba boemo ba ho tlatlapa ha batsamaisi, re tla hlahisa thibelo. prefetch_limit. Maemong a nakoana prefetch_limit e tla thibela mohlokomeli a le mong ho fumana mesebetsi eohle.

Melaetsa e laola mela le litaba tse tlang pele. Li-processor li fumana mesebetsi ha li fihla. Mosebetsi o ka phethoa ka katleho kapa oa hloleha:

  • messaging:ack(Tack) - e bitsoa haeba molaetsa o sebetsoa ka katleho
  • messaging:nack(Tack) - ho bitsoa maemong ohle a tšohanyetso. Hang ha mosebetsi o khutlisitsoe, melaetsa e tla e fetisetsa ho motho e mong ea sebetsang.

Li-block tsa lisebelisoa tse ajoang. Mokhoa oa pele

Ha re re ho hloleha ho rarahaneng ho etsahetse ha o ntse o sebetsa mesebetsi e meraro: processor 1, kamora ho amohela mosebetsi, e ile ea senyeha ntle le ho ba le nako ea ho tlaleha letho sebakeng sa phapanyetsano. Tabeng ena, sebaka sa phapanyetsano se tla fetisetsa mosebetsi ho motho e mong ea sebetsang ka mor'a hore nako ea nako ea ack e felile. Ka lebaka le itseng, mohlokomeli oa 3 o ile a tlohela mosebetsi mme a romela nack; ka lebaka leo, mosebetsi o ile oa fetisetsoa ho mohlokomeli e mong ea ileng a o phetha ka katleho.

Kakaretso ea pele

Re akarelitse litekanyo tsa mantlha tsa litsamaiso tse ajoang mme ra fumana kutloisiso ea mantlha ea ts'ebeliso ea tsona ho Erlang/Elixir.

Ka ho kopanya mekhoa ea motheo, o ka haha ​​li-paradigms tse rarahaneng ho rarolla mathata a hlahang.

Karolong ea ho qetela ea letoto, re tla sheba litaba tse akaretsang tsa ho hlophisa litšebeletso, ho tsamaisa le ho leka-lekanya, hape re bue ka lehlakore le sebetsang la scalability le mamello ea liphoso ea litsamaiso.

Qetellong ea karolo ea bobeli.

foto Marius Christensen
Lipapiso tse lokiselitsoeng ho sebelisoa websequencediagrams.com

Source: www.habr.com

Eketsa ka tlhaloso