Ievads AMQP protokolā
AMQP (Advanced Message Queuing Protocol) ir lietojumprogrammu slāņa standarta protokols, kas nodrošina vienotus ziņojumapmaiņas pakalpojumus un ir atvērts standarts lietojumprogrammu slāņa protokoliem, kas paredzēti uz ziņojumu orientētai starpprogrammatūrai. AMQP ir tīkla protokols asinhronu ziņojumu nodošanai starp procesiem.
Klienti un ziņojumu starpprogrammatūra, kas balstīta uz šo protokolu, var piegādāt ziņojumus bez ierobežojumiem ar dažādiem klientu/starpprogrammatūras produktiem, dažādām izstrādes valodām utt.
AMQP galvenās īpašības ir orientēts uz ziņojumu, rindā, maršrutēšana (ieskaitot vienādranga un publicēšanu / abonēšanu), uzticamība un drošība. AMQP nodrošina ziņojumu sniedzēju un klientu uzvedību, nodrošinot patiesu sadarbspēju starp dažādiem piegādātājiem.
AMQP un JMS
JMS bija mēģinājums standartizēt agrīnās ziņojumu starpprogrammatūru, tas tika standartizēts tikai API līmenī, un tas bija tālu no sadarbspējas radīšanas.
Atšķirībā no JMS, AMQP ir vadu līmeņa protokols, kas apraksta tīklā pārraidīto datu formātu, kas plūst baitos. Rezultātā jebkurš rīks, kas ievēro šo datu formātu, kas veido un interpretē ziņojumus, ir sadarbspējīgs ar citiem saderīgiem rīkiem.
AMQP serdes sastāvs
Ražotāju
Ražošanas jaunumi.
Savienojuma rūpnīca
Rūpnīca, kas ražo savienojumu.
Sakars
Savienojums, lietojumprogrammu tīkla savienojums ar Broker TCP/IP/Triple Handshake un Quad Wave.
AMQP savienojumi parasti ir gari savienojumi. AMQP ir lietojumprogrammu slāņa protokols, kas izmanto TCP, lai nodrošinātu uzticamu piegādi. AMQP izmanto autentifikācijas mehānismus un nodrošina TLS (SSL) aizsardzību. Kad lietojumprogrammai vairs nav nepieciešams izveidot savienojumu ar AMQP starpniekserveri, tai ir jāatbrīvo AMQP savienojums, nevis vienkārši jāizslēdz TCP savienojums.
Kanāls
Tīkla kanāls ir viegls savienojums, kas veidots uz savienojuma. Gandrīz visas darbības tiek veiktas kanālos, kas ir kanāli ziņojumu lasīšanai un rakstīšanai, un klienti var izveidot pārus katram kanālam, no kuriem katrs ir sesijas uzdevums.
Ja savienojums tiek salīdzināts ar optisko šķiedru kabeli, tad kanāla kanāls tiek salīdzināts ar vienu no optiskās šķiedras kabeļa šķiedrām. Savienojumā var izveidot jebkuru kanālu skaitu.
Lielākā daļa mūsu biznesa operāciju tiek veiktas kanāla saskarnē, tostarp:
- queueDeclare
- Slēdža apmaiņaDeklarēt
- queueBind queueBind
- Ziņojuma publicēšana pamataPublicēt
- Patērētāju ziņasbasicPatērēt utt.
Mākleris
Akceptējiet klienta savienojumu, lai ieviestu AMQP entītiju pakalpojumus, piemēram, rabbitmq.
VirtualHost (Web Hosting)
Virtuālais hostings, ko izmanto loģiskai izolācijai, virtuālajam resursdatoram var būt vairākas apmaiņas un rindas, un tam pašam virtuālajam resursdatoram nevar būt apmaiņas ar tādu pašu nosaukumu.
Lai ieviestu vairākas izolētas vides (lietotāji, lietotāju grupas, slēdži, rindas utt.) vienā starpniekserverī, AMQP nodrošina virtuālo resursdatoru (virtuālo resursdatoru - vhosts) jēdzienu. Tas ir ļoti līdzīgs Web serveru tīmekļa mitināšanas koncepcijai, kas nodrošina pilnīgi izolētu vidi AMQP entītijām. Kad savienojums ir izveidots, AMQP klients norāda, kuru virtuālo resursdatoru izmantot.
Apmaiņa
Slēdzis pieņem ziņojumus un nosūta ziņojumus uz saistīto rindu, pamatojoties uz maršrutēšanas atslēgu (bez ziņojumu glabāšanas iespējām).
Slēdzis ir AMQP entītija, ko izmanto ziņojumu sūtīšanai. Pēc tam, kad slēdzis saņem ziņojumu, tas maršrutē to uz vienu vai nulles rindu. Maršrutēšanas algoritmu, ko tā izmanto, nosaka slēdža veids un saistošie noteikumi.
Slēdža tips:
- Tieša apmaiņa
- Fanout apmaiņa
- Tēmu apmaiņa
- Galvenes apmaiņa
Slēdža rekvizīti:
- Nosaukums: slēdža nosaukums
- Izturība: noturības karodziņš, kas norāda, vai šis slēdzis ir noturīgs vai nē
- Automātiskā dzēšana: dzēst karodziņu, norādotKad visas rindas ir pabeigtas, izmantojot šo apmaiņu, vai tās ir izdzēstas
- Argumenti: atkarīgs no paša aģenta
Slēdža statuss:
Pastāvīgie slēdži pastāvēs pēc brokera restartēšanas, bet posma slēdži nebūs (tie būs jādeklarē atkārtoti pēc brokera atgriešanās tiešsaistē).
Noklusējuma slēdzis
Noklusējuma apmaiņa faktiski ir tieša apmaiņa, ko iepriekš deklarējis ziņojumu starpnieks un kurai nav nosaukuma (nosaukums ir tukša virkne).
Jūs varat domāt par noklusējuma slēdzi kā īpašu tieši pievienotu slēdzi. Noklusējuma slēdža nosaukums: Null virkne (AMQP noklusējums) Noklusējuma slēdža tips: tieši pievienots slēdzis
Veidojot rindu, kamēr nav norādīts saistošais slēdzis, tas tiks automātiski saistīts ar noklusējuma slēdzi, un saistījuma maršrutēšanas atslēgas nosaukums būs tāds pats kā rindas nosaukums.
Tiešs savienojums ar slēdzi
Tieši pievienots slēdzis piegādā ziņojumus atbilstošo saistīšanas atslēgu rindā, pamatojoties uz maršrutēšanas atslēgu, ko nes ziņojums. Unicast maršrutēšana, ko tiešais slēdzis izmanto ziņojuma apstrādei.
Veidojot rindu, ja tā ir saistīta ar tiešo slēdzi, tai nav jānorāda maršrutēšanas atslēgas nosaukums, jo tai būs noklusējuma maršrutēšanas atslēgas nosaukums, kas ir tāds pats kā rindas nosaukums.
Tieši pievienotu slēdžu rinda parasti sadala uzdevumus vairākiem patērētājiem cilpā (mēs to saucam par aptauju).
Darbplūsma:
- Saistot rindu ar slēdzi, dodiet tam saistīšanas atslēgu, pieņemot, ka R;
- Kad ziņojums ar maršrutēšanas atslēgu tiek nosūtīts uz tieši pievienotu slēdzi, slēdzis to maršrutē uz rindu ar maršrutēšanas atslēgu.
Ventilatora slēdži
Ventilatora slēdzis maršrutē ziņojumus uz visām rindām, kas tam ir saistītas, neatkarīgi no saistītās maršrutēšanas atslēgas.
Ja N rindas ir saistītas ar sektora slēdzi, kad ziņojums tiek nosūtīts uz šo sektora slēdzi, slēdzis nosūta ziņojuma kopiju uz visām N rindām atsevišķi. Ventilatora slēdži parasti tiek izmantoti, lai apstrādātu ziņojumu apraides maršrutēšanu.
Lietošanas scenāriji:
pārraidīt ziņojumus; Grupas tērzēšanas funkcija.
Dizaina slēdzis
Tēmas slēdzis nosūta ziņojumus uz vienu vai vairākām rindām atbilstoši maršrutēšanas atslēgai un Exchange tipam, un mēs to bieži izmantojam, lai ieviestu dažādas publicēšanas/abonēšanas, tas ir, publicētu abonementus.
Tieši pievienoto slēdžu maršrutēšanas kārtulas ir stingri saskaņotas, kas nozīmē, ka maršrutēšanas atslēgai ir jāatbilst saistošajai atslēgai pirms ziņojuma nosūtīšanas uz rindu. Tēmas slēdža maršrutēšanas noteikumi ir izplūdušas spēles, kuras var nodrošināt, izpildot dažus noteikumus, izmantojot aizstājējzīmes.
Tajā ir noteikts:
- Saistošajā taustiņā var būt divas speciālās rakstzīmes * un #, lai nodrošinātu izplūdušu atbilstību. kur * tiek izmantots, lai atbilstu vārdam, #用于匹配多个单词 (var būt nulle)
- Maršrutēšanas atslēga ir ar punktiem atdalīta virkne (katru atsevišķu virkni, kas atdalīta ar punktu atzīmi, mēs saucam par vārdu)
- Kad producents nosūta ziņojumu Routing Key=A.A.A, tikai A.*.* ir apmierināts, un tas tiks maršrutēts tikai uz rindu1.
- Kad producents nosūta ziņojumu Routing Key=A.B.A, atbilstošie A.*.* un *.B.* tiks novirzīti uz rindu1 un rindu2.
- Kad producents nosūta ziņojumu Routing Key=A.B.C, tad A.*.* un *.B.* un *.* ir apmierināti. C tiek maršrutēts uz rindu1, rindu2, rindu3.
Lietošanas scenāriji:
- ziņu atjauninājumi, kas saistīti ar kategorijām vai tagiem;
- Fona uzdevumi, ko veic vairāki darbinieki, no kuriem katrs ir atbildīgs par konkrētu uzdevumu izpildi.
Galvas slēdzis
Galvenes slēdži nepaļaujas uz maršrutēšanas atslēgas atbilstības kārtulām, lai saistītu atslēgas maršruta ziņojumiem, bet gan atbilst, pamatojoties uz galvenes atribūtu nosūtītā ziņojuma saturā.
Galvas slēdžus var uzskatīt par vēl vienu tieši pievienota slēdža izpausmi. Tomēr tiešā slēdža maršrutēšanas atslēgai jābūt virknei, un galvenes atribūta vērtības tas neierobežo, tās var būt pat veseli skaitļi vai jaucējvērtības (vārdnīcas) utt. Lielāka elastība (bet praksē mēs reti izmantojam galvas slēdžus).
Darbplūsma:
- Ja rinda ir saistīta ar galvenes slēdzi, vairākas galvenes tiek saistītas vienlaicīgi, lai tās atbilstu.
- Ienākošajiem ziņojumiem ir galvene un parametrs "x-match". Ja "x-match" ir iestatīts uz "any", var saskaņot jebkuru galvenes vērtību, un, ja "x-match" ir iestatīts uz "all", visām galvenes vērtībām ir jābūt saskaņotām.
Pārslēgt kopsavilkumu
Saistoši
Virtuālais savienojums starp Exchange un rindu.
BindingKey ir Exchange un rindu saistījumu kārtulas apraksts. Saistīšanas atslēga norāda, kāda veida maršrutēšanas atslēga tiks piešķirta pašreizējai saistītajai rindai pašreizējā biržā.
Maršrutēšanas atslēga
Maršrutēšanas kārtulas, kuras virtuālā mašīna var izmantot, lai noteiktu, kā maršrutēt konkrētu ziņojumu.
Saistīšanas atslēga pret maršrutēšanas atslēgu
- Saistīšanas atslēga ir saistīšanas atslēga starp rindu un slēdzi;
- Maršrutēšanas atslēga ir informācija, ko producents nosūta slēdzim;
- Kad saistīšanas atslēga un maršrutēšanas atslēga sakrīt, ievietojiet ziņojumu atbilstošajā rindā.
Saistošā atslēga ir Exchange un rindas saistīšanas noteikumu apraksts, kas tiek izmantots, lai parsētu, kad Exchange saņem ziņojumu, Exchange saņemtajam ziņojumam būs maršrutēšanas atslēgas lauks, un Exchange saskaņo šo maršrutēšanas atslēgu ar visām pašreizējā Exchange saistošajām atslēgām, un, ja prasības ir izpildītas, tā tiks nosūtīta uz saistīšanu Atslēga ir saistīta ar rindu, lai nosūtītu ziņojumu.
Saistīšanas atslēga pret maršrutēšanas atslēgu dažādos slēdžos
Noklusējuma slēdzis: saistīšanas atslēga ir rindas nosaukums, kuru nevar pielāgot. Maršrutēšanas atslēga ir arī rindas nosaukums, pirms to var veiksmīgi maršrutēt uz rindu Tiešā savienojuma slēdzis: saistīšanas atslēga ir rindas nosaukums, kuru var pielāgot. Maršrutēšanas atslēgas var veiksmīgi maršrutēt uz rindu tikai tad, ja saistīšanas atslēga ir vienāda Ventilatora slēdzis: Nav saistošas atslēgas; Protams, nav maršrutēšanas atslēgas. Automātiski maršrutēts uz visām rindām, kas saistītas ar slēdzi Tēmas slēdzis: pielāgots saistīšanas taustiņš; Pielāgojiet maršrutēšanas atslēgu. Maršrutēšanas atslēga== Saistīšanas atslēga, un izplūdušā atbilstība ir veiksmīgi jānovirza uz rindu Galvas slēdzis: nav saistošas atslēgas; Protams, nav maršrutēšanas atslēgas. Atbilst, pamatojoties uz galvenes atribūtu nosūtītā ziņojuma saturā
Rindu
Saglabā ziņojumus, kurus drīzumā patērēs programma.
Rindas rekvizīti:
- Nosaukums: rindas nosaukums
- Ilgstošs: rinda joprojām pastāv pēc ziņojumu starpnieka restartēšanas
- Ekskluzīvs: tiek izmantots tikai vienam savienojumam, un rinda tiek izdzēsta, kad savienojums tiek slēgts
- Automātiska dzēšana: tiek dzēsta, kad pēdējais patērētājs atsakās no abonementa
- Argumenti: Daži ziņojumu brokeri to izmanto, lai veiktu dažas papildu funkcijas, kas līdzīgas TTL
Rindas izveide: Rindas var izmantot tikai pēc to deklarēšanas. Ja rinda vēl nepastāv, tā tiek izveidota, deklarējot rindu. Ja deklarētā rinda jau pastāv un atribūti ir identiski, deklarācija neietekmē sākotnējo rindu. Ja deklarācijas atribūti atšķiras no esošajā rindā esošajiem atribūtiem, tiek izmests kanāla līmeņa izņēmums ar kļūdas kodu 406.
Rindas noturība: Noturības rinda tiek glabāta diskā un paliek tur, kad brokeris tiek restartēts. Rindas, kas netiek saglabātas, tiek sauktas par īslaicīgām rindām. Ne visiem scenārijiem un gadījumiem ir nepieciešama rindas noturība.
Pastāvīga rinda nepadara uz to maršrutētos ziņojumus pastāvīgus. Ja ziņojumu aģents uzkaras un tiek restartēts, noturības rinda tiks atkārtoti deklarēta restartēšanas laikā, un jebkurā gadījumā var atkārtoti atjaunot tikai pastāvīgos ziņojumus.
Patērētājs
Patērētāju patēriņa ziņas. AMQP ir divi veidi, kā patērētāji var saņemt gaidāmos ziņojumus:
Ziņojumu starpprogrammatūra piegādā ziņojumus patērētājiem (push API) Patērētāji aktīvi saņem ziņojumus (pull API) Piezīme: Ja vairāki patērētāji klausās vienu un to pašu rindu, rindā esošos ziņojumus patērēs tikai viens no patērētājiem (ne vienu reizi katram patērētājam)
Ziņa
Dati, kas tiek pārsūtīti starp ziņojumiem, pakalpojumiem un lietojumprogrammām, sastāv no rekvizītiem un ķermeņiem.
Atribūti modificē ziņojumus, piemēram, ziņojuma prioritāti, aizkavi un citus papildu līdzekļus, un galvenais pamatteksts ir ziņojuma pamatteksta saturs.
Ziņojuma rekvizīti:
- Satura veids
- Satura kodēšana
- Maršrutēšanas atslēga
- Piegādes veids (pastāvīgs vai nē)
- Piegādes veids (pastāvīgs vai nepastāvīgs)
- Ziņojuma prioritāte
- Ziņojumu publicēšanas laikspiedols
- Derīguma termiņš
- Publisher lietojumprogrammas ID
Ziņojuma pamatteksts: Papildus atribūtiem AMQP ziņojumos ir arī lietderīgā slodze (dati, ko ziņojums faktiski pārvadā), ko AMQP starpniekserveris uzskata par necaurspīdīgu baitu masīvu.
Ziņojumu starpnieks nepārbauda un nemaina lietderīgo slodzi. Ziņojumos var būt tikai atribūti, neveicot lietderīgo kravu. Tas parasti izmanto datus sērijveida formātā, piemēram, JSON, un, lai ietaupītu naudu, protokola buferi un MessagePacks serializēs strukturētos datus publicēšanai kā ziņojumu lietderīgo slodzi. AMQP un tā kolēģi parasti izmanto "satura tipa" un "satura kodēšanas" laukus, lai sazinātos ar ziņojumiem, lai identificētu derīgās slodzes, bet tas ir balstīts tikai uz konvencijām.
Ziņojuma noturība: Ziņojumi tiek publicēti pastāvīgi, un AMQP aģents saglabā šo ziņojumu diskā. Ja serveris tiek restartēts, sistēma apstiprina, ka saņemtais noturības ziņojums nav zaudēts.
Vienkārša ziņojuma nosūtīšana uz pastāvīgu slēdzi vai maršrutēšana uz pastāvīgu rindu nepadara ziņojumu pastāvīgu: ziņojuma noturība ir pilnībā atkarīga no paša ziņojuma noturības režīma.
Pastāvīga ziņojumu publicēšana var ietekmēt veiktspēju.
AMQP darba process
Izdevējs publicē ziņojumu, izmantojot Exchange.
Slēdzis izplata ienākošos ziņojumus rindā, kas saistīta ar slēdzi, saskaņā ar maršrutēšanas kārtulām.
Visbeidzot, AMQP aģents piegādās ziņojumu patērētājam, kurš ir abonējis šo rindu, vai arī patērētājs to saņems pats pēc vajadzības.
AMQP ziņojumapmaiņas mehānisms
Ziņojuma apstiprinājums
Patērētāji dažkārt neapstrādā ziņojumus vai dažreiz avarē tieši. Un tīkla iemesli var izraisīt arī dažādas problēmas. Tas rada mums jautājumu par to, kad ir īstais laiks AMQP aģentiem dzēst ziņojumus.
AMQP divi ziņojumu apstiprinājuma režīmi:
Automātiskās apstiprināšanas režīms: izdzēsiet ziņojumu, tiklīdz ziņojuma starpprogrammatūra to nosūta patērētājam. (Izmantojot AMQP metodi: basic.deliver vai basic.get-ok) Nepārprotama apstiprinājuma režīms: pirms ziņojuma dzēšanas uzgaidiet, līdz patērētājs nosūtīs apstiprinājumu. (Izmantojot AMQP metodi: basic.ack) Ja patērētājs uzkarina, nenosūtot apstiprinājuma kvīti, AMQP aģents atkārtoti piegādā ziņojumu citam patērētājam. Ja tajā laikā nav pieejamu patērētāju, ziņojumu starpnieks gaida, kamēr nākamais patērētājs reģistrēsies šajā rindā, un pēc tam mēģina piegādāt vēlreiz.
Ziņojumu noraidīšana
Kad patērētājs saņem ziņojumu, apstrādes process var būt veiksmīgs vai neveiksmīgs. Patērētājs var norādīt ziņojumu starpniekam (ziņojumu starpprogrammatūrai), ka ziņojumu neizdevās apstrādāt (vai šajā brīdī neizdevās pabeigt) "noraidītā ziņojuma" dēļ. Kad ziņojums tiek noraidīts, patērētājs var pateikt ziņojumu brokerim, ko darīt ar ziņojumu - iznīcināt to vai ievietot atpakaļ rindā.
Ja šajā rindā ir tikai viens patērētājs, pārliecinieties, ka ziņojums netiek noraidīts un izvēlaties to ievietot atpakaļ rindā, izraisot ziņojuma cilpu uz nenoteiktu laiku vienam un tam pašam patērētājam.
AMQP metode basic.reject tiek izmantota, lai veiktu ziņojumu noraidīšanas darbību. Tomēr basic.reject ir ierobežojums: jūs to nevarat izmantot, lai noraidītu vairākus ziņojumus ar apstiprinājumiem. Bet, ja izmantojat RabbitMQ, varat izmantot AMQP 0-9-1 paplašinājumu, ko sauc par negatīviem apstiprinājumiem (saukti arī par nacks), lai atrisinātu šo problēmu.
Sākotnējā:Hipersaites pieteikšanās ir redzama.
|