Waagii hore
- 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.
Maaddaama fariintu ay gebi ahaanba isku mid tahay, macmiilka beddelka waxa loo qaybiyaa 2 weji:
-
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. -
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:
- Bilowga barta sarrifka
- 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.
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.
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.
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
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 shaqeeyaymessaging:nack(Tack)
- loogu yeero dhammaan xaaladaha degdegga ah. Marka hawsha la soo celiyo, fariintu waxay u gudbin doontaa hawlwadeen kale.
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
Sawirada lagu diyaariyay iyadoo la isticmaalayo websequencediagrams.com
Source: www.habr.com