Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Thaum kawg Tshooj Peb tshuaj xyuas lub hauv paus theoretical ntawm reactive architecture. Nws yog lub sijhawm los tham txog cov ntaub ntawv ntws, txoj hauv kev los siv cov txheej txheem Erlang / Elixir reactive thiab xa cov qauv hauv lawv:

  • Thov- teb
  • Thov-Chunked teb
  • Teb nrog Thov
  • Tshaj tawm-subscribe
  • Inverted Publish-Subscribe
  • Kev faib ua haujlwm

SOA, MSA thiab Messaging

SOA, MSA yog cov txheej txheem tsim qauv uas txhais cov cai rau kev tsim cov tshuab, thaum kev xa xov muab qhov tseem ceeb rau lawv qhov kev siv.

Kuv tsis xav txhawb qhov no lossis qhov system architecture. Kuv yog rau kev siv cov kev coj ua zoo tshaj plaws thiab muaj txiaj ntsig zoo rau ib txoj haujlwm tshwj xeeb thiab kev lag luam. Txawm li cas los xij peb xaiv, nws yog qhov zoo dua los tsim cov txheej txheem thaiv nrog lub qhov muag ntawm Unix-txoj kev: cov khoom sib txuas nrog tsawg kawg nkaus, lub luag haujlwm rau ib tus neeg. API txoj kev ua qhov ua tau yooj yim tshaj plaws nrog cov koom haum.

Kev xa xov yog, raws li lub npe qhia, cov lus xa tawm. Nws lub hom phiaj tseem ceeb yog txais thiab xa cov lus. Nws yog lub luag haujlwm rau kev sib cuam tshuam rau kev xa cov ntaub ntawv, tsim cov txheej txheem kev sib txuas lus rau kev xa cov ntaub ntawv hauv qhov system, routing thiab ntsuas, nrog rau kev ua txhaum ntawm qhov system theem.
Kev xa xov peb tab tom tsim tsis yog sim sib tw nrog lossis hloov rabbitmq. Nws lub ntsiab nta:

  • Kev faib tawm.
    Cov ntsiab lus pauv tuaj yeem tsim rau ntawm txhua pawg ntawm pawg, ze li sai tau rau cov cai uas siv lawv.
  • Qhov Yooj Yim.
    Tsom ntsoov rau kev txo qis boilerplate code thiab yooj yim ntawm kev siv.
  • Kev ua tau zoo dua.
    Peb tsis tau sim rov ua dua qhov kev ua haujlwm ntawm rabbitmq, tab sis tseem ceeb tsuas yog cov txheej txheem kev tsim vaj tsev thiab kev thauj mus los, uas peb haum rau OTP kom yooj yim li sai tau, txo cov nqi tsawg.
  • Yooj yim.
    Txhua qhov kev pabcuam tuaj yeem ua ke ntau cov qauv sib pauv.
  • Resiliency los ntawm kev tsim.
  • Scalability.
    Kev xa xov loj tuaj nrog daim ntawv thov. Raws li kev thauj khoom nce, koj tuaj yeem txav cov ntsiab lus pauv mus rau ib tus neeg lub tshuab.

Cov lus ceeb toom. Nyob rau hauv cov nqe lus ntawm lub koom haum code, meta-projects yog zoo haum rau complex Erlang / Elixir systems. Txhua qhov project code yog nyob rau hauv ib lub repository - ib lub kaus project. Nyob rau tib lub sijhawm, microservices raug cais tawm ntau tshaj plaws thiab ua haujlwm yooj yim uas yog lub luag haujlwm rau ib qho chaw sib cais. Nrog rau txoj hauv kev no, nws yooj yim los tswj hwm API ntawm tag nrho cov kab ke, nws yooj yim rau kev hloov pauv, nws yooj yim rau sau chav tsev thiab kev sib koom ua ke.

