Pomaliza
- 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.
Popeza kutumizirana mameseji ndikofanana, kwa kasitomala kusinthanitsa kumagawidwa m'magawo awiri:
-
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. -
Kukonza yankho
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)
ResponsePayload - kuyankha kwa seva.
Kwa seva, njirayi ilinso ndi magawo awiri:
- Kuyambitsa malo osinthira
- 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.
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.
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.
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
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 bwinomessaging:nack(Tack)
- kuyitanidwa muzochitika zonse zadzidzidzi. Ntchitoyo ikabwezeretsedwa, mauthenga adzaperekedwa kwa wothandizira wina.
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
Zithunzi zokonzedwa pogwiritsa ntchito websequencediagrams.com
Source: www.habr.com