Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Waagii hore maqaal Waxaan baarnay aasaaska aragtiyeed ee naqshadaha falcelinta. Waa waqtigii laga hadli lahaa qulqulka xogta, siyaabaha loo hirgeliyo hababka Erlang/Elixir fal-celiska ah iyo qaababka fariimaha dhexdooda:

  • Codsi-jawaab
  • Jawaabta-Codsiga la gooyay
  • Ka jawaab Codsiga
  • Publish-subscribe
  • Daabacaada-subscribe-soo-noqoshada
  • Qaybinta hawsha

SOA, MSA iyo Fariimaha

SOA, MSA waa qaab-dhismeedyo hab-dhismeedyo qeexaya xeerarka hab-dhisidda, halka farriimaha ay bixinayaan aasaaska dhaqangelintooda.

Ma rabo inaan kor u qaado kan ama nidaamkaas qaab dhismeedka. Waxaan ahay isticmaalka hababka ugu waxtarka badan uguna faa'iidada badan mashruuc gaar ah iyo ganacsi. Qaab kasta oo aan doorano, way fiicantahay in la abuuro blocks nidaamka iyada oo isha lagu hayo Unix-way: qaybaha isku xirnaanta ugu yar, mas'uul ka ah hay'adaha gaarka ah. Hababka API waxay ku fuliyaan ficillada ugu fudud ee suurtogalka ah ee hay'adaha.

Fariintu waa, sida magacu tilmaamayo, dilaal fariin ah. Ujeeddadeeda ugu weyn waa in la helo oo la diro fariimaha. Waxay mas'uul ka tahay isku-xirnaanta dirida macluumaadka, samaynta khadadka macquulka ah ee gudbinta macluumaadka ee nidaamka, dajinta iyo dheelitirka, iyo sidoo kale maaraynta qaladka ee heerka nidaamka.
Farriinta aan horumarinayna iskuma dayno inaan la tartanno ama beddelno rabbitmq. Tilmaamaheeda ugu muhiimsan:

  • Qaybinta.
    Dhibcaha isdhaafsiga ayaa laga abuuri karaa dhammaan qanjidhada kooxda, sida ugu dhow ee suurtogalka ah ee koodka isticmaala.
  • Fudud
    Diirada saar yaraynta koodka boodhka iyo fududaynta isticmaalka.
  • Waxqabadka wanaagsan.
    Isku day mayno inaan ku celino shaqaynta rabbitmq, laakiin waxaynu muujinaynaa kaliya lakabka qaab dhismeedka iyo gaadiidka, kaas oo aanu ku haboonayno OTP sida ugu fudud ee suurtogalka ah, yaraynta kharashaadka.
  • Dabacsanaan.
    Adeeg kastaa wuxuu isku dari karaa qaabab badan oo wax-is-weydaarsi ah.
  • U adkaysiga naqshadeynta.
  • Miisaanka.
    Fariintu waxay la korodhaa codsiga. Marka uu culeysku kordho, waxaad u wareejin kartaa dhibcaha sarrifka mashiinnada gaarka ah.

Faallo. Marka la eego ururka koodka, mashruucyada-mashruucyada-mashruucyada ayaa si fiican ugu habboon nidaamyada Erlang/Elixir ee kakan. Dhammaan koodka mashruucu wuxuu ku yaalaa hal kayd - mashruuc dallad. Isla mar ahaantaana, adeegaha yar yar ayaa inta ugu badan go'doonsan oo waxay qabtaan hawlo fudud oo ka masuul ah cid gaar ah. Habkan, way fududahay in la ilaaliyo API-ga nidaamka oo dhan, way fududahay in la sameeyo isbeddel, way ku habboon tahay in la qoro cutubyada iyo imtixaannada isdhexgalka.

Qaybaha nidaamku waxay si toos ah ula falgalaan ama u maraan dilaal. Marka laga eego dhanka fariinta, adeeg kastaa waxa uu leeyahay dhawr waji oo nololeed:

  • Bilawga adeega
    Marxaladdan, habka iyo ku-tiirsanaanta fulinta adeegga waa la habeeyey oo la bilaabay.
  • Abuuritaanka barta sarrifka.
    Adeeggu wuxuu isticmaali karaa barta isdhaafsiga ee taagan ee ku qeexan qaabeynta noodhka, ama wuxuu u abuuri karaa dhibco isweydaarsiga si firfircoon.
  • Diiwaangelinta adeegga.
    Si adeeggu ugu adeego codsiyada, waa in laga diwaan galiyo barta sarrifka.
  • Shaqada caadiga ah.
    Adeeggu wuxuu soo saaraa shaqo faa'iido leh.
  • Bakhtii.
    Waxaa jira 2 nooc oo xirid ah oo suurtagal ah: caadi iyo xaalad degdeg ah. Inta lagu jiro hawlgalka caadiga ah, adeeggu waa laga gooyaa barta sarrifka oo joogsada. Xaaladaha degdega ah, fariintu waxay fulisaa mid ka mid ah qoraallada guul-darraystay.