Cov khoom siv sib cuam tshuam ncaj qha lossis los ntawm tus broker. Los ntawm kev xa xov, txhua qhov kev pabcuam muaj ob peb lub neej theem:

  • Kev pabcuam pib.
    Nyob rau theem no, cov txheej txheem thiab kev vam meej ua tiav cov kev pabcuam raug teeb tsa thiab pib ua haujlwm.
  • Tsim kom muaj qhov sib pauv.
    Cov kev pabcuam tuaj yeem siv qhov sib pauv hloov pauv uas tau teev tseg hauv qhov kev teeb tsa ntawm node, lossis tsim cov ntsiab lus sib pauv dynamically.
  • Kev pabcuam sau npe.
    Txhawm rau kom cov kev pabcuam ua haujlwm rau kev thov, nws yuav tsum tau sau npe ntawm qhov chaw sib pauv.
  • Ua haujlwm li qub.
    Cov kev pabcuam tsim muaj txiaj ntsig zoo.
  • Kaw.
    Muaj 2 hom kev kaw tau: ib txwm thiab xwm txheej ceev. Thaum lub sijhawm ua haujlwm ib txwm, cov kev pabcuam raug txiav tawm ntawm qhov sib pauv thiab nres. Thaum muaj xwm txheej ceev, kev xa xov ua tiav ib qho ntawm cov ntawv sau tsis raug.

Nws zoo nkaus li nyuaj, tab sis cov cai tsis yog txhua yam uas txaus ntshai. Code piv txwv nrog cov lus pom yuav muab rau hauv kev tsom xam ntawm cov qauv me ntsis tom qab.

Kev Sib Hloov

Txauv taw tes yog cov txheej txheem kev xa xov uas siv lub logic ntawm kev sib cuam tshuam nrog cov khoom hauv kev xa xov. Hauv tag nrho cov piv txwv hais hauv qab no, cov khoom sib cuam tshuam los ntawm kev sib pauv cov ntsiab lus, kev sib xyaw ua ke ntawm cov ntawv xa xov.

Cov qauv sib pauv lus (MEPs)

Thoob plaws ntiaj teb, kev sib pauv cov qauv tuaj yeem muab faib ua ob txoj kev thiab ib txoj kev. Tus qub hais txog cov lus teb rau cov lus tuaj, tom kawg tsis ua. Ib qho piv txwv classic ntawm ob-txoj kev qauv hauv cov neeg siv khoom-neeg rau zaub mov architecture yog tus qauv thov- teb. Cia peb saib cov qauv thiab nws cov kev hloov kho.

Thov- teb lossis RPC

RPC yog siv thaum peb xav tau txais cov lus teb los ntawm lwm tus txheej txheem. Cov txheej txheem no yuav khiav ntawm tib lub node los yog nyob rau ntawm ib sab av loj. Hauv qab no yog daim duab qhia txog kev sib cuam tshuam ntawm tus neeg siv khoom thiab server ntawm kev xa xov.

Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Txij li kev xa xov yog asynchronous kiag li, rau tus neeg siv khoom sib pauv tau muab faib ua 2 theem:

  1. Xa daim ntawv thov

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

    txauv - Lub npe tshwj xeeb ntawm qhov pauv pauv
    ResponseMatchingTag - Daim ntawv lo hauv zos rau kev ua cov lus teb. Piv txwv li, nyob rau hauv cov ntaub ntawv ntawm xa ob peb zoo tib yam thov teej tug mus rau txawv cov neeg siv.
    RequestDefinition - thov lub cev
    HandlerProcess - PID ntawm tus tuav. Cov txheej txheem no yuav tau txais cov lus teb los ntawm lub server.

  2. Ua cov lus teb

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

    TebPayload - server teb.

Rau lub server, cov txheej txheem kuj muaj 2 theem:

  1. Pib qhov kev pauv pauv
  2. Kev ua cov lus thov tau txais

Cia peb piav qhia lub template no nrog code. Cia peb hais tias peb yuav tsum siv qhov kev pabcuam yooj yim uas muab ib txoj hauv kev raws sijhawm.

Server code

Cia peb txhais cov kev pabcuam API hauv 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{}
}).

Cia peb txhais cov kev pabcuam tswj hauv 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.

