Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

A karshe labarin Mun bincika tushen ka'idar gine-gine mai amsawa. Lokaci ya yi da za a yi magana game da kwararar bayanai, hanyoyin aiwatar da tsarin Erlang/Elixir mai aiki da tsarin saƙo a cikinsu:

  • Amsa-tambaya
  • Amsa-Cunked Amsa
  • Amsa tare da Buƙatun
  • Buga-subscribe
  • Juyar da Buga-biyan kuɗi
  • Rarraba ayyuka

SOA, MSA da Saƙo

SOA, MSA su ne tsarin gine-ginen tsarin da ke ayyana ka'idodin tsarin gine-gine, yayin da saƙon ke ba da abubuwan da suka dace don aiwatarwa.

Ba na son inganta wannan ko wancan tsarin gine-gine. Ni ne don amfani da mafi inganci da ayyuka masu amfani don takamaiman aiki da kasuwanci. Duk abin da muka zaɓa, yana da kyau a ƙirƙiri tubalan tsarin tare da ido kan hanyar Unix: abubuwan haɗin gwiwa tare da ƙarancin haɗin kai, alhakin ƙungiyoyin mutum ɗaya. Hanyoyin API suna aiwatar da ayyuka mafi sauƙi tare da ƙungiyoyi.

Saƙo, kamar yadda sunan ke nunawa, dillalin saƙo ne. Babban manufarsa shine karba da aikawa da sakonni. Yana da alhakin musaya don aika bayanai, samar da tashoshi masu ma'ana don watsa bayanai a cikin tsarin, kewayawa da daidaitawa, da kuma sarrafa kuskure a matakin tsarin.
Saƙon da muke haɓaka ba ƙoƙarin yin gasa da ko maye gurbin rabbitmq ba. Babban fasalinsa:

  • Rarrabawa.
    Ana iya ƙirƙira wuraren musanya akan duk kuɗaɗen tari, kusa da lambar da ke amfani da su.
  • Sauki.
    Mayar da hankali kan rage girman lambar tukunyar jirgi da sauƙin amfani.
  • Mafi kyawun aiki.
    Ba muna ƙoƙarin maimaita ayyukan rabbitmq ba, amma muna haskaka kawai tsarin gine-gine da layin sufuri, wanda muka dace da OTP a sauƙaƙe, rage farashin.
  • Sassauci.
    Kowane sabis na iya haɗa samfuran musanya da yawa.
  • Resiliency ta zane.
  • Ƙimar ƙarfi.
    Saƙo yana girma tare da aikace-aikacen. Yayin da nauyin ya karu, zaka iya matsar da wuraren musayar zuwa na'urori guda ɗaya.

Sake alamar. Dangane da tsarin lambar, meta-ayyukan sun dace da hadadden tsarin Erlang/Elixir. Duk lambar aikin tana cikin wurin ajiya ɗaya - aikin laima. A lokaci guda, microservices suna keɓanta da yawa kuma suna yin ayyuka masu sauƙi waɗanda ke da alhakin keɓancewar mahalli. Tare da wannan tsarin, yana da sauƙi don kula da API na dukan tsarin, yana da sauƙi don yin canje-canje, ya dace don rubuta naúrar da gwaje-gwajen haɗin kai.

Abubuwan tsarin suna hulɗa kai tsaye ko ta hanyar dillali. Ta fuskar saƙo, kowane sabis yana da matakai na rayuwa da yawa:

  • Farkon sabis.
    A wannan mataki, ana tsara tsari da abubuwan dogaro da ke aiwatar da sabis ɗin kuma ana ƙaddamar da su.
  • Ƙirƙirar wurin musayar.
    Sabis ɗin na iya amfani da madaidaicin wurin musayar da aka ƙayyade a cikin tsarin kumburi, ko ƙirƙirar wuraren musanya a hankali.
  • Rijistar sabis.
    Domin sabis ɗin ya ba da buƙatun, dole ne a yi rajista a wurin musayar.
  • Aiki na al'ada.
    Sabis ɗin yana samar da aiki mai amfani.
  • Rufewa
    Akwai nau'ikan rufewa guda biyu: na al'ada da na gaggawa. Yayin aiki na al'ada, ana katse sabis ɗin daga wurin musayar kuma yana tsayawa. A cikin yanayin gaggawa, saƙo yana aiwatar da ɗaya daga cikin rubutun gazawar.

Yana kama da rikitarwa, amma lambar ba duk abin ban tsoro bane. Misalai na lamba tare da sharhi za a ba da su a cikin nazarin samfuran ɗan lokaci kaɗan.

