Buongiorno, Habr! Voglio condividere un manuale di riferimento delle conoscenze che sono riuscito a raccogliere su RabbitMQ e condensare in brevi raccomandazioni e conclusioni.
Indice
- RabbitMQ. Parte 1. Introduzione. Erlang, AMQP e RPC
- RabbitMQ. Parte 2. Approfondiamo gli Exchanges
- RabbitMQ. Parte 3. Approfondiamo le Code e i Binding
- RabbitMQ. Parte 4. Comprendiamo cosa sono i messaggi e i frame
- RabbitMQ. Parte 5. Performance di pubblicazione e consumo dei messaggi
- RabbitMQ. Parte 6. Panoramica dei moduli Federation e Shovel
- RabbitMQ. Parte 7. Dettagli su Connessione e Canale
- RabbitMQ. Parte 8. RabbitMQ in .NET
- RabbitMQ. Parte 9. Monitoraggio
Brevemente su AMQP
AMQP (Advanced Message Queuing Protocol) è un protocollo aperto per la trasmissione di messaggi tra i componenti di un sistema. L'idea principale è che singole sottosistemi (o applicazioni indipendenti) possano scambiarsi messaggi in modo arbitrario attraverso un broker AMQP, che gestisce il instradamento, garantendo eventualmente la consegna, la distribuzione dei flussi di dati e l'iscrizione ai tipi di messaggi desiderati.
Protocollo AMQP introduce tre concetti:

exchange(punto di scambio o exchange) — a questo vengono inviati i messaggi. Il punto di scambio distribuisce il messaggio è collegato a una o più code. Esso instrada i messaggi nella coda in base alle relazioni create (binding) tra esso e la codaqueue(coda) — una struttura dati su disco o in memoria, che memorizza i riferimenti ai messaggi e restituisce copie dei messaggiconsumers(consumatori)binding(binding) — una regola che comunica al punto di scambio in quale coda questi messaggi devono essere inviati
Il protocollo funziona sopra .
Brevemente su Erlang
Il codice sorgente del progetto si trova nel repository su . Architettura si basa su e BEAM.
Erlangsviluppato dall'aziendaEricssona metà degli anni '80 come un sistema distribuito, tollerante ai guasti, in tempo reale per applicazioni che richiedono un funzionamento affidabile del 99,999%.Erlangviene utilizzato in vari settori e applicazioni moderne, come ad esempio
Brevemente su RabbitMQ
è un broker di messaggi open source. Instrada i messaggi secondo i principi fondamentali del protocollo descritti in . RabbitMQ implementa e arricchisce il protocollo AMQP.
L'idea principale del modello di messaggistica in RabbitMQ è che producer (publisher) non invia messaggi direttamente nella coda. In realtà, molto spesso il publisher non sa nemmeno se il messaggio verrà realmente consegnato a una qualsiasi coda.
Invece, il publisher può inviare messaggi solo a un exchange. Da un lato, l'exchange riceve messaggi dai publisher, dall'altro li invia in code. L'exchange 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 lavoro può essere riassunto come segue: RabbitMQ Il publisher invia un messaggio a un exchange specifico
- L'exchange, ricevuto il messaggio, lo instrada in una o più code in base alle regole di binding tra esso e la coda
- La coda conserva un riferimento a questo messaggio. Il messaggio stesso è memorizzato in memoria o su disco
- Appena il consumatore è pronto a ricevere il messaggio dalla coda, il server crea una copia del messaggio tramite il 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. Poi elimina dalla memoria e dal disco
- RPC (remote procedure call)
RPC
Processo . Ad esempio, le discussioni iniziali sui termini del cliente con RabbitMQ, dimostra un certo processo RabbitMQ. Non appena questa sequenza è completata, RPCsarà pronto a ricevere richieste dal cliente: RabbitMQ Inoltre, nella specifica

sia il cliente che il server possono invocare comandi. Ciò significa che il cliente attende di interagire con il server. I comandi sono classi e metodi. Ad esempio, AMQP Connection.Start – invocazione del metodo Connessioni e canali Avvia classe Connection.
Per tale scambio di informazioni tra cliente e server si utilizzano
canali . I canali vengono creati all'interno diuna connessione specifica . Ogni canale è isolato dagli altri canali. Nel caso sincrono non è possibile eseguire il comando successivo fino a quando non si riceve una risposta.Per poter inviare comandi in parallelo è necessario aprire più canali. Ogni canale crea un
processo separato. Una connessione può avere più canali ( Erlang multiplexingla memoria utilizzata da RabbitMQ per gestire tale connessione. Un semplice esempio di creazione di una connessione e di un canale utilizzando

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
}Non è consigliabile aprire una nuova connessione per ogni operazione, poiché questo porterà a costi elevati. Anche i canali devono essere costanti, ma molti errori di protocollo portano alla chiusura del canale, quindi la durata del canale può essere più breve rispetto 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 interazione asincrona tra i servizi.
Nel contesto di IIOT per l'invio di queste query e delle risposte ad esse. SPARQL è una raccomandazione AMQP e la sua implementazione in RabbitMQ viene utilizzato per lo scambio di dati tra server (server-server). Si utilizza anche il plugin che è un'implementazione del protocollo per la trasmissione dei dati tra il sensore e il server in ambienti a bassa velocità e con alta latenza (l'elenco completo dei protocolli supportati è riportato su ).
Nell'articolo seguente inizieremo a esplorare in dettaglio gli Exchanges.
Link
Fonte: habr.com