Client code

Txhawm rau xa daim ntawv thov mus rau qhov kev pabcuam, koj tuaj yeem hu rau kev xa ntawv thov API nyob qhov twg hauv tus neeg siv khoom:

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

Nyob rau hauv ib qho kev faib tawm, kev teeb tsa ntawm cov khoom sib txawv tuaj yeem sib txawv thiab thaum lub sijhawm thov, kev xa xov yuav tseem tsis tau pib, lossis tus tswj kev pabcuam yuav tsis npaj rau kev pabcuam kev thov. Yog li ntawd, peb yuav tsum xyuas cov lus teb thiab daws qhov teeb meem tsis ua haujlwm.
Tom qab xa tau tiav lawm, tus neeg siv yuav tau txais cov lus teb lossis qhov yuam kev los ntawm kev pabcuam.
Cia peb ua ob qhov xwm txheej hauv 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};

Thov-Chunked teb

Nws yog qhov zoo tshaj kom tsis txhob xa cov lus loj. Kev teb thiab kev ua haujlwm ruaj khov ntawm tag nrho cov system nyob ntawm qhov no. Yog tias cov lus teb rau cov lus nug yuav siv ntau lub cim xeeb, ces faib nws mus rau hauv qhov chaw yog qhov yuav tsum tau ua.

Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Cia kuv muab koj ob peb yam piv txwv ntawm cov xwm txheej zoo li no:

  • Cov khoom sib pauv cov ntaub ntawv binary, xws li cov ntaub ntawv. Kev rhuav tshem cov lus teb rau hauv qhov me me pab koj ua haujlwm zoo nrog cov ntaub ntawv ntawm txhua qhov loj thiab tsis txhob nco dhau.
  • Cov npe. Piv txwv li, peb yuav tsum xaiv tag nrho cov ntaub ntawv los ntawm ib lub rooj loj loj hauv cov ntaub ntawv thiab xa mus rau lwm qhov.

Kuv hu cov lus teb locomotive. Txawm li cas los xij, 1024 cov lus ntawm 1 MB zoo dua li ib qho lus ntawm 1 GB.

Hauv pawg Erlang, peb tau txais txiaj ntsig ntxiv - txo cov khoom thauj ntawm qhov sib pauv pauv thiab lub network, txij li cov lus teb raug xa mus rau tus neeg txais tam sim ntawd, hla qhov sib pauv pauv.

Teb nrog Thov

Qhov no yog qhov tsis tshua muaj kev hloov kho ntawm RPC tus qauv rau lub tsev dialog systems.

Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Publish-subscribe (cov ntaub ntawv faib ntoo)

Kev tshwm sim-tsav tshuab xa lawv mus rau cov neeg siv khoom sai li sai tau thaum cov ntaub ntawv npaj tau. Yog li, cov txheej txheem muaj ntau dua rau tus qauv thawb ntau dua li tus qauv rub lossis kev xaiv tsa. Qhov no tso cai rau koj kom tsis txhob nkim peev txheej los ntawm kev thov thiab tos cov ntaub ntawv tas li.
Daim duab qhia txog cov txheej txheem ntawm kev faib cov lus rau cov neeg siv khoom tau sau npe rau ib lub ncauj lus tshwj xeeb.

Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Classic piv txwv ntawm kev siv cov qauv no yog kev faib tawm ntawm lub xeev: lub ntiaj teb kev ua si hauv computer games, cov ntaub ntawv lag luam ntawm kev sib pauv, cov ntaub ntawv tseem ceeb hauv cov ntaub ntawv txau.

Cia peb saib ntawm tus neeg siv npe code:

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.

Lub hauv paus tuaj yeem hu rau lub luag haujlwm los tshaj tawm cov lus hauv txhua qhov chaw yooj yim:

messaging:publish_message(Exchange, Key, Message).

txauv - lub npe ntawm qhov chaw sib pauv,
Ntsiab - tus yuam sij routing
lus - payload