tsakanin

Ma'anar musanya tsarin saƙo ne wanda ke aiwatar da dabarun hulɗa tare da abubuwan da ke cikin samfurin saƙon. A cikin duk misalan da aka gabatar a ƙasa, abubuwan da aka haɗa suna hulɗa ta hanyar wuraren musayar, haɗuwa wanda ke haifar da saƙo.

Hanyoyin musayar saƙo (MEPs)

A duniya, ana iya raba tsarin musanya zuwa hanyoyi biyu da kuma hanya ɗaya. Na farko yana nuna martani ga saƙo mai shigowa, na ƙarshe ba sa. Misali na yau da kullun na ƙirar hanya biyu a cikin gine-ginen uwar garken abokin ciniki shine ƙirar amsa buƙatar. Bari mu dubi samfurin da gyare-gyarensa.

Amsar tambaya ko RPC

Ana amfani da RPC lokacin da muke buƙatar karɓar amsa daga wani tsari. Wannan tsari yana iya kasancewa yana gudana akan kumburi ɗaya ko yana kan wata nahiya dabam. A ƙasa akwai zane na hulɗar tsakanin abokin ciniki da uwar garken ta hanyar saƙo.

Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

Tunda saƙon ya kasance gaba ɗaya asynchronous, ga abokin ciniki musayar ya kasu kashi 2:

  1. Bada buƙatar

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

    Exchange - sunan musamman na wurin musayar
    ResponseMatchingTag - lakabin gida don sarrafa amsa. Misali, a yanayin aika buƙatun iri ɗaya na masu amfani daban-daban.
    BuƙatunMa'anar - roƙon jiki
    Tsarin Gudanarwa - PID na mai sarrafa. Wannan tsari zai sami amsa daga uwar garken.

  2. Gudanar da amsa

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

    ResponseBiyan kuɗi - amsawar uwar garke.

Ga uwar garken, tsarin kuma ya ƙunshi matakai 2:

  1. Fara wurin musayar
  2. Gudanar da buƙatun da aka karɓa

Bari mu kwatanta wannan samfuri da lamba. Bari mu ce muna buƙatar aiwatar da sabis mai sauƙi wanda ke ba da hanyar daidaitaccen lokaci guda ɗaya.

Lambar uwar garken

Bari mu ayyana API ɗin sabis a 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{}
}).

Bari mu ayyana mai sarrafa sabis a 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.

Lambar abokin ciniki

Domin aika buƙatu zuwa sabis ɗin, zaku iya kiran buƙatar aika saƙon API a ko'ina cikin abokin ciniki:

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

A cikin tsarin da aka rarraba, daidaitawar abubuwan haɗin gwiwa na iya bambanta sosai kuma a lokacin buƙatun, saƙon bazai fara ba tukuna, ko mai kula da sabis ɗin ba zai kasance a shirye don sabis ɗin buƙatun ba. Don haka, muna buƙatar bincika martanin saƙon kuma mu kula da yanayin gazawar.
Bayan nasarar aikawa, abokin ciniki zai sami amsa ko kuskure daga sabis ɗin.
Bari mu kula da shari'o'i biyu a cikin 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};

Amsa-Cunked Amsa

Yana da kyau a guji aika manyan saƙonni. Amsa da kwanciyar hankali na dukkan tsarin ya dogara da wannan. Idan amsar tambaya tana ɗaukar ƙwaƙwalwar ajiya mai yawa, to raba shi zuwa sassa ya zama dole.

Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

Bari in baku misalai guda biyu na irin wadannan lokuta:

  • Abubuwan da aka haɗa suna musayar bayanan binary, kamar fayiloli. Karɓar amsa cikin ƙananan sassa yana taimaka muku aiki da kyau tare da fayiloli na kowane girman kuma guje wa ambaton ƙwaƙwalwar ajiya.
  • Jerin sunayen. Misali, muna buƙatar zaɓar duk bayanan daga babban tebur a cikin ma'ajin bayanai kuma mu canza su zuwa wani sashi.

Ina kiran waɗannan martanin locomotive. A kowane hali, saƙonni 1024 na 1 MB sun fi saƙo guda ɗaya na 1 GB.

A cikin gungu na Erlang, muna samun ƙarin fa'ida - rage nauyi akan ma'aunin musayar da hanyar sadarwa, tunda an aika da amsa nan da nan zuwa ga mai karɓa, ta ƙetare wurin musayar.

