Zomangamanga za ntchito zogawidwa. Njira yoyamba

Zomangamanga za ntchito zogawidwa. Njira yoyamba

Pomaliza nkhani Tidasanthula maziko amalingaliro a zomanga zokhazikika. Yakwana nthawi yoti tilankhule zakuyenda kwa data, njira zogwiritsira ntchito machitidwe a Erlang/Elixir ndi njira zotumizira mauthenga mwa iwo:

  • Pempho-yankho
  • Pemphani-Kuyankha Kwachulukidwe
  • Yankhani ndi Pempho
  • Sindikizani-lembetsani
  • Inverted Publish-subscribe
  • Kugawa ntchito

SOA, MSA ndi Mauthenga

SOA, MSA ndi zomanga zamakina zomwe zimatanthauzira malamulo omanga, pomwe mauthenga amapereka zoyambira pakukhazikitsa kwawo.

Sindikufuna kulimbikitsa izi kapena dongosolo la zomangamanga. Ndikogwiritsa ntchito njira zogwira mtima komanso zothandiza pazantchito ndi bizinesi inayake. Kaya tasankha paradigm, ndikwabwino kupanga midadada ndi diso pa Unix-way: zida zolumikizana pang'ono, zomwe zimayang'anira mabungwe. Njira za API zimagwira ntchito zosavuta zotheka ndi mabungwe.

Kutumizirana mameseji, monga momwe dzina limanenera, ndi broker wauthenga. Cholinga chake chachikulu ndi kulandira ndi kutumiza mauthenga. Ili ndi udindo wotumizira mauthenga, kupanga njira zomveka zotumizira uthenga mkati mwa dongosolo, mayendedwe ndi kusanja, komanso kukonza zolakwika pamlingo wadongosolo.
Mauthenga omwe tikupanga sikuyesera kupikisana nawo kapena kusintha rabbitmq. Zake zazikulu:

  • Kugawa.
    Mfundo zosinthira zimatha kupangidwa pamagulu onse amagulu, pafupi kwambiri ndi ma code omwe amawagwiritsa ntchito.
  • Kuphweka.
    Yang'anani pakuchepetsa nambala ya boilerplate komanso kugwiritsa ntchito mosavuta.
  • Kuchita bwino.
    Sitikuyesera kubwereza magwiridwe antchito a rabbitmq, koma tingowunikira zomanga ndi zoyendera, zomwe timalowa mu OTP mophweka momwe tingathere, kuchepetsa ndalama.
  • Kusinthasintha.
    Utumiki uliwonse ukhoza kuphatikiza ma tempulo ambiri osinthira.
  • Kukhazikika mwa kupanga.
  • Scalability.
    Mauthenga amakula ndi kugwiritsa ntchito. Pamene katundu akuwonjezeka, mukhoza kusuntha mfundo zosinthira kumakina amodzi.

Ndemanga. Pankhani ya ma code, ma meta-projects ndi oyenererana ndi machitidwe ovuta a Erlang/Elixir. Khodi yonse ya projekiti ili m'malo amodzi - projekiti ya ambulera. Nthawi yomweyo, ma microservices amakhala olekanitsidwa kwambiri ndipo amachita ntchito zosavuta zomwe zimakhala ndi gawo lina. Ndi njira iyi, n'zosavuta kusunga API ya dongosolo lonse, n'zosavuta kusintha, ndi bwino kulemba mayeso a unit ndi kuphatikiza.

Zigawo zamakina zimalumikizana mwachindunji kapena kudzera mwa broker. Kuchokera pamalingaliro a mauthenga, ntchito iliyonse ili ndi magawo angapo amoyo:

  • Kuyambitsa utumiki.
    Pakadali pano, njira yochitira ntchitoyo ndi zodalira zake zimakonzedwa ndikukhazikitsidwa.
  • Kupanga malo osinthira.
    Utumikiwu ukhoza kugwiritsa ntchito malo osinthira osasunthika omwe atchulidwa pamasinthidwe a node, kapena kupanga malo osinthira mwachangu.
  • Kulembetsa utumiki.
    Kuti utumiki upereke zopempha, uyenera kulembedwa pa malo osinthanitsa.
  • Kugwira ntchito mwachizolowezi.
    Ntchitoyi imapanga ntchito zothandiza.
  • Tsekani.
    Pali mitundu iwiri yoyimitsa yotheka: yabwinobwino komanso yadzidzidzi. Panthawi yogwira ntchito bwino, ntchitoyi imachotsedwa pamalo osinthira ndikuyimitsa. Pazifukwa zadzidzidzi, kutumizirana mameseji kumapereka imodzi mwazolemba zomwe zalephera.

Zikuwoneka zovuta kwambiri, koma code si yowopsa. Zitsanzo za ma code okhala ndi ndemanga zidzaperekedwa pakuwunika ma templates pambuyo pake.

