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:

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 codaqueue(queue) — una struttura dati su disco o in memoria, che memorizza i riferimenti ai messaggi e restituisce copie dei messaggiconsumatori(ai consumatori)binding(binding) — una regola che comunica all'exchange in quale delle code questi messaggi devono andare
Il protocollo funziona sopra .
Breve introduzione a Erlang
Il codice sorgente del progetto si trova nel repository su . Architettura è basata su e BEAM.
Erlangsviluppato dall'aziendaEricssonalla metà degli anni '80 come sistema distribuito, resistente ai guasti, in tempo reale per applicazioni che richiedono un'affidabilità del 99,999%.Erlangviene utilizzato in vari settori e applicazioni moderne, come ad esempio in
In breve su RabbitMQ
è un broker di messaggi open source. Instrada i messaggi secondo i principi di base del protocollo descritti in . 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.

Il funzionamento può essere descritto brevemente come segue: RabbitMQ può essere descritto nel seguente modo:
- Il publisher invia un messaggio a un broker specifico.
- Il broker, ricevuto il messaggio, lo instrada in una o più code secondo le regole di binding tra esso e la coda.
- La coda mantiene un riferimento a questo messaggio. Il messaggio stesso è memorizzato in memoria volatile o su disco.
- 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.
- Il consumatore riceve il messaggio e invia una conferma al broker.
- Il broker, ricevuta la conferma, rimuove la copia del messaggio dalla coda. Successivamente, lo elimina dalla memoria e dal disco.
richiesta RPC
Processo è 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:

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 (). 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.

Un esempio semplice di creazione di una connessione e di un canale utilizzando :
// ...
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 che è un'implementazione del protocollo 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 ).
Nell'articolo successivo inizieremo a esaminare più in dettaglio gli Exchanges.
Link
Fonte: habr.com