Amsa tare da Buƙatun

Wannan sauye-sauyen da ba kasafai ba ne na tsarin RPC don gina tsarin maganganu.

Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

Publish-subscribe (bishiyar rarraba bayanai)

Tsarin abubuwan da ke gudana suna isar da su ga masu amfani da zaran an shirya bayanan. Don haka, tsarin sun fi dacewa da ƙirar turawa fiye da ja ko ƙirar zaɓe. Wannan fasalin yana ba ku damar guje wa ɓarna albarkatu ta hanyar buƙatu akai-akai da jiran bayanai.
Adadin ya nuna tsarin rarraba saƙo ga masu amfani da suka shiga wani takamaiman batu.

Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

Misalai na yau da kullun na amfani da wannan tsari shine rarraba jihar: duniyar wasan a cikin wasannin kwamfuta, bayanan kasuwa akan musayar, bayanai masu amfani a cikin bayanan bayanai.

Bari mu dubi lambar biyan kuɗi:

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.

Tushen na iya kiran aikin don buga saƙo a kowane wuri mai dacewa:

messaging:publish_message(Exchange, Key, Message).

Exchange - sunan wurin musayar,
key - maɓallin kewayawa
saƙon - kayatarwa

Juyar da Buga-biyan kuɗi

Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

Ta hanyar faɗaɗa mashaya-sub, zaku iya samun tsari mai dacewa don shiga. Saitin tushe da masu amfani na iya zama daban-daban. Adadin yana nuna shari'a tare da mabukaci ɗaya da maɓuɓɓuka masu yawa.

Tsarin rarraba ayyuka

Kusan kowane aiki ya ƙunshi ayyukan sarrafawa da aka jinkirta, kamar samar da rahotanni, isar da sanarwa, da dawo da bayanai daga tsarin ɓangare na uku. Za'a iya daidaita tsarin da ke aiwatar da waɗannan ayyuka cikin sauƙi ta hanyar ƙara masu sarrafawa. Abin da ya rage mana shi ne samar da gungun na'urori masu sarrafawa tare da rarraba ayyuka a tsakanin su.

Bari mu kalli yanayin da ya taso ta amfani da misalin masu sarrafa guda 3. Ko da a matakin rarraba ayyuka, tambaya game da adalci na rarrabawa da kuma cikar ma'aikata ya taso. Rarraba zagaye-robin zai kasance da alhakin adalci, kuma don guje wa halin da ake ciki na malala, za mu gabatar da ƙuntatawa. prefetch_limit. A cikin yanayi na wucin gadi prefetch_limit zai hana mai gudanarwa ɗaya karɓar duk ayyuka.

Saƙo yana sarrafa jerin gwano da fifikon sarrafawa. Masu sarrafawa suna karɓar ayyuka yayin da suke isowa. Aikin na iya gamawa cikin nasara ko kasawa:

  • messaging:ack(Tack) - ana kiran sa idan an yi nasarar sarrafa saƙon
  • messaging:nack(Tack) - kira a duk yanayin gaggawa. Da zarar an dawo da aikin, saƙo zai mika shi ga wani mai sarrafa shi.

Tubalan gini na aikace-aikacen da aka rarraba. Hanyar farko

A ce an sami gazawa mai rikitarwa yayin sarrafa ayyuka uku: processor 1, bayan karbar aikin, ya fado ba tare da samun lokacin ba da rahoton wani abu zuwa wurin musayar ba. A wannan yanayin, wurin musayar zai canja wurin aikin zuwa wani mai kula da shi bayan lokacin ƙarewa ya ƙare. Don wasu dalilai, ma'aikaci 3 ya watsar da aikin ya aika da sako, sakamakon haka, an mayar da aikin zuwa wani ma'aikaci wanda ya yi nasarar kammala shi.

Bayanin farko

Mun rufe ainihin tubalan ginin tsarin rarrabawa kuma mun sami ainihin fahimtar amfaninsu a Erlang/Elixir.

Ta hanyar haɗa samfuran asali, zaku iya gina hadaddun sifofi don magance matsalolin da suka kunno kai.

A cikin kashi na ƙarshe na jerin, za mu kalli batutuwan gabaɗaya na tsara ayyuka, sarrafawa da daidaitawa, da kuma yin magana game da fage mai amfani na scalability da rashin haƙuri na tsarin.

Karshen kashi na biyu.

Photography Marius Christensen
Abubuwan da aka shirya ta amfani da websequencediagrams.com

source: www.habr.com

Add a comment