Introductie tot het AMQP-protocol
AMQP (Advanced Message Queuing Protocol) is een standaardprotocol op applicatielaag dat unified messaging-diensten biedt en een open standaard is voor applicatielaagprotocollen ontworpen voor message-oriented middleware. AMQP is een netwerkprotocol voor het doorgeven van asynchrone berichten tussen processen.
Clients en message-middleware gebaseerd op dit protocol kunnen berichten bezorgen zonder beperkt te worden door verschillende client-/middlewareproducten, verschillende ontwikkeltalen, enzovoort.
De belangrijkste kenmerken van AMQP zijn berichtgeoriënteerd, in de wachtrij, routering (inclusief peer-to-peer en publiceren/abonneren), betrouwbaarheid en beveiliging. AMQP handhaaft het gedrag van berichtproviders en klanten, waardoor echte interoperabiliteit tussen verschillende leveranciers mogelijk is.
AMQP en JMS
JMS was een poging om vroege berichtmiddleware te standaardiseren, het was alleen gestandaardiseerd op API-niveau en was verre van het creëren van interoperabiliteit.
In tegenstelling tot JMS is AMQP een wire-level protocol dat het formaat beschrijft van gegevens die via een netwerk worden verzonden, in bytes. Als gevolg hiervan is elk hulpmiddel dat aan dit dataformaat voldoet en berichten genereert en interpreteert, interoperabel met andere compatibele tools.
AMQP-kernsamenstelling
Producent
Productienieuws.
ConnectionFactory
De fabriek die Connection produceert.
Verbinding
Verbinding, applicatienetwerkverbinding met Broker TCP/IP/Triple Handshake en Quad Wave.
AMQP-verbindingen zijn meestal lange verbindingen. AMQP is een applicatielaagprotocol dat TCP gebruikt om betrouwbare levering te bieden. AMQP gebruikt authenticatiemechanismen en biedt TLS (SSL)-bescherming. Wanneer een applicatie niet langer verbinding hoeft te maken met de AMQP-proxy, moet deze de AMQP-verbinding soepel loslaten in plaats van simpelweg de TCP-verbinding af te sluiten.
Kanaal
Het netwerkkanaal is een lichtgewicht verbinding die bovenop de verbinding is gebouwd. Bijna alle bewerkingen worden uitgevoerd in Channels, dat zijn kanalen voor het lezen en schrijven van berichten, en clients kunnen paren voor elk kanaal opzetten, die elk een sessietaak vertegenwoordigen.
Als de verbinding wordt vergeleken met een glasvezelkabel, dan wordt het kanaalkanaal vergeleken met een van de vezels in een glasvezelkabel. Er kunnen elk aantal kanalen worden aangemaakt op een Connection.
De meeste van onze bedrijfsvoeringen vinden plaats in de Channel-interface, waaronder:
- queueDeclareer
- De exchangeDeclaratie voor de switch
- queueBind queueBind
- Publiceer het bericht basicPublish
- ConsumentennieuwsbasicConsume, enzovoort.
Makelaar
Accepteer de verbinding van de client om AMQP-entiteitsdiensten te implementeren, zoals rabbitmq.
VirtualHost (Webhosting)
Virtuele hosting, gebruikt voor logische isolatie, een virtuele host kan meerdere exchanges en wachtrijen hebben, en dezelfde virtuele host kan exchanges met dezelfde naam niet hebben.
Om meerdere geïsoleerde omgevingen (gebruikers, gebruikersgroepen, switches, wachtrijen, enz.) op één proxy te implementeren, biedt AMQP het concept van virtuele hosts (virtuele hosts - vhosts). Dit lijkt sterk op het webhostingconcept van webservers, dat een volledig geïsoleerde omgeving biedt voor AMQP-entiteiten. Wanneer de verbinding tot stand is gebracht, specificeert de AMQP-client welke virtuele host gebruikt moet worden.
Ruilen
De switch accepteert berichten en stuurt berichten naar de gebonden wachtrij op basis van de routeringssleutel (zonder berichtopslagmogelijkheden).
Een schakelaar is een AMQP-entiteit die wordt gebruikt om berichten te verzenden. Nadat de switch een bericht ontvangt, stuurt hij het naar één of nul wachtrijen. Het routeringsalgoritme dat het gebruikt wordt bepaald door het type schakelaar en de bindingsregels.
Schakelaartype:
- Directe uitwisseling
- Uitruiling van de fanout
- Onderwerpuitwisseling
- Headers-uitwisseling
Eigenschappen van de schakelaar:
- Naam: De naam van de schakelaar
- Duurzaamheid: Een persistentievlag die aangeeft of deze schakelaar wordt behouden of niet
- Auto-delete: Verwijder-vlag, die aangeeftWanneer alle wachtrijen via deze uitwisseling zijn voltooid, worden ze verwijderd
- Argumenten: Afhankelijk van de agent zelf
Status van de schakelaar:
Persistente switches zullen bestaan nadat de broker opnieuw is opgestart, terwijl staging-switches dat niet doen (ze moeten opnieuw worden gedeclareerd nadat de broker weer online is).
Standaardschakelaar
De standaarduitwisseling is eigenlijk een directe uitwisseling die vooraf is gedeclareerd door de berichtbroker en geen naam heeft (de naam is een lege string).
Je kunt de standaardschakelaar zien als een speciale direct aangesloten schakelaar. Standaard switchnaam: Null-string (AMQP standaard) Standaard type schakelaar: Direct aangesloten schakelaar
Bij het aanmaken van een wachtrij, zolang de te binden schakelaar niet is gespecificeerd, wordt deze automatisch gebonden aan de standaardschakelaar, en is de routingsleutelnaam van de binding hetzelfde als de naam van de wachtrij.
Directe verbinding met de schakelaar
Een direct gekoppelde switch levert berichten aan een wachtrij van bijbehorende bindingssleutels op basis van de routeringssleutel die door het bericht wordt gedragen. De unicast-routering die door de directe switch wordt gebruikt om het bericht te verwerken.
Bij het aanmaken van een wachtrij, als deze gebonden is aan een directe switch, hoeft deze de naam van de routeringssleutel niet te specificeren, omdat deze een standaard routeringssleutelnaam heeft, die dezelfde is als de naam van de wachtrij.
Een wachtrij van direct aangesloten switches verdeelt doorgaans taken naar meerdere consumenten in een lus (we noemen dit polling).
Werkwijze:
- Bij het binden van een wachtrij aan een schakelaar, geef deze een bindingssleutel, ervan uitgaande dat R;
- Wanneer een bericht met een Routing Key naar een direct gekoppelde switch wordt gestuurd, stuurt de switch het naar een wachtrij met een Routing Key.
Ventilatorschakelaars
De ventilatorschakelaar stuurt berichten naar alle wachtrijen die eraan gekoppeld zijn, ongeacht de gebonden routeringssleutel.
Als N wachtrijen aan een sectorschakelaar zijn gebonden, stuurt de schakelaar bij het verzenden van een bericht naar deze sectorschakelaar een kopie van het bericht naar alle N wachtrijen apart. Ventilatorschakelaars worden over het algemeen gebruikt om de broadcast-routering van berichten te verwerken.
Toepassingsscenario's:
uitzendberichten; Groepschatfunctie.
Themawisseling
De topic switch stuurt berichten naar een of meer Queues volgens de routeringssleutel en het type Exchange, en we gebruiken het vaak om verschillende publish/subscribes, oftewel publiceer-abonnementen te implementeren.
De routeringsregels voor direct gekoppelde switches zijn strikt op elkaar afgestemd, wat betekent dat de Routingsleutel moet overeenkomen met de Binding-sleutel voordat een bericht naar de wachtrij wordt gestuurd. De routeringsregels van de topic switch zijn fuzzy matches die kunnen worden geleverd door aan sommige regels te voldoen via wildcards.
Het bepaalt:
- Er kunnen twee speciale tekens * en # in de bindingstoets staan voor fuzzy matching. waarbij * wordt gebruikt om een woord te matchen, #用于匹配多个单词 (kan nul zijn)
- Een routingsleutel is een stippe-gescheiden string (we noemen elke afzonderlijke string, gescheiden door een puntmarkering, een woord)
- Wanneer de producer het bericht Routing Key=A.A.A stuurt, is alleen A.*.* bevredigd en wordt het alleen naar queue1 gerouteerd.
- Wanneer de producent het bericht Routing Key=A.B.A stuurt, worden die voldoen aan A.*.* en *.B.* gerouteerd naar queue1 en queue2.
- Wanneer de producent het bericht stuurt, is Routing Key=A.B.C, dan zijn A.*.** en *.B.* en *.* voldoende. C wordt gerouteerd naar queue1, queue2, queue3.
Toepassingsscenario's:
- nieuwsupdates met categorieën of tags;
- Achtergrondtaken uitgevoerd door meerdere medewerkers, die elk verantwoordelijk zijn voor het uitvoeren van bepaalde specifieke taken.
Hoofdschakelaar
Headers-switches vertrouwen niet op de matchingregels van de routeringssleutel om sleutels te koppelen voor het routeren van berichten, maar matchen op basis van het headers-attribuut in de inhoud van het verzonden bericht.
Hoofdschakelaars kunnen worden beschouwd als een andere manifestatie van een direct aangesloten schakelaar. De routeringssleutel van een directe switch moet echter een string zijn, en de attributen van de header worden hierdoor niet beperkt; ze kunnen zelfs gehele getallen of hashwaarden zijn (woordenboeken), enzovoort. Meer flexibiliteit (maar in de praktijk gebruiken we zelden kopschakelaars).
Werkwijze:
- Wanneer een wachtrij gebonden is aan een headerswitch, worden meerdere headers tegelijkertijd gebonden voor matching.
- Binnenkomende berichten dragen een header en een "x-match" parameter. Wanneer "x-match" is ingesteld op "any", kan elke waarde van de header worden gematcht, en wanneer "x-match" op "all" staat, moeten alle waarden van de header worden gematcht.
Wisseloverzicht
Bindend
Virtuele verbinding tussen Exchange en Queue.
BindingKey is een regelbeschrijving voor Exchange- en Queue-bindings. De bindingssleutel specificeert welk type Routingsleutel wordt toegewezen aan de momenteel gebonden Queue onder de huidige uitwisseling.
Routing Key
Routingregels, die de virtuele machine kan gebruiken om te bepalen hoe een bepaald bericht wordt gerouteerd.
Bindingssleutel versus routeringssleutel
- De bindingstoets is de bindingstoets tussen de wachtrij en de schakelaar;
- De Routing Key is een stuk informatie dat door de producent naar de switch wordt gestuurd;
- Wanneer de bindingssleutel en routeringssleutel overeenkomen, plaats je het bericht in de bijbehorende wachtrij.
Binding Key is de regelbeschrijving van Exchange en Queuebinding, die wordt gebruikt om te analyseren wanneer Exchange een bericht ontvangt, het bericht dat door Exchange wordt ontvangen een Routing Key-veld heeft, en Exchange deze Routing Key matcht met alle bindingssleutels van de huidige Exchange, en als aan de eisen wordt voldaan, wordt deze naar Binding gestuurd Key is gebonden aan de wachtrij om het bericht te verzenden.
Bindingstoets versus routeringssleutel in verschillende switches
Standaardschakelaar: Bindingstoets is de naam van de wachtrij, die niet kan worden aangepast. De Routing Key is ook de naam van de wachtrij voordat deze succesvol naar de wachtrij kan worden gerouteerd Direct verbindingsschakelaar: Binding Key is de naam van de wachtrij, die aangepast kan worden. Routingsleutels kunnen alleen succesvol naar de wachtrij worden gerouteerd wanneer de bindingssleutel hetzelfde is Ventilatorschakelaar: Geen koppelingsleutel; Natuurlijk is er geen Routing Key. Automatisch gerouteerd naar alle wachtrijen die aan de switch zijn gekoppeld Themawisseling: aangepaste bindingstoets; Pas de Routing Key aan. Routing Key==Bindingssleutel, en de fuzzy match moet succesvol naar de wachtrij worden gerouteerd Kopschakelaar: geen inbindingstoets; Natuurlijk is er geen Routing Key. Matches gebaseerd op de headers-attribuut in de inhoud van het verzonden bericht
Rij
Slaat berichten op die op het punt staan door de app te worden geconsumeerd.
Eigenschappen van de wachtrij:
- Naam: De naam van de wachtrij
- Duurzaam: De wachtrij bestaat nog steeds nadat de berichtbroker opnieuw is opgestart
- Exclusief: Gebruikt door slechts één verbinding, en de wachtrij wordt verwijderd wanneer de verbinding wordt gesloten
- Automatisch verwijderen: Verwijderd wanneer de laatste consument zich afmeld
- Argumenten: Sommige berichtbrokers gebruiken het om extra functies uit te voeren vergelijkbaar met TTL
Wachtrijaanmaak: Wachtrijen kunnen alleen worden gebruikt nadat ze zijn verklaard. Als er nog geen wachtrij bestaat, wordt deze aangemaakt door een wachtrij te declareren. Als de gedeclareerde wachtrij al bestaat en de attributen identiek zijn, heeft de verklaring geen effect op de oorspronkelijke wachtrij. Als de attributen in de declaratie verschillen van die in de bestaande wachtrij, wordt een uitzondering op kanaalniveau met een foutcode van 406 gegooid.
Wachtrijpersistentie: De persistentiewachtrij wordt op de schijf opgeslagen en blijft daar wanneer de broker wordt herstart. Wachtrijen die niet worden behouden, worden tijdelijke wachtrijen genoemd. Niet alle scenario's en gevallen vereisen wachtrijpersistentie.
Een behouden wachtrij maakt berichten die naar hem worden gerouteerd niet persistent. Als de berichtagent ophangt en opnieuw wordt opgestart, wordt de persistentiewachtrij tijdens de herstart opnieuw gedeclareerd, en in elk geval kunnen alleen behouden berichten worden hersteld.
Consument
Consumentenconsumptienieuws. In AMQP zijn er twee manieren waarop consumenten in actie komen:
Message middleware levert berichten aan consumenten (push API) Consumenten ontvangen actief berichten (pull API) Opmerking: Wanneer meerdere consumenten naar dezelfde wachtrij luisteren, worden de berichten in de wachtrij slechts door één van de consumenten geconsumeerd (niet één keer per consument)
Bericht
De gegevens die tussen berichten, diensten en applicaties worden verzonden, bestaan uit eigenschappen en bodies.
Attributen wijzigen berichten, zoals berichtprioriteit, vertraging en andere geavanceerde functies, en het hoofdgedeelte is de inhoud van de berichttekst.
Berichteigenschappen:
- Inhoudstype
- Inhoudscodering
- Routingsleutel
- Leveringswijze (persistent of niet)
- Bezorgmodus (persistent of niet-persistent)
- Berichtprioriteit
- Tijdstempel voor berichtpublicatie
- Vervaldatum
- Uitgeversapplicatie-ID
Berichttekst: Naast de attributen bevatten AMQP-berichten ook een payload (de data die het bericht daadwerkelijk draagt), die door de AMQP-proxy wordt behandeld als een ondoorzichtig array van bytes.
De message broker inspecteert of wijzigt de payload niet. Berichten kunnen alleen attributen bevatten zonder een payload te dragen. Het gebruikt doorgaans data in een geserialiseerd formaat zoals JSON, en om geld te besparen serialiseren protocolbuffers en MessagePacks de gestructureerde data voor publicatie als payload van berichten. AMQP en zijn collega's gebruiken doorgaans de velden "content-type" en "content-encoding" om met berichten te communiceren en payloads te identificeren, maar dit is alleen gebaseerd op conventies.
Berichtpersistentie: Berichten worden op een persistente manier gepubliceerd, en de AMQP-agent slaat dit bericht op de schijf op. Als de server wordt herstart, bevestigt het systeem dat het ontvangen persistentiebericht niet verloren is gegaan.
Het simpelweg sturen van een bericht naar een persistente switch of het routeren naar een gepersisteerde wachtrij maakt het bericht niet persistent: de persistentie van het bericht hangt volledig af van de persistentiemodus van het bericht zelf.
Het op een persistente manier publiceren van berichten kan een impact hebben op de prestaties.
AMQP-werkproces
De uitgever publiceert een bericht via de Exchange.
De switch verdeelt de binnenkomende berichten naar de wachtrij die aan de switch is gebonden volgens de routeringsregels.
Ten slotte zal de AMQP-agent het bericht aan de consument die zich op deze wachtrij heeft abonneerd, of de consument ontvangt het zelf indien nodig.
AMQP-berichtenmechanisme
Berichtbevestiging
Consumenten verwerken berichten soms niet of crashen soms direct. En netwerkredenen kunnen ook verschillende problemen veroorzaken. Dit roept ons op wanneer het juiste moment is voor AMQP-agenten om berichten te verwijderen.
De twee berichtbevestigingsmodi van AMQP:
Auto-Confirm Mode: Verwijder het bericht zodra het door de berichtmiddleware naar de consument is gestuurd. (Met de AMQP-methode: basic.deliver of basic.get-ok) Expliciete bevestigingsmodus: Wacht tot de consument een bevestiging stuurt voordat je het bericht verwijdert. (Met behulp van de AMQP-methode: basic.ack) Als een consument ophangt zonder een bevestigingsbewijs te sturen, stuurt de AMQP-medewerker het bericht opnieuw naar een andere consument. Als er op dat moment geen consumenten beschikbaar zijn, wacht de berichtbroker tot de volgende consument zich in deze wachtrij registreert en probeert vervolgens opnieuw te leveren.
Berichten afwijzen
Wanneer een consument een bericht ontvangt, kan het verwerkingsproces slagen of falen. De consument kan aan de message broker (message middleware) aangeven dat het bericht niet is verwerkt (of op dit moment niet is voltooid) vanwege een "afgewezen bericht". Wanneer een bericht wordt afgewezen, kan de consument de berichtmakelaar vertellen wat hij met het bericht moet doen - het vernietigen of terug in de wachtrij plaatsen.
Als er maar één consument in deze wachtrij is, zorg er dan voor dat je het bericht niet afwijst en ervoor kiest het terug in de wachtrij te zetten, waardoor het bericht oneindig op dezelfde consument blijft herhalen.
In AMQP wordt de basic.refuc-methode gebruikt om de operatie van het afwijzen van berichten uit te voeren. Basic.reject heeft echter een beperking: je kunt het niet gebruiken om meerdere berichten met bevestigingen te weigeren. Maar als je RabbitMQ gebruikt, kun je de AMQP 0-9-1-extensie genaamd negatieve bevestigingen (ook wel nacks genoemd) gebruiken om dit probleem op te lossen.
Origineel:De hyperlink-login is zichtbaar.
|