RabbitMQ. Parte 1. Introduzione. Erlang, AMQP

Buongiorno, Habr! Voglio condividere un manuale di riferimento con le conoscenze che sono riuscito a raccogliere su RabbitMQ e a comprimere in brevi raccomandazioni e conclusioni.

Indice

  • RabbitMQ. Parte 1. Introduzione. Erlang, AMQP e RPC
  • RabbitMQ. Parte 2. Approfondiamo gli Exchanges
  • RabbitMQ. Parte 3. Approfondiamo Queues e Bindings
  • RabbitMQ. Parte 4. Approfondiamo che cosa sono i messaggi e i frame
  • RabbitMQ. Parte 5. Performance di pubblicazione e consumo dei messaggi
  • RabbitMQ. Parte 6. Panoramica sui moduli Federation e Shovel
  • RabbitMQ. Parte 7. Dettagli su Connection e Channel
  • RabbitMQ. Parte 8. RabbitMQ in .NET
  • RabbitMQ. Parte 9. Monitoraggio

Breve introduzione all'AMQP

L'AMQP (Advanced Message Queuing Protocol) è un protocollo aperto per la trasmissione di messaggi tra i componenti di un sistema. L'idea principale è che singole sotto-sistemi (o applicazioni indipendenti) possano scambiarsi liberamente messaggi tramite un broker AMQP, che effettua il routing, garantisce la consegna, distribuisce flussi di dati e consente la sottoscrizione ai tipi di messaggi desiderati.

Protocollo AMQP introduce tre concetti:

RabbitMQ. Parte 1. Introduzione. Erlang, AMQP

  • exchange (exchange) — cui vengono inviati i messaggi. L'exchange distribuisce il messaggio in una o più code. Essa instrada i messaggi alla coda sulla base delle relazioni create (binding) tra esso e la coda
  • queue (queue) — una struttura dati su disco o in memoria, che memorizza i riferimenti ai messaggi e restituisce copie dei messaggi consumatori (ai consumatori)
  • binding (binding) — una regola che comunica all'exchange in quale delle code questi messaggi devono andare

Il protocollo funziona sopra TCP/IP.

Breve introduzione a Erlang

Il codice sorgente del progetto si trova nel repository su GitHub. Architettura RabbitMQ-server è basata su Erlang e BEAM.

Erlang sviluppato dall'azienda Ericsson alla metà degli anni '80 come sistema distribuito, resistente ai guasti, in tempo reale per applicazioni che richiedono un'affidabilità del 99,999%. Erlang viene utilizzato in vari settori e applicazioni moderne, come ad esempio in WhatsApp. È possibile leggere di più nell'articolo l'architettura di WhatsApp, acquistata da Facebook per $19 miliardi

In breve su RabbitMQ

RabbitMQ è un broker di messaggi open source. Instrada i messaggi secondo i principi di base del protocollo AMQP descritti in specifiche. RabbitMQ implementa e completa il protocollo AMQP.

L'idea principale del modello di scambio di messaggi in RabbitMQ è che il produttore (pubblicatore) non invia messaggi direttamente in coda. In realtà, e molto spesso, il pubblicatore non sa nemmeno se il messaggio verrà consegnato a qualche coda.

Invece, il publisher può inviare messaggi solo al broker. Da un lato, il broker riceve messaggi dai publisher e, dall'altro, li invia alle code. Il broker deve sapere esattamente cosa fare con il messaggio ricevuto. Deve essere aggiunto a una coda specifica? Deve essere aggiunto a più code? O il messaggio deve essere ignorato.

RabbitMQ. Parte 1. Introduzione. Erlang, AMQP

Il funzionamento può essere descritto brevemente come segue: RabbitMQ può essere descritto nel seguente modo:

  1. Il publisher invia un messaggio a un broker specifico.
  2. Il broker, ricevuto il messaggio, lo instrada in una o più code secondo le regole di binding tra esso e la coda.
  3. La coda mantiene un riferimento a questo messaggio. Il messaggio stesso è memorizzato in memoria volatile o su disco.
  4. Non appena il consumatore è pronto a ricevere un messaggio dalla coda, il server crea una copia del messaggio in base al riferimento e lo invia.
  5. Il consumatore riceve il messaggio e invia una conferma al broker.
  6. Il broker, ricevuta la conferma, rimuove la copia del messaggio dalla coda. Successivamente, lo elimina dalla memoria e dal disco.

richiesta RPC

Processo RPC (remote procedure call) è alla base di praticamente tutte le interazioni con il kernel. RabbitMQ. Ad esempio, le prime discussioni sui termini del cliente con RabbitMQ, dimostra un processo specifico richiesta RPC. Una volta che questa sequenza è completata, RabbitMQ sarà pronta a ricevere richieste dal cliente:

RabbitMQ. Parte 1. Introduzione. Erlang, AMQP

Inoltre, nella specifica AMQP sia il cliente che il server possono invocare comandi. Ciò significa che il cliente si aspetta un'interazione con il server. I comandi sono classi e metodi. Ad esempio, Connection.Start – invocazione del metodo Inizia classe Connection.

Connessione e canali

Per tale scambio di informazioni tra cliente e server si utilizzano canali. I canali vengono creati all'interno di una connessione specifica. Ogni canale è isolato dagli altri canali. Nel caso sincrono, non è possibile eseguire il comando successivo fino a quando non viene ricevuta una risposta.

Per essere in grado di inviare comandi in parallelo, è necessario aprire più canali. Ogni canale crea un Erlang processo separato. Una connessione può avere molti canali (multiplexing). Per ogni canale ci sono determinate strutture e oggetti in memoria. Pertanto, maggiore è il numero di canali all'interno di una connessione, maggiore è la memoria utilizzata da RabbitMQ per gestire tale connessione.

RabbitMQ. Parte 1. Introduzione. Erlang, AMQP

Un esempio semplice di creazione di una connessione e di un canale utilizzando 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 
}

Aprire una nuova connessione per ogni operazione è fortemente sconsigliato, poiché questo porterà a costi elevati. I canali devono essere permanenti, ma molti errori di protocollo portano alla chiusura del canale, quindi la durata del canale può essere inferiore a quella della connessione.

Dove viene utilizzato RabbitMQ?

Nel contesto dei microservizi, il protocollo AMQP e la sua implementazione in RabbitMQ viene spesso utilizzato per l'interazione asincrona tra i servizi.

Nel contesto IIOT protocollo AMQP e la sua implementazione in RabbitMQ viene utilizzato per lo scambio di dati tra server (server-server). Si usa anche il plugin MQTT Plugin RabbitMQ che è un'implementazione del protocollo MQTT per la trasmissione di dati tra un sensore e un server in ambienti a bassa velocità con alta latenza (l'elenco completo dei protocolli supportati è riportato su sito del progetto).

Nell'articolo successivo inizieremo a esaminare più in dettaglio gli Exchanges.

Link

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster