KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

Goedemiddag, Habr! Ik wil graag een naslagwerk met kennis delen dat ik heb verzameld RabbitMQ en condenseren tot korte aanbevelingen en conclusies.

inhoudsopgave

  • KonijnMQ. Deel 1. Inleiding. Erlang, AMQP en RPC
  • KonijnMQ. Deel 2. Uitwisselingen begrijpen
  • KonijnMQ. Deel 3. Wachtrijen en bindingen begrijpen
  • KonijnMQ. Deel 4. Begrijpen wat berichten en frames zijn
  • KonijnMQ. Deel 5: Berichtpublicatie en consumptieprestaties
  • KonijnMQ. Deel 6. Overzicht van de Federatie- en Shovel-modules
  • KonijnMQ. Deel 7. Details over Connection en Chanel
  • KonijnMQ. Deel 8. RabbitMQ in .NET
  • KonijnMQ. Deel 9. Toezicht

Kort over AMQP

AMQP (Advanced Message Queuing Protocol) is een open protocol voor het verzenden van berichten tussen systeemcomponenten. Het basisidee is dat individuele subsystemen (of onafhankelijke applicaties) op verschillende manieren berichten kunnen uitwisselen via een AMQP-broker. Deze broker verzorgt de routering en garandeert eventueel de levering, de distributie van gegevensstromen en het abonnement op de vereiste berichttypen.

protocol AMQP introduceert drie concepten:

KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

  • exchange (uitwisselingspunt of exchange) - Hier worden berichten naartoe gestuurd. Wisselpunt verspreidt boodschap in één of meerdere wachtrijen. Zij stuurt berichten naar een wachtrij op basis van de gemaakte verbindingen (binding) tussen hem en de wachtrij
  • queue (wachtrij) - een gegevensstructuur op schijf of in RAM die slaat links naar berichten op en retourneert kopieën van berichten consumers (aan consumenten)
  • binding (bindend) - een regel die vertelt het uitwisselingspunt naar welke wachtrij deze berichten moeten gaan

Het protocol draait bovenop TCP/IP.

Kort over Erlang

De broncode voor het project bevindt zich in de repository op GitHub. Architectuur RabbitMQ-server gebaseerd op Erlang en BEAM.

Erlang ontwikkeld door het bedrijf Ericsson halverwege de jaren 1980 als een gedistribueerd, fouttolerant, real-time systeem voor toepassingen die 99,999% uptime vereisen. Erlang wordt gebruikt in verschillende industrieën en moderne toepassingen, zoals WhatsApp. Meer hierover leest u in het artikel De architectuur van WhatsApp, dat Facebook voor 19 miljard dollar kocht

Kort over RabbitMQ

RabbitMQ – is een open source berichtenmakelaar. Berichten worden gerouteerd volgens alle basisprotocolprincipes. AMQP beschreven in specificaties. RabbitMQ implementeert en vult het protocol aan AMQP.

Het basisidee van het berichtenmodel in RabbitMQ het ding is producer (uitgever) stuurt geen berichten rechtstreeks naar de wachtrij. Vaak weet de uitgever zelfs niet of het bericht überhaupt in een wachtrij terechtkomt.

In plaats daarvan kan de uitgever alleen berichten naar de exchange sturen. Enerzijds ontvangt de exchange berichten van uitgevers en anderzijds stuurt het deze door naar wachtrijen. De centrale 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 de boodschap moet genegeerd worden.

KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

Kort over het werk RabbitMQ kan als volgt worden beschreven:

  1. De uitgever stuurt een bericht naar een specifieke exchange
  2. Wanneer een exchange een bericht ontvangt, routeert het dit naar een of meer wachtrijen op basis van de bindingsregels tussen de exchange en de wachtrij.
  3. De wachtrij slaat een verwijzing naar dit bericht op. Het bericht zelf wordt in het RAM-geheugen of op schijf opgeslagen.
  4. Zodra de consument klaar is om een ​​bericht uit de wachtrij te ontvangen, maakt de server een kopie van het bericht door middel van een referentie en verstuurt deze
  5. De consument ontvangt het bericht en stuurt een bevestiging naar de makelaar
  6. Zodra de broker de bevestiging heeft ontvangen, verwijdert hij de kopie van het bericht uit de wachtrij. Vervolgens worden de bestanden uit het RAM-geheugen en de schijf verwijderd.

RPC

Процесс RPC (remote procedure call) ligt ten grondslag aan vrijwel alle interacties met de kern RabbitMQ. Bijvoorbeeld de eerste besprekingen over de voorwaarden van de cliënt met RabbitMQ, toont een bepaald proces RPC. Zodra deze reeks voltooid is, RabbitMQ zal klaar zijn om verzoeken van de klant te accepteren:

KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

Ook in de specificatie AMQP Zowel de client als de server kunnen opdrachten geven. Dit betekent dat de client wacht op interactie met de server. Opdrachten zijn klassen en methoden. Bijvoorbeeld, Connection.Start – methodeaanroep Start klasse Connection.

Verbinding en kanalen

Voor de uitwisseling van informatie tussen de client en de server worden de volgende methoden gebruikt: аналы. Kanalen worden binnen gecreëerd specifieke verbinding. Elk kanaal is geïsoleerd van andere kanalen. In het synchrone geval is het niet mogelijk om de volgende opdracht uit te voeren totdat er een antwoord is ontvangen.

Om commando's parallel te kunnen versturen, moet je meerdere kanalen openen. Elk kanaal creëert een apart Erlang proces. Eén verbinding kan meerdere kanalen hebben (multiplexing). Voor elk kanaal zijn er bepaalde structuren en objecten in het geheugen. Hoe meer kanalen er dus binnen een verbinding zijn, hoe RabbitMQ gebruikt meer geheugen om zo'n verbinding te controleren.

KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

Een eenvoudig voorbeeld van het maken van een verbinding en kanaal met behulp van RabbitMQ.Client:

// ...
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 wordt sterk afgeraden om voor elke bewerking een nieuwe verbinding te openen, omdat dit zal leiden tot hoge kosten. Kanalen zijn ook bedoeld om persistent te zijn, maar veel protocolfouten zorgen ervoor dat het kanaal wordt gesloten. De levensduur van een kanaal kan daardoor korter zijn dan die van de verbinding.

Waar wordt RabbitMQ gebruikt?

In de context van microservices is het protocol AMQP en de implementatie ervan in RabbitMQ vaak gebruikt voor asynchrone interactie tussen diensten.

In context IIOT protocol AMQP en de implementatie ervan in RabbitMQ wordt gebruikt om gegevens tussen servers uit te wisselen (server-naar-server). Gebruik ook plugin MQTT-plugin RabbitMQ wat een implementatie is van het protocol MQTT voor het overbrengen van gegevens tussen de sensor en de server in omgevingen met lage snelheid en hoge latentie (de volledige lijst met ondersteunde protocollen vindt u op projectsite).

In het volgende artikel gaan we dieper in op Exchanges.

referenties

Bron: www.habr.com

Koop betrouwbare hosting voor sites met DDoS-bescherming, VPS VDS-servers 🔥 Koop betrouwbare websitehosting met DDoS-bescherming, VPS- en VDS-servers | ProHoster