Waxay u egtahay mid aad u adag, laakiin koodka maaha mid cabsi leh. Tusaalooyinka koodka oo leh faallooyin ayaa lagu bixin doonaa falanqaynta qaab-dhismeedka wax yar ka dib.

bedasha

Meesha isweydaarsigu waa habsocod farimo ah oo fulisa macquulnimada isdhexgalka ee qaybaha ku jira qaabka fariimaha. Dhammaan tusaalooyinka hoos lagu soo bandhigay, qaybuhu waxay isdhexgalaan iyada oo loo marayo dhibcaha sarrifka, isku-darka kuwaas oo sameeya farriimaha.

Qaababka is dhaafsiga fariimaha (MEPs)

Caalam ahaan, qaababka wax-is-weydaarsiga waxaa loo qaybin karaa laba-dhinac iyo hal-jid. Midda hore waxay ka dhigan tahay jawaab celinta farriinta soo socota, kan dambe ma sameeyo. Tusaalaha caadiga ah ee qaabka laba-geesoodka ah ee dhismaha macmiilka-server waa qaabka jawaabta Codsiga. Bal aan eegno qaabka iyo wax ka beddelkiisa.

Codsiga-jawaab ama RPC

RPC waxa la isticmaalaa marka aan u baahanahay in aan jawaab ka helno hab kale. Habkani waxa laga yaabaa inuu ku socdo isla nood ama ku yaal qaarad kale. Hoos waxaa ku yaal jaantuska isdhexgalka u dhexeeya macmiilka iyo serverka iyada oo la adeegsanayo fariinta.

Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Maaddaama fariintu ay gebi ahaanba isku mid tahay, macmiilka beddelka waxa loo qaybiyaa 2 weji:

  1. Soo dir codsi

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

    Exchange - Magaca gaarka ah ee barta sarrifka
    ResponseMatchingTag - summada deegaanka ee habaynta jawaabta. Tusaale ahaan, xaalada dirida dhawr codsi oo isku mid ah oo ay leeyihiin isticmaalayaasha kala duwan.
    Codsiga Qeexida - codsiga jirka
    Habka Handler - PID ee maamulaha. Habkani wuxuu jawaab ka heli doonaa server-ka.

  2. Hagaajinta jawaabta

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

    ResponsePayload - jawaabta server-ka.

Seerfarka, nidaamku wuxuu kaloo ka kooban yahay 2 weji:

  1. Bilowga barta sarrifka
  2. Hagaajinta codsiyada la helay

Aan ku sawirno template-ka kood. Aynu nidhaahno waxaan u baahanahay inaan hirgelino adeeg fudud oo bixiya hal hab oo sax ah.

Koodhka server-ka

Aynu ku qeexno adeegga API ee 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{}
}).

Aynu ku qeexno maamulaha adeegga 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.

Koodhka macmiilka

Si aad codsi ugu dirto adeegga, waxaad wici kartaa codsiga fariimaha API meel kasta oo macmiilka ah:

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

Nidaamka la qaybiyey, qaabaynta qaybaha aad ayey u kala duwanaan kartaa oo wakhtiga codsiga, fariintu ma bilaabmi karto, ama maamulaha adeeggu diyaar uma noqon doono inuu u adeego codsiga. Sidaa darteed, waxaan u baahanahay inaan hubino jawaabta fariimaha oo aan wax ka qabano kiiska guuldarada.
Kadib diritaanka guusha leh, macmiilku wuxuu heli doonaa jawaab ama qalad adeega.
Aynu ku xalinno labada xaaladood ee 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};

Jawaabta-Codsiga la gooyay

Waxaa fiican inaad iska ilaaliso dirista fariimaha waaweyn. Ka jawaab celinta iyo hawlgalka xasilloon ee nidaamka oo dhan waxay ku xiran tahay tan. Haddii jawaabta su'aashu ay qaadato xusuus badan, markaa qaybo loo qaybiyo waa qasab.

Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Aan ku siiyo dhawr tusaale oo ka mid ah xaaladahan oo kale:

  • Qaybuhu waxay isweydaarsadaan xogta binary, sida faylasha. U jajabinta jawaabta qaybo yaryar waxay kaa caawinaysaa inaad si hufan ugu shaqeyso faylasha cabbir kasta oo aad ka fogaato qulqulka xusuusta.
  • Liisaska Tusaale ahaan, waxaan u baahannahay inaan ka dooranno dhammaan diiwaannada miis weyn oo ku jira keydka xogta oo aan u wareejinno qayb kale.

Jawaabahaan waxaan ugu yeeraa kuwo lugeynaya. Si kastaba ha ahaatee, 1024 farriimaha 1 MB ayaa ka wanaagsan hal fariin oo 1 GB ah.

Kooxda Erlang, waxaan helnaa faa'iido dheeraad ah - yareynta culeyska barta sarrifka iyo shabakada, maadaama jawaabaha isla markiiba loo diro qaataha, iyada oo laga gudbo barta sarrifka.

Ka jawaab Codsiga

Tani waa wax ka beddel naadir ah oo lagu sameeyo qaabka RPC ee lagu dhisayo nidaamyada wada hadalka.

Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Publish-subscribe (geedka qaybinta xogta)

