ConillMQ. Part 1. Introducció. Erlang, AMQP

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:

ConillMQ. Part 1. Introducció. Erlang, AMQP

  • 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

El protocol funciona per sobre TCP / IP.

Breument sobre Erlang

El codi font del projecte es troba al repositori a GitHub. Arquitectura Servidor RabbitMQ basat en Erlang i FIG.

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.

ConillMQ. Part 1. Introducció. Erlang, AMQP

Treball breu RabbitMQ es pot descriure de la següent manera:

  1. L'editor envia un missatge a un intercanvi específic
  2. 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.
  3. La cua emmagatzema una referència a aquest missatge. El missatge en si s'emmagatzema a la memòria RAM o al disc
  4. 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
  5. El consumidor rep el missatge i envia la confirmació al corredor
  6. 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:

ConillMQ. Part 1. Introducció. Erlang, AMQP

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ó.

ConillMQ. Part 1. Introducció. Erlang, AMQP

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.

Referències

Font: www.habr.com

Afegeix comentari