KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

Goedemiddag, Habr! Ik wil een leerboek-naslagwerk met kennis delen die 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 willekeurige wijze berichten kunnen uitwisselen via een AMQP-broker, die de routering uitvoert, mogelijk de bezorging garandeert, datastromen distribueert en zich abonneert op de gewenste berichttypen.

protocol AMQP introduceert drie concepten:

KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

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

Het protocol draait er bovenop TCP / IP.

Kort over Erlang

De broncode van 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 tachtig als een gedistribueerd, fouttolerant, realtime systeem voor toepassingen die een uptime van 1980% vereisten. Erlang gebruikt in diverse industrieën en moderne toepassingen, b.v. WhatsApp. Je kunt meer lezen in het artikel WhatsApp-architectuur, die Facebook voor 19 miljard dollar heeft gekocht

Kort over RabbitMQ

RabbitMQ is een open source berichtenmakelaar. Het stuurt berichten langs alle basisprincipes van het protocol AMQP beschreven in specificaties. RabbitMQ implementeert en vult het protocol aan AMQP.

Het hoofdidee van het berichtenmodel in RabbitMQ het ding is producer (uitgever) stuurt berichten niet rechtstreeks naar de wachtrij. Vaak weet de uitgever zelfs niet eens of het bericht überhaupt in een wachtrij zal worden afgeleverd.

In plaats daarvan kan de uitgever alleen berichten naar de centrale sturen. Aan de ene kant ontvangt de centrale berichten van uitgevers en aan de andere kant stuurt deze deze naar wachtrijen. De centrale moet precies weten wat ze met het ontvangen bericht moet doen. Moet het aan een specifieke wachtrij worden toegevoegd? Moet het aan meerdere wachtrijen worden toegevoegd? Of de boodschap moet worden genegeerd.

KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

Kort werk RabbitMQ kan als volgt worden omschreven:

  1. De uitgever stuurt een bericht naar een specifieke centrale
  2. Een centrale, die een bericht heeft ontvangen, stuurt dit naar een of meer wachtrijen in overeenstemming met de bindende regels tussen de centrale en de wachtrij
  3. In de wachtrij wordt een verwijzing naar dit bericht opgeslagen. Het bericht zelf wordt opgeslagen in RAM of op schijf
  4. Zodra de consument klaar is om een ​​bericht uit de wachtrij te ontvangen, maakt de server via de link een kopie van het bericht en verzendt het
  5. De consument ontvangt het bericht en stuurt een bevestiging naar de makelaar
  6. Na ontvangst van de bevestiging verwijdert de makelaar een kopie van het bericht uit de wachtrij. Verwijdert vervolgens uit RAM en schijf

RPC

Процесс RPC (procedureoproep op afstand) ligt ten grondslag aan bijna alle interacties met de kern RabbitMQ. Bijvoorbeeld eerste gesprekken over de voorwaarden van de klant RabbitMQ, toont een bepaald proces aan RPC. Zodra deze reeks is voltooid, RabbitMQ staat klaar 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 om met de server te communiceren. Commando's zijn klassen en methoden. Bijvoorbeeld, Connection.Start – methodeaanroep Start klasse Connection.

Verbinding en kanalen

Voor een dergelijke informatie-uitwisseling tussen client en server, аналы. Binnenin worden kanalen gecreëerd specifieke verbinding. Elk kanaal is geïsoleerd van andere kanalen. In het synchrone geval is het niet mogelijk om het volgende commando uit te voeren totdat er een antwoord is ontvangen.

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

KonijnMQ. Deel 1. Inleiding. Erlang, AMQP

Een eenvoudig voorbeeld van het creëren 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 openen van een nieuwe verbinding voor elke handeling wordt daarom sterk afgeraden zal tot hoge kosten leiden. Kanalen moeten ook persistent zijn, maar veel protocolfouten zorgen ervoor dat het kanaal wordt gesloten, waardoor de levensduur van het kanaal korter kan 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 voor gebruikt asynchrone interactie tussen diensten.

In context IIOT protocol AMQP en de implementatie ervan in RabbitMQ gebruikt voor gegevensuitwisseling tussen servers (server-server). Gebruik ook de plug-in MQTT-plug-in RabbitMQ dat is een implementatie van het protocol MQTT voor het verzenden van gegevens tussen sensor en server in omgevingen met lage snelheid en hoge latentie (een volledige lijst met ondersteunde protocollen vindt u op projectsite).

In het volgende artikel zullen we Exchanges in meer detail gaan begrijpen.

referenties

Bron: www.habr.com

Voeg een reactie