Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Sa ulahi artikulo Among gisusi ang teoretikal nga pundasyon sa reaktibo nga arkitektura. Panahon na nga maghisgot bahin sa mga pagdagayday sa datos, mga paagi sa pagpatuman sa mga reaktibo nga sistema sa Erlang/Elixir ug mga pattern sa pagmemensahe niini:

  • Paghangyo-tubag
  • Gihangyo-Chunked nga Tubag
  • Tubag uban sa Paghangyo
  • I-publish-subscribe
  • Balikbalik nga Publish-subscribe
  • Pag-apod-apod sa buluhaton

SOA, MSA ug Messaging

Ang SOA, MSA mao ang mga arkitektura sa sistema nga naghubit sa mga lagda alang sa mga sistema sa pagtukod, samtang ang pagmemensahe naghatag og mga primitibo alang sa ilang pagpatuman.

Dili ko gusto nga ipasiugda kini o kana nga arkitektura sa sistema. Ako alang sa paggamit sa labing epektibo ug mapuslanon nga mga gawi alang sa usa ka piho nga proyekto ug negosyo. Bisan unsa nga paradigm ang atong pilion, mas maayo nga maghimo og mga bloke sa sistema nga adunay usa ka mata sa Unix-way: mga sangkap nga adunay gamay nga koneksyon, responsable sa indibidwal nga mga entidad. Ang mga pamaagi sa API naghimo sa pinakasimple nga posible nga mga aksyon sa mga entidad.

Ang pagmemensahe, ingon sa gisugyot sa ngalan, usa ka broker sa mensahe. Ang panguna nga katuyoan niini mao ang pagdawat ug pagpadala mga mensahe. Kini ang responsable sa mga interface alang sa pagpadala sa kasayuran, ang pagporma sa mga lohikal nga mga agianan alang sa pagpasa sa kasayuran sa sulod sa sistema, pag-ruta ug pagbalanse, ingon man ang pagdumala sa sayup sa lebel sa sistema.
Ang mensahe nga among gipalambo wala magtinguha nga makigkompetensya o mopuli sa rabbitmq. Ang mga nag-unang bahin niini:

  • Distribusyon.
    Ang mga exchange point mahimong mabuhat sa tanang cluster node, kutob sa mahimo sa code nga naggamit niini.
  • Ang kayano.
    Pag-focus sa pagminus sa boilerplate code ug kadali sa paggamit.
  • Mas maayo nga pasundayag.
    Wala kami naningkamot nga balikon ang pag-andar sa rabbitmq, apan gipasiugda lamang ang arkitektura ug transport layer, nga among gihaum sa OTP kutob sa mahimo, nga gipamubu ang gasto.
  • Pagkasibo
    Ang matag serbisyo mahimong maghiusa sa daghang mga template sa pagbinayloay.
  • Kalig-on pinaagi sa disenyo.
  • Scalability.
    Ang pagmemensahe motubo uban sa aplikasyon. Samtang nagkadako ang load, mahimo nimong ibalhin ang mga exchange point ngadto sa indibidwal nga mga makina.

Hinumdomi. Sa mga termino sa organisasyon sa code, ang mga meta-proyekto haom kaayo alang sa komplikadong sistema sa Erlang/Elixir. Ang tanan nga code sa proyekto nahimutang sa usa ka repository - usa ka payong nga proyekto. Sa parehas nga oras, ang mga microservice labi nga nahimulag ug naghimo sa yano nga mga operasyon nga responsable sa usa ka lahi nga entidad. Uban niini nga pamaagi, dali nga mapadayon ang API sa tibuuk nga sistema, dali nga maghimo mga pagbag-o, dali nga isulat ang mga pagsulay sa yunit ug panagsama.

Ang mga sangkap sa sistema direkta nga nakig-uban o pinaagi sa usa ka broker. Gikan sa panan-aw sa pagmemensahe, ang matag serbisyo adunay daghang mga yugto sa kinabuhi:

  • Pagsugod sa serbisyo.
    Niini nga yugto, ang proseso ug mga dependency nga nagpatuman sa serbisyo gi-configure ug gilunsad.
  • Paghimo og exchange point.
    Ang serbisyo mahimong mogamit sa usa ka static exchange point nga gipiho sa node configuration, o paghimo sa exchange point nga dinamikong.
  • Pagparehistro sa serbisyo.
    Aron ang serbisyo makaalagad sa mga hangyo, kini kinahanglan nga marehistro sa exchange point.
  • Normal nga paglihok.
    Ang serbisyo nagpatunghag mapuslanong trabaho.
  • Pagsira.
    Adunay 2 ka matang sa pagsira nga posible: normal ug emerhensya. Atol sa normal nga operasyon, ang serbisyo giputol gikan sa exchange point ug mihunong. Sa mga emerhensya nga sitwasyon, ang pagmemensahe nagpatuman sa usa sa mga failover script.

Kini tan-awon medyo komplikado, apan ang code dili kaayo makahadlok. Ang mga pananglitan sa code nga adunay mga komento ihatag sa pag-analisar sa mga templates sa ulahi.

