Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 3797|Răspunde: 0

Explicație detaliată a protocolului AMQP

[Copiază linkul]
Postat pe 14.08.2022 23:22:55 | | | |
Introducere în protocolul AMQP

AMQP (Advanced Message Queuing Protocol) este un protocol standard la nivel de aplicație care oferă servicii de mesagerie unificată și este un standard deschis pentru protocoalele la nivel de aplicație concepute pentru middleware orientat pe mesaje. AMQP este un protocol de rețea pentru transmiterea mesajelor asincrone între procese.

Clienții și middleware-ul de mesaje bazate pe acest protocol pot livra mesaje fără a fi restricționate de diferite produse client/middleware, limbaje de dezvoltare diferite etc.

Principalele caracteristici ale AMQP sunt orientarea pe mesaje, coada în coadă, rutarea (inclusiv peer-to-peer și publish/subscribe), fiabilitatea și securitatea. AMQP impune comportamentul furnizorilor de mesaje și al clienților, permițând o interoperabilitate reală între diferiți furnizori.

AMQP și JMS

JMS a fost o încercare de a standardiza middleware-ul timpuriu de mesaje, fiind standardizat doar la nivel de API și fiind departe de a crea interoperabilitate.

Spre deosebire de JMS, AMQP este un protocol la nivel de fir care descrie formatul datelor transmise printr-o rețea, circulând în octeți. Ca urmare, orice instrument care respectă acest format de date, care creează și interpretează mesaje, este interoperabil cu alte instrumente compatibile.

Compoziția nucleului AMQP



Producător

Știri despre producție.

ConnectionFactory

Fabrica care produce Connection.

Conexiune

Conexiune, conexiune de rețea de aplicații cu Broker TCP/IP/Triple Handshake și Quad Wave.

Conexiunile AMQP sunt de obicei conexiuni lungi. AMQP este un protocol la nivel de aplicație care folosește TCP pentru a oferi livrare fiabilă. AMQP folosește mecanisme de autentificare și oferă protecție TLS (SSL). Când o aplicație nu mai trebuie să se conecteze la proxy-ul AMQP, trebuie să elibereze în mod grațios conexiunea AMQP, în loc să oprească pur și simplu conexiunea TCP.

Canal

Canalul de rețea este o conexiune ușoară construită peste conexiune. Aproape toate operațiunile se realizează în Canale, care sunt canale pentru citirea și scrierea mesajelor, iar clienții pot stabili perechi pentru fiecare canal, fiecare reprezentând o sarcină de sesiune.

Dacă conexiunea este comparată cu un cablu de fibră optică, atunci canalul canalului este comparat cu una dintre fibrele dintr-un cablu de fibră optică. Orice număr de canale pot fi create pe o conexiune.

Majoritatea operațiunilor noastre de afaceri se desfășoară în interfața Canalului, inclusiv:


  • queueDeclare
  • ExchangeDeclare pentru comutator
  • queueBind queueBind
  • Publică mesajul de bazăPublică
  • Știri pentru consumatori, Consum, etc.



Broker

Acceptă conexiunea clientului pentru a implementa serviciile entității AMQP, cum ar fi rabbitmq.

VirtualHost (găzduire web)

Găzduirea virtuală, folosită pentru izolare logică, o gazdă virtuală poate avea mai multe schimburi și cozi, iar aceeași gazdă virtuală nu poate avea schimburi cu același nume.

Pentru a implementa mai multe medii izolate (utilizatori, grupuri de utilizatori, switch-uri, cozi etc.) pe un singur proxy, AMQP oferă conceptul de gazde virtuale (gazde virtuale - vhosts). Acest lucru este foarte asemănător cu conceptul de găzduire web servere, care oferă un mediu complet izolat pentru entitățile AMQP. Când conexiunea este stabilită, clientul AMQP specifică ce gazdă virtuală să folosească.

Schimb

Switch-ul acceptă mesaje și trimite mesaje către coada legată pe baza cheii de rutare (fără capacitate de stocare a mesajelor).

Un comutator este o entitate AMQP folosită pentru a trimite mesaje. După ce switch-ul primește un mesaj, îl direcționează către una sau zero cozi. Algoritmul de rutare pe care îl folosește este determinat de tipul comutatorului și de regulile de legare.

Tip de comutator:


  • Schimb direct
  • Schimb de fanout-uri
  • Schimb de subiecte
  • Schimb de antete



