Hallo Habr! Ik wil een studiehandleiding delen met kennis die ik heb kunnen verzamelen over RabbitMQ en samengeperst in korte aanbevelingen en conclusies.
Inhoudsopgave
- RabbitMQ. Deel 1. Introductie. Erlang, AMQP en RPC
- RabbitMQ. Deel 2. Laten we Exchanges verkennen
- RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings
- RabbitMQ. Deel 4. We duiken in wat berichten en frames zijn
- RabbitMQ. Deel 5. Prestatie van het publiceren en consumeren van berichten
- RabbitMQ. Deel 6. Overzicht van de modules Federation en Shovel
- RabbitMQ. Deel 7. Gedetailleerd over Connection en Channel
- RabbitMQ. Deel 8. RabbitMQ in .NET
- RabbitMQ. Deel 9. Monitoring
Kort over AMQP
AMQP (Advanced Message Queuing Protocol) is een open protocol voor het verzenden van berichten tussen de componenten van een systeem. Het belangrijkste idee is dat afzonderlijke subsysteem (of onafhankelijke applicaties) berichten op willekeurige wijze kunnen uitwisselen via een AMQP-broker, die routing uitvoert, mogelijk levering garandeert, datastromen distribueert en zich abonneert op de benodigde soorten berichten.
Protocol AMQP introduceert drie concepten:

exchange(wisselpunt of exchange) - daarin worden berichten verzonden. Het wisselpunt verdeelt het bericht over een of meerdere wachtrijen. Het routet berichten naar de wachtrij op basis van de gemaakte verbindingen (binding) tussen hem en de wachtrijqueue(wachtrij) - een gegevenstructuur op de schijf of in het geheugen, die verwijzingen naar berichten opslaat en kopieën van berichten afgeeftconsumers(consumenten)binding(binding) - een regel die de wisselpunt vertelt naar welke van die wachtrijen deze berichten zouden moeten gaan
Het protocol werkt bovenop .
Kort over Erlang
De broncode van het project is te vinden in de repository op . Architectuur is gebaseerd op en BEAM.
Erlangontwikkeld door het bedrijfEricssonin het midden van de jaren 1980 als een gedistribueerd, fouttolerant, real-time systeem voor toepassingen die een ononderbroken werking van 99,999% vereisen.Erlangwordt toegepast in verschillende sectoren en moderne toepassingen, bijvoorbeeld in
Kort over RabbitMQ
– dit is een broker voor berichten met open bron. Het routeert berichten volgens alle basisprincipes van het protocol beschreven in . RabbitMQ voert en aanvult het protocol AMQP.
Het belangrijkste idee van het berichten-uitwisselingsmodel in RabbitMQ is dat producer (de publisher) verstuurt geen berichten rechtstreeks naar de wachtrij. In feite weet de publisher vaak zelfs niet of een bericht überhaupt aan een wachtrij zal worden bezorgd.
In plaats daarvan kan de publisher berichten alleen naar de broker sturen. Enerzijds ontvangt de broker berichten van publishers, en anderzijds stuurt hij ze naar wachtrijen. De broker moet precies weten wat er met het ontvangen bericht moet gebeuren. Moet het aan een specifieke wachtrij worden toegevoegd? Moet het aan meerdere wachtrijen worden toegevoegd? Of moet het bericht worden genegeerd?

De werking RabbitMQ kan als volgt worden samengevat:
- De publisher stuurt een bericht naar een bepaalde broker
- De broker, nadat hij het bericht heeft ontvangen, routeert het naar een of meer wachtrijen volgens de bindregels tussen hem en de wachtrij.
- De wachtrij houdt een referentie naar dit bericht. Het bericht zelf wordt in het geheugen of op de schijf opgeslagen.
- Zodra de consument klaar is om een bericht uit de wachtrij te ontvangen, maakt de server een kopie van het bericht op basis van de link en verzendt deze.
- De consument ontvangt het bericht en stuurt een bevestiging naar de broker.
- De broker verwijdert de kopie van het bericht uit de wachtrij zodra hij de bevestiging heeft ontvangen. Vervolgens verwijdert hij het uit het geheugen en van de schijf.
RPC
Proces ligt ten grondslag aan vrijwel alle interacties met de kernel. RabbitMQ. Bijvoorbeeld, de initiële discussies over voorwaarden met de RabbitMQ, illustreert een bepaald proces. RPC. Zodra deze reeks is voltooid, RabbitMQ is hij klaar om verzoeken van de klant te ontvangen:

Ook in de specificatie AMQP kunnen zowel de client als de server commando's aanroepen. Dit betekent dat de client interactie met de server verwacht. Commando's zijn klassen en methoden. Bijvoorbeeld, Connection.Start – is een aanroep van een methode. Start klasse Verbinden.
Verbinden en kanalen
Voor dit soort informatie-uitwisseling tussen de client en de server worden kanalen. Kanalen worden gecreëerd binnen het kader van een bepaalde verbinding.. Elke kanaal is geïsoleerd van andere kanalen. In het geval van synchronisatie is het niet mogelijk om het volgende commando uit te voeren totdat een antwoord is ontvangen.
Om commando's parallel te kunnen verzenden, moet er meerdere kanalen worden geopend. Elk kanaal creëert een aparte Erlang proces. Eén verbinding kan meerdere kanalen hebben (). Voor elk kanaal zijn er bepaalde structuren en objecten in het geheugen. Dus hoe meer kanalen er binnen een verbinding zijn, hoe meer geheugen RabbitMQ gebruikt voor het beheer van zo'n verbinding.

Een eenvoudig voorbeeld van het maken van een verbinding en kanaal met behulp van :
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// Включение автоматичекого восстановления
// соединения после сбоев сети
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}Het is ten zeerste af te raden om voor elke operatie een nieuwe verbinding te openen, omdat dit leidt tot hoge kosten. Kanalen moeten ook persistent zijn, maar veel protocolfouten leiden tot het sluiten van een kanaal, waardoor de levensduur van een kanaal korter kan zijn dan die van de verbinding.
Waar wordt RabbitMQ gebruikt?
In de context van microservices wordt het protocol AMQP en de implementatie ervan in RabbitMQ vaak gebruikt voor asynchrone interactie tussen diensten.
In de context van IIOT wordt het protocol AMQP en de implementatie ervan in RabbitMQ gebruikt voor gegevensuitwisseling tussen servers (server-server). De MQTT Plugin RabbitMQ voor gegevensoverdracht tussen een sensor en een server in omgevingen met lage snelheid en hoge latentie (een volledige lijst van ondersteunde protocollen staat vermeld in In het volgende artikel zullen we verder ingaan op Exchanges. ).
Webseite van het RabbitMQ-project
Links
Bron: habr.com