panagsukliay

Ang punto sa pagbinayloay usa ka proseso sa pagmemensahe nga nagpatuman sa lohika sa interaksyon sa mga sangkap sulod sa template sa pagmemensahe. Sa tanan nga mga pananglitan nga gipresentar sa ubos, ang mga sangkap nag-interact pinaagi sa mga punto sa pagbinayloay, ang kombinasyon niini nagporma sa pagmemensahe.

Mga sumbanan sa pagbayloay sa mensahe (MEPs)

Sa tibuok kalibutan, ang mga sumbanan sa pagbayloay mahimong bahinon sa duha ka paagi ug usa ka paagi. Ang nahauna nagpasabot ug tubag sa umaabot nga mensahe, ang naulahi wala. Usa ka klasiko nga pananglitan sa usa ka two-way pattern sa client-server architecture mao ang Request-response pattern. Atong tan-awon ang template ug ang mga pagbag-o niini.

Paghangyo-tubag o RPC

Ang RPC gigamit kung kinahanglan namong makadawat og tubag gikan sa laing proseso. Kini nga proseso mahimong nagdagan sa parehas nga node o nahimutang sa lahi nga kontinente. Sa ubos usa ka dayagram sa interaksyon tali sa kliyente ug server pinaagi sa pagmemensahe.

Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Tungod kay ang pagmemensahe hingpit nga asynchronous, alang sa kliyente ang pagbinayloay gibahin sa 2 nga mga hugna:

  1. Isumiter ang hangyo

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

    Exchange β€’ talagsaon nga ngalan sa exchange point
    ResponseMatchingTag β€’ lokal nga label para sa pagproseso sa tubag. Pananglitan, sa kaso sa pagpadala sa daghang parehas nga mga hangyo nga iya sa lainlaing mga tiggamit.
    PaghangyoKahulugan - hangyo sa lawas
    Proseso sa Handler β€’ PID sa tigdumala. Kini nga proseso makadawat og tubag gikan sa server.

  2. Pagproseso sa tubag

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

    ResponsePayload - tubag sa server.

Alang sa server, ang proseso naglangkob usab sa 2 nga mga hugna:

  1. Pagsugod sa exchange point
  2. Pagproseso sa nadawat nga mga hangyo

Atong iilustrar kini nga template gamit ang code. Ingnon ta nga kinahanglan naton ipatuman ang usa ka yano nga serbisyo nga naghatag usa ka eksakto nga pamaagi sa oras.

Kodigo sa server

Atong ipasabot ang service API sa 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{}
}).

Atong ipasabot ang service controller sa 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.

Kodigo sa kliyente

Aron magpadala usa ka hangyo sa serbisyo, mahimo nimong tawagan ang API nga hangyo sa pagmemensa bisan asa sa kliyente:

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

Sa usa ka distributed nga sistema, ang configuration sa mga component mahimong lahi kaayo ug sa panahon sa hangyo, messaging mahimong dili pa magsugod, o ang service controller dili andam sa pag-alagad sa hangyo. Busa, kinahanglan natong susihon ang tubag sa mensahe ug dumalahon ang kaso sa kapakyasan.
Human sa malampuson nga pagpadala, ang kliyente makadawat og tubag o sayop gikan sa serbisyo.
Atong dumalahon ang duha ka kaso sa 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};

Gihangyo-Chunked nga Tubag

Labing maayo nga likayan ang pagpadala ug dagkong mga mensahe. Ang pagtubag ug lig-on nga operasyon sa tibuuk nga sistema nagdepende niini. Kung ang tubag sa usa ka pangutana nagkinahanglan og daghang memorya, nan ang pagbahin niini ngadto sa mga bahin gikinahanglan.

Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Hatagan ko ikaw og pipila ka mga pananglitan sa maong mga kaso:

  • Ang mga sangkap nagbaylo sa binary nga datos, sama sa mga file. Ang pagbungkag sa tubag ngadto sa gagmay nga mga bahin makatabang kanimo sa pagtrabaho nga episyente sa mga file sa bisan unsang gidak-on ug malikayan ang pag-awas sa memorya.
  • Mga listahan. Pananglitan, kinahanglan naton pilion ang tanan nga mga rekord gikan sa usa ka dako nga lamesa sa database ug ibalhin kini sa lain nga sangkap.

Gitawag nako kini nga mga tubag nga locomotive. Sa bisan unsang kaso, ang 1024 nga mga mensahe nga 1 MB mas maayo kaysa usa ka mensahe nga 1 GB.

Sa Erlang cluster, nakakuha kami usa ka dugang nga benepisyo - pagkunhod sa load sa exchange point ug sa network, tungod kay ang mga tubag gipadala dayon ngadto sa nakadawat, nga nag-bypass sa exchange point.

Tubag uban sa Paghangyo

Kini usa ka talagsaon nga pagbag-o sa sumbanan sa RPC alang sa pagtukod sa mga sistema sa dialogo.

Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Publish-subscribe (data distribution tree)

