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 cuaqueue(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 missatgesconsumers(al consumidor)binding(vinculant) - una regla que indica al punt d'intercanvi a quina cua haurien d'anar aquests missatges
El protocol funciona per sobre .
Breument sobre Erlang
El codi font del projecte es troba al repositori a . Arquitectura basat en i FIG.
Erlangdesenvolupat per l'empresaEricssona 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%.Erlangutilitzat en diverses indústries i aplicacions modernes, p.
Breument sobre RabbitMQ
és un corredor de missatges de codi obert. Encamina els missatges al llarg de tots els principis bàsics del protocol descrit a . 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 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 (). 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 :
// ...
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 que és una implementació del protocol 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 ).
En el següent article començarem a entendre els intercanvis amb més detall.
Referències
Font: www.habr.com