Kusintha

Exchange point ndi njira yotumizirana mauthenga yomwe imagwiritsa ntchito malingaliro okhudzana ndi zigawo zomwe zili mkati mwa template ya mauthenga. M'zitsanzo zonse zomwe zili pansipa, zigawozo zimagwirizana kudzera m'malo osinthanitsa, kuphatikiza komwe kumapanga mauthenga.

Njira zosinthira mauthenga (MEPs)

Padziko lonse lapansi, njira zosinthira zitha kugawidwa m'njira ziwiri komanso njira imodzi. Yoyamba ikutanthauza kuyankha ku uthenga womwe ukubwera, womalizayo samayankha. Chitsanzo chodziwika bwino cha njira ziwiri pamapangidwe a kasitomala-server ndi Pempho-mayankhidwe. Tiyeni tiwone template ndi zosinthidwa zake.

Pempho-yankho kapena RPC

RPC imagwiritsidwa ntchito tikafunika kulandira yankho kuchokera munjira ina. Izi zitha kukhala zikuyenda pamtunda womwewo kapena kumayiko ena. Pansipa pali chithunzi cha kuyanjana pakati pa kasitomala ndi seva kudzera pa mauthenga.

Zomangamanga za ntchito zogawidwa. Njira yoyamba

Popeza kutumizirana mameseji ndikofanana, kwa kasitomala kusinthanitsa kumagawidwa m'magawo awiri:

  1. Kutumiza pempho

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

    kuwombola β€’ dzina lapadera la malo osinthira
    ResponseMatchingTag β€’ lebulo lapafupi kuti likonze yankho. Mwachitsanzo, potumiza zopempha zingapo zofanana za ogwiritsa ntchito osiyanasiyana.
    RequestDefinition - pempho thupi
    HandlerProcess - PID ya wothandizira. Njirayi ilandila yankho kuchokera ku seva.

  2. Kukonza yankho

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

    ResponsePayload - kuyankha kwa seva.

Kwa seva, njirayi ilinso ndi magawo awiri:

  1. Kuyambitsa malo osinthira
  2. Kukonza zopempha zolandilidwa

Tiyeni tifotokozere template iyi ndi code. Tiyerekeze kuti tikufunika kukhazikitsa ntchito yosavuta yomwe imapereka njira yeniyeni ya nthawi.

Kodi ya seva

Tiyeni tifotokozere API yautumiki mu 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{}
}).

Tiyeni tifotokozere woyang'anira ntchito mu 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.

Kodi kasitomala

Kuti mutumize pempho ku ntchitoyo, mutha kuyimbira API yofunsira mauthenga kulikonse mwa kasitomala:

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

Mu dongosolo logawidwa, kasinthidwe ka zigawozo zingakhale zosiyana kwambiri ndipo panthawi ya pempho, mauthenga sangayambe, kapena woyang'anira utumiki sadzakhala wokonzeka kutumikira pempho. Chifukwa chake, tiyenera kuyang'ana kuyankha kwauthenga ndikusamalira vuto lolephera.
Pambuyo potumiza bwino, kasitomala adzalandira yankho kapena cholakwika kuchokera pautumiki.
Tiyeni tigwire milandu yonseyi mu 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};

Pemphani-Kuyankha Kwachulukidwe

Ndi bwino kupewa kutumiza mauthenga aakulu. Kuyankha ndi kukhazikika kwadongosolo lonse kumadalira izi. Ngati kuyankha ku funso kumatenga kukumbukira kwambiri, ndiye kuti kuligawa m'magawo ndikofunikira.

Zomangamanga za ntchito zogawidwa. Njira yoyamba

Ndiroleni ndikupatseni zitsanzo zingapo za milandu yotere:

  • Zigawozo zimasinthanitsa deta ya binary, monga mafayilo. Kuphwanya yankho kukhala tizigawo tating'ono kumakuthandizani kuti muzigwira ntchito bwino ndi mafayilo amtundu uliwonse ndikupewa kukumbukira kusefukira.
  • Mndandanda. Mwachitsanzo, tifunika kusankha zolemba zonse kuchokera patebulo lalikulu la database ndikusamutsira ku gawo lina.

Ndimatcha mayankho awa kukhala locomotive. Mulimonsemo, mauthenga a 1024 a 1 MB ndi abwino kuposa uthenga umodzi wa 1 GB.

M'gulu la Erlang, timapeza phindu lina - kuchepetsa katundu pa malo osinthira ndi maukonde, popeza mayankho amatumizidwa nthawi yomweyo kwa wolandira, kudutsa malo osinthira.

Yankhani ndi Pempho

Uku ndikusintha kosowa kwa RPC pakupanga makina ochezera.