Proprietăți ale switch-ului:

  • Nume: Numele switch-ului
  • Durabilitate: Un indicator de persistență care indică dacă acest comutator este menținut sau nu
  • Ștergere automată: Steagul de ștergere, indicândCând toate cozile se termină folosind acest schimb, dacă acestea sunt șterse sau nu
  • Argumente: Depinde de agentul în sine


Starea schimbării:

  • Durabil
  • Trecător


Switch-urile persistente vor exista după ce brokerul este repornit, în timp ce switch-urile staging nu vor exista (vor trebui redeclarate după ce brokerul este din nou online).


Comutator implicit

Schimbul implicit este de fapt un schimb direct care este predeclarat de brokerul de mesaje și nu are nume (numele este un șir gol).

Poți privi întrerupătorul implicit ca pe un întrerupător special atașat direct.
Numele implicit al switch-ului: Null string (implicit AMQP)
Tip de comutator implicit: Comutator atașat direct

Când se creează o coadă, atâta timp cât comutatorul care urmează să fie legat nu este specificat, acesta va fi legat automat de comutatorul implicit, iar numele cheii de rutare al legăturii va fi același cu numele cozii.

Conexiunea directă la întrerupător

Un comutator atașat direct livrează mesaje către o coadă de chei de legătură corespunzătoare, bazate pe cheia de rutare purtată de mesaj. Rutarea unicast folosită de comutatorul direct pentru a gestiona mesajul.

La crearea unei cozi, dacă este legată de un comutator direct, nu este nevoie să specifice numele cheii de rutare, deoarece va avea un nume implicit al cheii de rutare, care este același cu numele cozii.

O coadă de switch-uri atașate direct distribuie de obicei sarcinile către mai mulți consumatori într-un ciclu (numim asta interogare).

Flux de lucru:


  • Când se leagă o coadă de un comutator, se atribuie o cheie de legare, presupunând R;
  • Când un mesaj cu o cheie de rutare este trimis către un comutator atașat direct, comutatorul îl direcționează către o coadă cu o cheie de rutare.





Comutatoare ventilatoare

Comutatorul ventilator direcționează mesajele către toate cozile legate de el, indiferent de cheia de rutare legată.

Dacă N cozi sunt legate de un comutator de sector, când un mesaj este trimis către acest comutator de sector, comutatorul trimite o copie a mesajului către toate cozile N separat. Comutatoarele ventilatorului sunt folosite în general pentru a gestiona rutarea prin difuzare a mesajelor.




Scenarii de aplicare:

transmitea mesaje;
Funcție de chat de grup.

Schimbarea temei

Schimbătorul de subiect trimite mesaje către una sau mai multe cozi în funcție de cheia de rutare și tipul de Exchange, iar noi îl folosim adesea pentru a implementa diverse abonamente de publicare/abonament, adică publicare.

Regulile de rutare pentru switch-urile atașate direct sunt strict potrivite, ceea ce înseamnă că Cheia de Rutare trebuie să corespundă cu Cheia de Legătură înainte de a trimite un mesaj către Coadă.
Regulile de rutare ale schimbării de subiect sunt meciuri neclare care pot fi livrate prin îndeplinirea unor reguli prin wildcard-uri.

Aceasta prevede:

  • Pot exista două caractere speciale * și # în tasta de asociere pentru potrivirea neclară. unde * este folosit pentru a potrivi un cuvânt, #用于匹配多个单词 (poate fi zero)
  • O cheie de rutare este un șir separat prin puncte (numim fiecare șir individual separat printr-o marcă de puncte un cuvânt)





  • Când producătorul trimite mesajul Route Key=A.A.A, doar A.*.* este satisfăcut, iar acesta va fi rutat doar către coada1.
  • Când producătorul trimite mesajul Route Key=A.B.A, care satisface A.*.* și *.B.* va fi rutat către coada1 și coada2.
  • Când producătorul trimite mesajul Route Key=A.B.C, atunci A.*.* și *.B.* și *..* sunt satisfăcute. C este direcționat către coada 1, coada 2, coada 3.


Scenarii de aplicare:

  • actualizări de știri care implică categorii sau etichete;
  • Sarcini de fundal realizate de mai mulți lucrători, fiecare fiind responsabil de gestionarea anumitor sarcini specifice.



Comutator de chiulaste

Switch-urile de antete nu se bazează pe regulile de potrivire ale cheii de rutare pentru a lega cheile de rutare a mesajelor, ci se potrivesc pe baza atributului de antete din conținutul mesajului trimis.

Comutatoarele de cap pot fi considerate o altă manifestare a unui comutator atașat direct. Totuși, cheia de rutare a unui comutator direct trebuie să fie un șir, iar valorile atributelor antetului nu sunt constrânse de aceasta, ele pot fi chiar numere întregi sau valori hash (dicționare), etc. Mai multă flexibilitate (dar în practică folosim rar întrerupătoare de cap).