Ang mga sistema nga gipadagan sa panghitabo naghatud kanila sa mga konsumedor sa diha nga andam na ang datos. Sa ingon, ang mga sistema mas dali sa usa ka modelo sa pagduso kaysa sa usa ka modelo sa pagbitad o poll. Kini nga bahin nagtugot kanimo sa paglikay sa pag-usik sa mga kapanguhaan pinaagi sa kanunay nga paghangyo ug paghulat sa datos.
Gipakita sa numero ang proseso sa pag-apod-apod sa usa ka mensahe sa mga konsumedor nga nag-subscribe sa usa ka piho nga hilisgutan.

Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Ang klasiko nga mga pananglitan sa paggamit niini nga sumbanan mao ang pag-apod-apod sa estado: ang kalibutan sa dula sa mga dula sa kompyuter, mga datos sa merkado sa mga pagbayloay, mapuslanon nga impormasyon sa mga feed sa datos.

Atong tan-awon ang subscriber 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.

Mahimong tawagan sa tinubdan ang function aron mamantala ang usa ka mensahe sa bisan unsang kombenyente nga lugar:

messaging:publish_message(Exchange, Key, Message).

Exchange - ngalan sa exchange point,
Key - routing key
nga mensahe - kargamento

Balikbalik nga Publish-subscribe

Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Pinaagi sa pagpalapad sa pub-sub, makakuha ka usa ka sumbanan nga kombenyente alang sa pag-log. Ang hugpong sa mga gigikanan ug mga konsumedor mahimong hingpit nga lahi. Ang numero nagpakita sa usa ka kaso sa usa ka konsumidor ug daghang mga tinubdan.

Sumbanan sa pag-apod-apod sa buluhaton

Halos matag proyekto naglakip sa mga deferred nga mga buluhaton sa pagproseso, sama sa paghimo og mga report, paghatud sa mga pahibalo, ug pagkuha sa datos gikan sa mga third-party nga sistema. Ang throughput sa sistema nga naghimo niini nga mga buluhaton dali nga ma-scale pinaagi sa pagdugang sa mga tigdumala. Ang nahabilin lamang alang kanamo mao ang pagporma sa usa ka kumpol sa mga processor ug parehas nga pag-apod-apod sa mga buluhaton sa taliwala nila.

Atong tan-awon ang mga sitwasyon nga mitungha gamit ang panig-ingnan sa 3 ka tigdumala. Bisan sa yugto sa pag-apod-apod sa buluhaton, ang pangutana sa kaangayan sa pag-apod-apod ug pag-awas sa mga tigdumala mitungha. Ang pag-apod-apod sa round-robin mahimong responsable alang sa kaangayan, ug aron malikayan ang usa ka kahimtang sa pag-awas sa mga tigdumala, magbutang kami usa ka pagdili. prefetch_limit. Sa lumalabay nga mga kahimtang prefetch_limit makapugong sa usa ka handler sa pagdawat sa tanang buluhaton.

Ang pagmemensahe nagdumala sa mga pila ug prayoridad sa pagproseso. Ang mga processor makadawat og mga buluhaton sa ilang pag-abot. Ang buluhaton mahimong makompleto nga malampuson o mapakyas:

  • messaging:ack(Tack) - gitawag kung ang mensahe malampuson nga giproseso
  • messaging:nack(Tack) - gitawag sa tanan nga mga sitwasyon sa emerhensya. Kung mabalik na ang buluhaton, ipasa kini sa mensahe sa laing handler.

Mga bloke sa pagtukod sa gipang-apod-apod nga mga aplikasyon. Unang pamaagi

Ibutang ta nga usa ka komplikado nga kapakyasan ang nahitabo samtang nagproseso sa tulo ka mga buluhaton: ang processor 1, human madawat ang buluhaton, nahagsa nga walay panahon sa pagreport sa bisan unsa ngadto sa exchange point. Niini nga kaso, ang exchange point mobalhin sa buluhaton ngadto sa laing handler human ang ack timeout matapos. Sa pipila ka rason, ang handler 3 mibiya sa buluhaton ug nagpadala sa nack; isip resulta, ang buluhaton gibalhin usab ngadto sa laing handler nga malampuson nga nakakompleto niini.

Pasiuna nga katingbanan

Among gitabonan ang batakang mga bloke sa pagtukod sa mga gipang-apod-apod nga sistema ug nakabaton ug sukaranang pagsabot sa ilang paggamit sa Erlang/Elixir.

Pinaagi sa paghiusa sa mga sukaranan nga mga sumbanan, mahimo ka magtukod mga komplikado nga paradigma aron masulbad ang mga nag-uswag nga mga problema.

Sa katapusan nga bahin sa serye, atong tan-awon ang mga kinatibuk-ang isyu sa pag-organisar sa mga serbisyo, pag-ruta ug pagbalanse, ug maghisgot usab bahin sa praktikal nga bahin sa scalability ug fault tolerance sa mga sistema.

Katapusan sa ikaduhang bahin.

litrato Marius Christensen
Mga ilustrasyon nga giandam gamit ang websequencediagrams.com

Source: www.habr.com

Idugang sa usa ka comment