Bona tarda, Habr! Vull compartir un llibre de text-llibre de coneixements que he aconseguit recollir RabbitMQ i condensar en recomanacions i conclusions breus.
Taula de continguts
ConillMQ. Part 1. Introducció. Erlang, AMQP i RPC
ConillMQ. Part 2. Comprensió dels intercanvis
ConillMQ. Part 3. Comprensió de les cues i enllaços
ConillMQ. Part 4. Entendre què són els missatges i els marcs
ConillMQ. Part 5: Publicació de missatges i rendiment del consum
ConillMQ. Part 6. Revisió dels mòduls Federació i Pala
ConillMQ. Part 7. Detalls sobre Connection i Chanel
ConillMQ. Part 8. RabbitMQ a .NET
ConillMQ. Part 9. Seguiment
Breument sobre AMQP
AMQP (Advanced Message Queuing Protocol) és un protocol obert per transmetre missatges entre components del sistema. La idea bàsica és que els subsistemes individuals (o aplicacions independents) poden intercanviar missatges de manera arbitrària mitjançant un agent AMQP, que realitza l'encaminament, possiblement garanteix el lliurament, distribueix fluxos de dades i es subscriu als tipus de missatges desitjats.
Protocol AMQP introdueix tres conceptes:
exchange (punt d'intercanvi o intercanvi): s'hi envien missatges. Punt d'intercanvi distribueix el missatge en una o més cues. Ella encamina els missatges a una cua basat en les connexions creades (binding) entre ell i la cua
queue (cua) - una estructura de dades al disc o a la memòria RAM que emmagatzema enllaços als missatges i dóna còpies dels missatges consumers (al consumidor)
binding (vinculant) - una regla que indica al punt d'intercanvi a quina cua haurien d'anar aquests missatges
Erlang desenvolupat per l'empresa Ericsson a mitjans de la dècada de 1980 com un sistema distribuït, tolerant a errors i en temps real per a aplicacions que requereixen un temps de funcionament del 99,999%. Erlang utilitzat en diverses indústries i aplicacions modernes, p. WhatsApp. Podeu llegir més a l'article Arquitectura de WhatsApp, que Facebook va comprar per 19 milions de dòlars
Breument sobre RabbitMQ
ConillMQ és un corredor de missatges de codi obert. Encamina els missatges al llarg de tots els principis bàsics del protocol AMQP descrit a especificacions. RabbitMQ implementa i complementa el protocol AMQP.
La idea principal del model de missatgeria en RabbitMQ la cosa és producer (editor) no envia missatges directament a la cua. De fet, i molt sovint, l'editor ni tan sols sap si el missatge es lliurarà a cap cua.
En canvi, l'editor només pot enviar missatges a l'intercanvi. D'una banda, l'intercanvi rep missatges de les editorials i, de l'altra, els envia a les cues. L'intercanvi ha de saber exactament què ha de fer amb el missatge que rep. S'ha d'afegir a una cua específica? S'ha d'afegir a diverses cues? O s'hauria d'ignorar el missatge.
Treball breu RabbitMQ es pot descriure de la següent manera:
L'editor envia un missatge a un intercanvi específic
Un intercanvi, després d'haver rebut un missatge, l'encamina a una o més cues d'acord amb les regles vinculants entre aquest i la cua.
La cua emmagatzema una referència a aquest missatge. El missatge en si s'emmagatzema a la memòria RAM o al disc
Una vegada que el consumidor està preparat per rebre un missatge de la cua, el servidor crea una còpia del missatge mitjançant un enllaç i envia
El consumidor rep el missatge i envia la confirmació al corredor
L'agent, en rebre la confirmació, elimina una còpia del missatge de la cua. A continuació, esborra de la memòria RAM i del disc
RPC
procés RPC (trucada de procediment remot) subjau a gairebé totes les interaccions amb el nucli RabbitMQ. Per exemple, les discussions inicials sobre les condicions del client amb RabbitMQ, demostra un procés determinat RPC. Un cop completada aquesta seqüència, RabbitMQ estarà disposat a acceptar peticions del client:
També a les especificacions AMQP tant el client com el servidor poden emetre ordres. Això vol dir que el client està esperant per comunicar-se amb el servidor. Les ordres són classes i mètodes. Per exemple, Connection.Start - trucada al mètode Start classe Connection.
Connexió i canals
Per a aquest intercanvi d'informació entre client i servidor, canals. Els canals es creen dins connexió específica. Cada canal està aïllat dels altres canals. En el cas síncron, no és possible executar la següent ordre fins que no es rep una resposta.
Per poder enviar ordres en paral·lel, heu d'obrir diversos canals. Cada canal en crea un Erlang procés. Una connexió pot tenir diversos canals (multiplexació). Per a cada canal hi ha determinades estructures i objectes a la memòria. Per tant, com més canals hi hagi dins d'una connexió, més RabbitMQ utilitza més memòria per gestionar aquesta connexió.
Un exemple senzill de crear una connexió i un canal utilitzant 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
}
És molt desaconsellable obrir una connexió nova per a cada operació comportarà costos elevats. Els canals també han de ser persistents, però molts errors de protocol fan que el canal es tanqui, de manera que la vida útil del canal pot ser més curta que la de la connexió.
On s'utilitza RabbitMQ?
En el context dels microserveis, el protocol AMQP i la seva implementació a RabbitMQ sovint utilitzat per interacció asíncrona entre serveis.
En el context IIOT protocol AMQP i la seva implementació a RabbitMQ utilitzat per a l'intercanvi de dades entre servidors (servidor-servidor). També utilitzeu el connector Connector MQTT RabbitMQ que és una implementació del protocol MQTT per transmetre dades entre el sensor i el servidor en entorns de baixa velocitat i alta latència (una llista completa de protocols compatibles es troba a web del projecte).
En el següent article començarem a entendre els intercanvis amb més detall.