Flux de lucru:


  • Când o coadă este legată de un comutator de antet, mai multe antete sunt legate simultan pentru potrivire.
  • Mesajele primite poartă un antet și un parametru "x-match". Când "x-match" este setat la "any", orice valoare a antetului poate fi potrivită, iar când "x-match" este setat la "all", toate valorile antetului trebuie să fie potrivite.



Rezumatul schimbării



Legare

Conexiunea virtuală între Exchange și Coadă.

BindingKey este o descriere a regulilor pentru legăturile Exchange și Queue. Cheia de legare specifică ce tip de Cheie de Rutare va fi atribuită cozii legate în prezent sub schimbul curent.

Cheia de rutare

Reguli de rutare, pe care mașina virtuală le poate folosi pentru a determina cum să ruteze un anumit mesaj.

Cheia de legare vs. Cheia de rutare


  • Cheia de legare este cheia de legătură dintre coadă și comutator;
  • Cheia de Rutare este o informație trimisă de producător către comutator;
  • Când Cheia de Legare și Cheia de Rutare corespunde, se pune mesajul în coada corespunzătoare.



Cheia de Binding este descrierea regulii pentru Exchange și legarea cozii, folosită pentru a analiza atunci când Exchange primește un mesaj, mesajul primit de Exchange va avea un câmp de Cheie de Rutare, iar Exchange potrivește această cheie de rutare cu toate Cheile de legătură ale Exchange-ului curent, iar dacă cerințele sunt îndeplinite, va fi trimisă la Binding Cheia este legată de coadă pentru a trimite mesajul.

Cheia de legare vs. Cheia de rutare în diverse switch-uri


Comutator implicit: Binding Key este numele cozii, care nu poate fi personalizat. Cheia de Rutare este și numele cozii înainte ca aceasta să poată fi redirecționată cu succes către coadă
Comutator de conexiune directă: Binding Key este numele cozii, care poate fi personalizat. Cheile de rutare pot fi rutate cu succes către coadă doar atunci când cheia de legătură este aceeași
Comutator ventilator: Fără cheie de asociere; Desigur, nu există o cheie de rutare. Rutat automat către toate cozile legate de coadă
Schimbător de temă: cheia de legătură personalizată; Personalizează cheia de rutare. Cheia de rutare==Binding Key, iar potrivirea neclară trebuie rutată cu succes către coadă
Comutator de cap: fără cheie de legare; Desigur, nu există o cheie de rutare. Potriviri bazate pe atributul anteturilor din conținutul mesajului trimis


Coadă

Stochează mesajele care urmează să fie consumate de aplicație.

Proprietăți ale cozii:

  • Nume: Numele cozii
  • Durabil: Coada există în continuare după ce brokerul de mesaje este repornit
  • Exclusiv: Folosită de o singură conexiune, iar coada este ștearsă când aceasta este închisă
  • Ștergere automată: Șters când ultimul consumator se dezabonează
  • Argumente: Unii brokeri de mesaje îl folosesc pentru a face funcții suplimentare similare cu TTL


Crearea cozii:
Cozile pot fi folosite doar după ce au fost declarate. Dacă o coadă nu există deja, declararea unei cozi o creează. Dacă coada declarată există deja și atributele sunt identice, declarația nu are efect asupra cozii originale. Dacă atributele din declarație diferă de cele din coada existentă, se generează o excepție la nivel de canal cu codul de eroare 406.

Persistența cozii:
Coada de persistență este stocată pe disc și rămâne acolo când brokerul este repornit. Cozile care nu sunt persistate se numesc cozi tranzitorii. Nu toate scenariile și cazurile necesită persistență la coadă.

O coadă persistentă nu face ca mesajele rutate către ea să fie persistente. Dacă agentul de mesaje se închide și este repornit, coada de persistență va fi re-declarată în timpul repornirii, iar în orice caz, doar mesajele persistate pot fi restabilite.

Consumator

Știri despre consumul consumatorilor. În AMQP, există două moduri prin care consumatorii pot primi mesajele în așteptare:

Middleware-ul de mesaje livrează mesaje consumatorilor (push API)
Consumatorii primesc activ mesaje (pull API)
Notă: Când mai mulți consumatori ascultă aceeași coadă, mesajele din coadă vor fi consumate doar de unul dintre consumatori (nu o singură dată pentru fiecare consumator)

Mesaj

Datele transmise între mesaje, servicii și aplicații constau în Proprietăți și corpuri.