Zomangamanga za ntchito zogawidwa. Njira yoyamba

Sindikizani-lembetsani (mtengo wogawa deta)

Machitidwe oyendetsedwa ndi zochitika amawapereka kwa ogula deta ikangokonzeka. Chifukwa chake, machitidwe amakhala osavuta kutengera chitsanzo chokankhira kuposa kukoka kapena kuvotera. Izi zimakuthandizani kuti mupewe kuwononga zinthu mwakupempha nthawi zonse ndikudikirira deta.
Chithunzichi chikuwonetsa njira yogawira uthenga kwa ogula olembetsa mutu wakutiwakuti.

Zomangamanga za ntchito zogawidwa. Njira yoyamba

Zitsanzo zachikale zogwiritsira ntchito ndondomekoyi ndi kugawa kwa boma: dziko lamasewera mu masewera apakompyuta, deta yamalonda pa kusinthanitsa, mfundo zothandiza pazakudya za data.

Tiyeni tiwone khodi yolembetsa:

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.

Gwero likhoza kuyimbira ntchitoyi kuti ifalitse uthenga pamalo aliwonse abwino:

messaging:publish_message(Exchange, Key, Message).

kuwombola - dzina la malo osinthira,
Mfungulo - kiyi yolowera
uthenga - malipiro

Inverted Publish-subscribe

Zomangamanga za ntchito zogawidwa. Njira yoyamba

Mwa kukulitsa ma pub-sub, mutha kupeza njira yabwino yodula mitengo. Magwero ndi ogula akhoza kukhala osiyana kwambiri. Chithunzicho chikuwonetsa vuto ndi wogula m'modzi komanso magwero angapo.

Ndondomeko yogawa ntchito

Pafupifupi pulojekiti iliyonse imakhala ndi ntchito zochedwetsedwa, monga kupanga malipoti, kupereka zidziwitso, ndi kubweza deta kuchokera kumakina ena. Mayendedwe a dongosolo lomwe likuchita ntchitozi litha kukulitsidwa mosavuta powonjezera othandizira. Zomwe zatsala kwa ife ndikupanga gulu la mapurosesa ndikugawa mofananamo ntchito pakati pawo.

Tiyeni tiwone zochitika zomwe zimachitika pogwiritsa ntchito zitsanzo za 3 othandizira. Ngakhale pa gawo la kugawa ntchito, funso la chilungamo cha kugawa ndi kusefukira kwa ogwira ntchito limabuka. Kugawa kwa ma robin ozungulira kudzakhala ndi udindo wochita chilungamo, ndipo kuti tipewe kusefukira kwa ogwira ntchito, tidzakhazikitsa chiletso. prefetch_limit. M'malo osakhalitsa prefetch_limit zidzalepheretsa wogwira ntchito mmodzi kulandira ntchito zonse.

Kutumiza mauthenga kumayang'anira mizere ndikukonza zofunika kwambiri. Mapurosesa amalandira ntchito akamafika. Ntchitoyi ikhoza kumaliza bwino kapena kulephera:

  • messaging:ack(Tack) - wotchedwa ngati uthengawo wakonzedwa bwino
  • messaging:nack(Tack) - kuyitanidwa muzochitika zonse zadzidzidzi. Ntchitoyo ikabwezeretsedwa, mauthenga adzaperekedwa kwa wothandizira wina.

Zomangamanga za ntchito zogawidwa. Njira yoyamba

Tiyerekeze kuti kulephera kovuta kunachitika pokonza ntchito zitatu: purosesa 1, atalandira ntchitoyi, inagwa popanda nthawi yofotokozera chilichonse kumalo osinthanitsa. Pamenepa, malo osinthira adzasamutsa ntchitoyi kwa wothandizira wina pambuyo poti nthawi ya ack yatha. Pazifukwa zina, woyang'anira 3 adasiya ntchitoyo ndikutumiza nack; Zotsatira zake, ntchitoyi idasamutsidwanso kwa wothandizira wina yemwe adamaliza bwino.

Chidule choyambirira

Takambirana zoyambira zamakina ogawa ndikumvetsetsa momwe amagwiritsidwira ntchito mu Erlang/Elixir.

Mwa kuphatikiza machitidwe oyambira, mutha kupanga ma paradigm ovuta kuthana ndi mavuto omwe akubwera.

M'chigawo chomaliza cha mndandandawu, tiwona nkhani zambiri zakukonzekera mautumiki, mayendedwe ndi kusanja, komanso kukambirana za mbali yothandiza ya scalability ndi kulolerana kolakwa kwa machitidwe.

Kutha kwa gawo lachiwiri.

chithunzi Marius Christensen
Zithunzi zokonzedwa pogwiritsa ntchito websequencediagrams.com

Source: www.habr.com

Kuwonjezera ndemanga