Inverted Publish-Subscribe

Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Los ntawm kev nthuav dav pub-sub, koj tuaj yeem tau txais cov qauv yooj yim rau kev txiav. Cov txheej txheem ntawm qhov chaw thiab cov neeg siv khoom tuaj yeem sib txawv kiag li. Daim duab qhia ib rooj plaub nrog ib tus neeg siv khoom thiab ntau qhov chaw.

Txoj hauj lwm faib qauv

Yuav luag txhua qhov project cuam tshuam nrog kev ncua sijhawm ua haujlwm, xws li tsim cov ntawv ceeb toom, xa cov ntawv ceeb toom, thiab khaws cov ntaub ntawv los ntawm cov txheej txheem thib peb. Kev hla ntawm lub kaw lus ua cov haujlwm no tuaj yeem ua kom yooj yim los ntawm kev ntxiv cov neeg ua haujlwm. Txhua yam uas tseem tshuav rau peb yog los tsim ib pawg ntawm cov processors thiab sib npaug faib cov haujlwm ntawm lawv.

Cia peb saib cov xwm txheej uas tshwm sim siv qhov piv txwv ntawm 3 tus tuav. Txawm hais tias nyob rau theem ntawm kev faib ua haujlwm, cov lus nug ntawm kev ncaj ncees ntawm kev faib tawm thiab cov neeg ua haujlwm dhau los tshwm sim. Round-robin kev faib tawm yuav yog lub luag haujlwm rau kev ncaj ncees, thiab kom tsis txhob muaj qhov xwm txheej ntawm cov neeg ua haujlwm dhau los, peb yuav qhia txog kev txwv. prefetch_limit. Hauv cov xwm txheej tsis ntev los no prefetch_limit yuav tiv thaiv ib tus neeg ua haujlwm los ntawm kev txais txhua yam haujlwm.

Kev xa xov tswj cov kab thiab ua qhov tseem ceeb. Cov neeg ua haujlwm tau txais cov haujlwm thaum lawv tuaj txog. Txoj haujlwm tuaj yeem ua tiav lossis ua tsis tiav:

  • messaging:ack(Tack) - hu yog tias cov lus tau ua tiav
  • messaging:nack(Tack) - hu rau txhua qhov xwm txheej ceev. Thaum cov haujlwm rov qab los, kev xa xov yuav dhau mus rau lwm tus tuav haujlwm.

Lub tsev blocks ntawm kev faib daim ntawv thov. Thawj txoj hauv kev

Piv txwv li ib tug complex tsis ua hauj lwm tshwm sim thaum ua peb txoj hauj lwm: processor 1, tom qab tau txais cov hauj lwm, crashed tsis muaj sij hawm los qhia dab tsi rau qhov sib pauv point. Hauv qhov no, qhov sib pauv pauv yuav hloov txoj haujlwm mus rau lwm tus neeg tuav haujlwm tom qab lub sijhawm ack tau tas sijhawm. Rau qee qhov laj thawj, tus tuav 3 tau tso tseg txoj haujlwm thiab xa nack; vim li ntawd, txoj haujlwm tseem raug xa mus rau lwm tus tuav haujlwm uas ua tiav nws.

Lus piav me ntsis

Peb tau npog cov txheej txheem hauv tsev ntawm cov tshuab faib thiab tau txais kev nkag siab yooj yim ntawm lawv siv hauv Erlang / Elixir.

Los ntawm kev sib txuas cov qauv yooj yim, koj tuaj yeem tsim cov qauv sib txawv los daws cov teeb meem tshwm sim.

Hauv qhov kawg ntawm cov koob, peb yuav saib cov teeb meem dav dav ntawm kev teeb tsa cov kev pabcuam, routing thiab ntsuas qhov ntsuas, thiab tseem tham txog qhov ua tau zoo ntawm scalability thiab kev ua txhaum ntawm lub tshuab.

Kawg ntawm qhov thib ob.

Photography Marius Christensen
Cov duab nraaj npaj siv websequencediagrams.com

Tau qhov twg los: www.hab.com

Ntxiv ib saib