Atributele modifică mesajele, cum ar fi prioritatea mesajelor, întârzierea și alte funcții avansate, iar corpul principal este conținutul corpului mesajului.

Proprietăți ale mesajului:

  • Tipul conținutului
  • Codarea conținutului
  • Cheia de rutare
  • Modul de livrare (persistent sau nu)
  • Modul de livrare (persistent sau nepersistent)
  • Prioritatea mesajelor
  • Marca temporală a publicării mesajelor
  • Perioada de expirare
  • ID-ul aplicației editorului


Corpul mesajului:
Pe lângă atribute, mesajele AMQP conțin și o sarcină utilă (datele pe care mesajul le transportă efectiv), care este tratată de proxy-ul AMQP ca un tablou opac de octeți.

Brokerul de mesaje nu inspectează și nu modifică sarcina utilă. Mesajele pot conține doar atribute fără a transporta o sarcină utilă. De obicei, folosește date într-un format serializat, cum ar fi JSON, iar pentru a economisi bani, bufferele de protocol și MessagePack-urile vor serializa datele structurate pentru a fi publicate ca un payload de mesaje. AMQP și colegii săi folosesc de obicei câmpurile "tipul de conținut" și "codare de conținut" pentru a comunica cu mesajele pentru a identifica încărcăturile utile, dar acest lucru se bazează doar pe convenții.

Persistența mesajului:
Mesajele sunt publicate într-un mod persistent, iar agentul AMQP stochează acest mesaj pe disc. Dacă serverul este repornit, sistemul confirmă că mesajul de persistență primit nu s-a pierdut.

Simpla trimitere a unui mesaj către un switch persistent sau rutarea acestuia către o coadă persistentă nu face mesajul persistent: persistența mesajului depinde în totalitate de modul de persistență al mesajului în sine.

Publicarea mesajelor într-un mod persistent poate avea un impact asupra performanței.

Procesul de lucru AMQP

Editorul publică un mesaj prin Exchange.

Comutatorul distribuie mesajele primite către coada legată de comutator conform regulilor de rutare.

În final, agentul AMQP va transmite mesajul consumatorului care s-a abonat la această coadă, sau consumatorul îl va primi singur, după nevoie.

Mecanismul de mesagerie AMQP

Confirmarea mesajului

Consumatorii uneori nu procesează mesajele sau uneori se blochează direct. Iar motivele legate de rețea pot cauza și diverse probleme.
Aceasta ne pune întrebarea când este momentul potrivit pentru ca agenții AMQP să șteargă mesajele.

Cele două moduri de confirmare a mesajelor ale AMQP:

Mod de confirmare automată: Șterge mesajul imediat ce este trimis consumatorului prin middleware-ul mesajului. (Folosind metoda AMQP: basic.deliver sau basic.get-ok)
Mod de confirmare explicită: Așteaptă ca consumatorul să trimită o confirmare înainte de a șterge mesajul. (Folosind metoda AMQP: basic.ack)
Dacă un consumator închide telefonul fără să trimită o confirmare, agentul AMQP retransmite mesajul altui consumator. Dacă nu există consumatori disponibili în acel moment, brokerul de mesaje așteaptă ca următorul consumator să se înregistreze în această coadă și apoi încearcă să livreze din nou.

Respinge mesajele

Când un consumator primește un mesaj, procesul de procesare poate reuși sau eșua. Consumatorul poate indica brokerului de mesaje (middleware-ul de mesaje) că mesajul nu a fost procesat (sau nu s-a finalizat în acest moment) din cauza unui "mesaj respins".
Când un mesaj este respins, consumatorul poate spune brokerului de mesaje ce să facă cu mesajul – să-l distrugă sau să-l pună înapoi în coadă.

Când există un singur consumator în această coadă, asigură-te că nu respingi mesajul și alegi să-l pui înapoi în coadă, ceea ce face ca mesajul să revină la nesfârșit pe același consumator.

În AMQP, metoda de bază .reject este folosită pentru a efectua operația de respingere a mesajelor. Totuși, basic.reject are o limitare: nu îl poți folosi pentru a respinge mai multe mesaje cu confirmări. Dar dacă folosești RabbitMQ, poți folosi extensia AMQP 0-9-1 numită confirmări negative (numite și nacks) pentru a rezolva această problemă.


Original:Autentificarea cu hyperlink este vizibilă.





Precedent:Array-urile JS sunt diferența și utilizarea fiecăruia și câte
Următor:Explicație detaliată a arhitecturii mesajelor AMQP RabbitMQ
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com