Nidaamyada ay wadaan dhacdooyinka waxay u gudbiyaan macaamiisha isla marka xogta la diyaariyo. Markaa, nidaamyadu waxay aad ugu nugul yihiin qaabka riixitaanka marka loo eego qaabka jiidista ama qaabka codbixinta. Habkani wuxuu kuu ogolaanayaa inaad iska ilaaliso inaad lumiso kheyraadka adigoo si joogto ah u codsanaya oo sugaya xogta.
Jaantusku waxa uu tusinayaa habka loo qaybiyo fariinta macaamiishu ku biireen mawduuc gaar ah.

Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Tusaalooyinka caadiga ah ee isticmaalka qaabkan waa qaybinta gobolka: adduunka ciyaaraha ee ciyaaraha kombuyuutarka, xogta suuqa ee sarrifka, macluumaadka waxtarka leh ee xogta quudinta.

Aynu eegno summada macaamiisha:

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.

Isha ayaa wici karta shaqada si ay fariin ugu daabacdo meel kasta oo ku haboon:

messaging:publish_message(Exchange, Key, Message).

Exchange - magaca barta sarrifka,
Key - furaha dariiqa
Message - xamuulka

Daabacaada-subscribe-soo-noqoshada

Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Adiga oo balaadhinaya pub-sub, waxaad heli kartaa qaab ku habboon in la gooyo. Qaabka ilaha iyo macaamiishu gabi ahaanba way kala duwanaan karaan. Jaantusku wuxuu muujinayaa kiis leh hal macaamiil iyo ilo badan.

Habka qaybinta hawsha

Ku dhawaad ​​mashruuc kastaa waxa uu ku lug leeyahay hawlaha habaynta ee dib loo dhigay, sida soo saarista warbixinada, gaadhsiinta ogaysiisyada, iyo ka soo celinta xogta nidaamka cid saddexaad. Soo saarista nidaamka fulinaya hawlahan si fudud ayaa loo miisaami karaa iyadoo lagu darayo maamulayaal. Waxa inoo hadhsan waa in aan samayno koox processor-ro ah oo aan si siman u qaybinno hawsha dhexdooda.

Aynu eegno xaaladaha soo baxa annaga oo tusaale u soo qaadanayna 3 qof oo gacanta ku haya. Xataa marka lagu jiro marxaladda shaqo qaybinta, su'aasha ah caddaaladda wax qaybsiga iyo qulqulka hawl-wadeennada ayaa soo baxaysa. Qaybinta wareega wareega ah ayaa mas'uul ka noqon doonta cadaaladda, iyo si looga fogaado xaalad buux dhaafka maamulayaasha, waxaan soo bandhigi doonaa xaddidaad prefetch_limit. Xaaladaha ku meel gaadhka ah prefetch_limit waxay ka hortagi doontaa hal maamule inuu helo dhammaan hawlaha.

Fariintu waxay maamushaa safafka iyo mudnaanta habaynta. Soo-saareyaashu waxay helaan hawlo markay yimaadaan. Hawshu waxay ku dhammayn kartaa si guul leh ama way fashilmi kartaa:

  • messaging:ack(Tack) - la wac haddi fariinta si guul leh looga shaqeeyay
  • messaging:nack(Tack) - loogu yeero dhammaan xaaladaha degdegga ah. Marka hawsha la soo celiyo, fariintu waxay u gudbin doontaa hawlwadeen kale.

Qaybaha dhismaha ee codsiyada la qaybiyey. Habka koowaad

Ka soo qaad in fashil adagi uu dhacay iyadoo la guda galayo saddex hawlood oo kala ah: Processor 1, ka dib markii uu hawshii helay, wuu shilmay, isaga oo aan wakhti u helin in uu wax war ah ka soo sheego goobta la isku dhaafsado. Xaaladdan oo kale, barta sarrifka ayaa u wareejin doonta hawsha maamule kale ka dib marka wakhtigu dhammaado. Sababta qaar awgeed, maamulaha 3 wuu ka tagay hawshii oo dirqi ayuu u diray; natiijadii, hawshii sidoo kale waxaa loo wareejiyay maamule kale oo si guul leh u dhammaystiray.

Soo koobid hordhac ah

Waxaan daboolnay dhismooyinka aasaasiga ah ee nidaamyada la qaybiyey waxaanan helnay faham aasaasi ah oo ku saabsan isticmaalkooda Erlang/Elixir.

Marka la isku daro qaababka aasaasiga ah, waxaad dhisi kartaa jaangooyooyin adag si aad u xalliso dhibaatooyinka soo baxaya.

Qeybta ugu dambeysa ee taxanaha, waxaan ku eegi doonaa arrimaha guud ee abaabulka adeegyada, habaynta iyo isu dheelitirka, sidoo kale waxaan ka hadli doonaa dhinaca wax ku oolka ah ee miisaanka iyo u dulqaadashada nidaamka.

Dhamaadka qeybta labaad.

Sawir Marius Christensen
Sawirada lagu diyaariyay iyadoo la isticmaalayo websequencediagrams.com

Source: www.habr.com

Add a comment