Introduzione al protocollo AMQP
AMQP (Advanced Message Queuing Protocol) è un protocollo standard a livello applicativo che fornisce servizi di messaggistica unificata ed è uno standard aperto per protocolli a livello applicativo progettato per middleware orientati ai messaggi. AMQP è un protocollo di rete per il passaggio di messaggi asincroni tra processi.
I client e il middleware dei messaggi basati su questo protocollo possono consegnare messaggi senza essere limitati da diversi prodotti client/middleware, linguaggi di sviluppo differenti, ecc.
Le principali caratteristiche di AMQP sono orientata ai messaggi, coda, routing (inclusi peer-to-peer e publish/subscribe), affidabilità e sicurezza. AMQP impone il comportamento dei provider di messaggi e dei client, consentendo una vera interoperabilità tra diversi fornitori.
AMQP e JMS
JMS fu un tentativo di standardizzare il middleware dei primi messaggi, era standardizzato solo a livello API e era ben lontano dall'offrire interoperabilità.
A differenza di JMS, AMQP è un protocollo a livello di filo che descrive il formato dei dati trasmessi su una rete, scorrendo in byte. Di conseguenza, qualsiasi strumento che aderisce a questo formato dati, che crea e interpreta messaggi, è interoperabile con altri strumenti compatibili.
Composizione del nucleo AMQP
Produttore
Notizie sulla produzione.
ConnectionFactory
La fabbrica che produce Connection.
Connessione
Connessione, connessione di rete applicativa con Broker TCP/IP/Triple Handshake e Quad Wave.
Le connessioni AMQP sono solitamente lunghe. AMQP è un protocollo a livello applicativo che utilizza TCP per fornire una consegna affidabile. AMQP utilizza meccanismi di autenticazione e fornisce protezione TLS (SSL). Quando un'applicazione non deve più connettersi al proxy AMQP, deve rilasciare la connessione AMQP in modo graduale invece di semplicemente spegnere la connessione TCP.
Canale
Il canale di rete è una connessione leggera costruita sopra la Connection. Quasi tutte le operazioni vengono eseguite nei Canali, che sono canali per la lettura e scrittura dei messaggi, e i client possono stabilire coppie per ogni canale, ognuno dei quali rappresenta un compito di sessione.
Se la connessione viene confrontata con un cavo in fibra ottica, allora il canale del canale viene confrontato con una delle fibre di un cavo in fibra ottica. Su una connessione può essere creato un numero qualsiasi di canali.
La maggior parte delle nostre operazioni aziendali avviene nell'interfaccia Channel, tra cui:
- queueDeclare
- Lo exchangeDeclare per lo switch
- queueBbinding queueBind
- Pubblica il messaggio di basePubblica
- Notizie per consumatori basibasicConsume, ecc.
Intermediario
Accettare la connessione del client per implementare i servizi di entità AMQP, come rabbitmq.
VirtualHost (Hosting web)
L'hosting virtuale, usato per l'isolamento logico, può avere diversi exchange e code, e lo stesso host virtuale non può avere exchange con lo stesso nome.
Per implementare più ambienti isolati (utenti, gruppi di utenti, switch, code, ecc.) su un unico proxy, AMQP fornisce il concetto di host virtuali (host virtuali - vhosts). Questo è molto simile al concetto di web server di hosting web, che fornisce un ambiente completamente isolato per le entità AMQP. Quando la connessione viene stabilita, il client AMQP specifica quale host virtuale utilizzare.
Sostituzione
Lo switch accetta messaggi e invia messaggi alla coda vincolata in base alla chiave di routing (senza capacità di memorizzazione dei messaggi).
Uno switch è un'entità AMQP utilizzata per inviare messaggi. Dopo che lo switch riceve un messaggio, lo instrada verso una o zero code. L'algoritmo di routing utilizzato è determinato dal tipo di switch e dalle regole di lego.
Tipo di interruttore:
- Scambio diretto
- Scambio di fanout
- Scambio di argomenti
- Scambio di header
Proprietà degli interruttori:
- Nome: Il nome dello switch
- Durabilità: Un flag di persistenza che indica se questo interruttore è mantenuto o meno
- Cancellazione automatica: flag di cancellazione, indicazioneQuando tutte le code sono completate usando questo scambio, o meno vengono eliminate
- Argomenti: Dipendente dall'agente stesso
Stato dello scambio:
Gli switch persistenti esisteranno dopo il riavvio del broker, mentre gli staging switch no (dovranno essere ridichiarati dopo che il broker sarà di nuovo online).
Interruttore predefinito
Lo scambio predefinito è in realtà uno scambio diretto pre-dichiarato dal broker di messaggi e senza nome (il nome è una stringa vuota).
Puoi pensare all'interruttore predefinito come a uno speciale a collegamento diretto. Nome dello switch predefinito: Null string (AMQP predefinito) Tipo di interruttore predefinito: Interruttore collegato direttamente
Quando si crea una coda, finché lo switch da associare non è specificato, questo sarà automaticamente associato allo switch predefinito e il nome della chiave di routing del binding sarà lo stesso del nome della coda.
Collegamento diretto allo switch
Uno switch collegato direttamente consegna i messaggi a una coda di chiavi di binding corrispondenti basate sulla chiave di routing trasportata dal messaggio. Il routing unicast usato dallo switch diretto per gestire il messaggio.
Quando si crea una Coda, se è legata a uno switch diretto, non è necessario specificare il nome della chiave di instradamento, perché avrà un nome predefinito della chiave di instradamento, che è lo stesso del nome della Coda.
Una coda di switch collegati direttamente tipicamente distribuisce le attività a più consumatori in un ciclo (questo lo chiamiamo polling).
Flusso di lavoro:
- Quando si lega una coda a uno switch, si assegna una chiave di binding, assumendo R;
- Quando un messaggio con una Chiave di Instradamento viene inviato a uno switch collegato direttamente, lo switch lo instrada verso una coda con una Chiave di Instradamento.
Interruttori delle ventole
Il fan switch invoglia i messaggi a tutte le code ad esso associate, indipendentemente dalla chiave di routing associata.
Se N code sono legate a uno switch di settore, quando un messaggio viene inviato a questo commutatore di settori, lo switch invia una copia del messaggio a tutte le N code separatamente. Gli interruttori a ventola sono generalmente utilizzati per gestire il routing broadcast dei messaggi.
Scenari applicabili:
trasmette messaggi; Funzione chat di gruppo.
Cambio tema
Il cambio di argomento invia messaggi a una o più code in base alla chiave di routing e al tipo di Exchange, e spesso lo usiamo per implementare varie sottoscrizioni di pubblicazione/abbonamento, cioè abbonamenti a pubblicazione.
Le regole di routing per gli switch collegati direttamente sono strettamente abbinate, il che significa che la Chiave di Instradamento deve corrispondere alla Chiave di Binding prima di inviare un messaggio alla Coda. Le regole di routing del topic switch sono partite fuzzy che possono essere eseguite soddisfacendo alcune regole tramite jolly.
Essa stabilisce:
- Possono esserci due caratteri speciali * e # nel tasto di assegnazione per il fuzzy matching. dove * è usato per corrispondere a una parola, #用于匹配多个单词 (può essere zero)
- Una chiave di routing è una stringa separata da punti (chiamiamo ogni singola stringa separata da un punto segnato una parola)
- Quando il produttore invia il messaggio Chiave di Instradamento=A.A.A, solo A.*.* viene soddisfatto, e verrà instradato solo alla coda1.
- Quando il produttore invia il messaggio Chiave di Instradamento=A.B.A, che soddisfano A.*.* e *.B.* verranno instradati verso la coda1 e la coda2.
- Quando il produttore invia il messaggio Chiave di Instradamento=A.B.C, allora A.*.* e *.B.* e *.* sono soddisfatti. C viene indirizzato verso la coda 1, la coda 2, la coda 3.
Scenari applicabili:
- aggiornamenti di notizie che coinvolgono categorie o tag;
- Compiti in background eseguiti da più lavoratori, ognuno dei quali è responsabile di gestire determinati compiti specifici.
Interruttore della testa
Gli switch header non si basano sulle regole di abbinamento della chiave di routing per associare le chiavi per instradare i messaggi, ma piuttosto sull'attributo header nel contenuto del messaggio inviato.
Gli interruttori a testa possono essere considerati un'altra manifestazione di un interruttore a collegamento diretto. Tuttavia, la chiave di routing di uno switch diretto deve essere una stringa, e i valori degli attributi dell'intestazione non sono vincolati da questo, possono anche essere interi o valori hash (dizionari), ecc. Più flessibilità (ma in pratica usiamo raramente gli interruttori della testa).
Flusso di lavoro:
- Quando una coda è vincolata a uno switch di header, più header sono assegnate contemporaneamente per il matching di qualità.
- I messaggi in arrivo portano un'intestazione e un parametro "x-match". Quando "x-match" è impostato su "any", qualsiasi valore dell'intestazione può essere abbinato, e quando "x-match" è impostato su "all", tutti i valori dell'intestazione devono essere abbinati.
Riassunto dello switch
Rilegatura
Connessione virtuale tra Exchange e Coda.
BindingKey è una descrizione di regole per i binding Exchange e Queue. La chiave di binding specifica quale tipo di Chiave di Routing sarà assegnata alla Coda attualmente vincolata nell'attuale scambio.
Chiave di instradamento
Regole di instradamento, che la macchina virtuale può utilizzare per determinare come instradare un particolare messaggio.
Chiave di Binding vs. Chiave di Routing
- La chiave di binding è la chiave di binding tra la coda e lo switch;
- La Chiave di Routing è un'informazione inviata dal produttore allo switch;
- Quando la Chiave di Binding e la Chiave di Routing corrispondono, inserisci il messaggio nella coda corrispondente.
Binding Key è la descrizione della regola di Exchange e Binding Queue, utilizzata per analizzar quando Exchange riceve un messaggio; il messaggio ricevuto da Exchange avrà un campo Routing Key, e Exchange abbina questa Chiave di Routing a tutte le Binding dell'Exchange corrente, e se i requisiti sono soddisfatti, verrà inviata al Binding La chiave è vincolata alla Coda per inviare il messaggio.
Binding Key vs. Routing Key in vari switch
Switch predefinito: Binding Key è il nome della coda, che non può essere personalizzato. La Chiave di Instradamento è anche il nome della coda prima che possa essere instradata con successo alla coda Commutatore di connessione diretta: Binding Key è il nome della coda, che può essere personalizzato. Le Chiavi di Routing possono essere instradate con successo alla coda solo quando la Chiave di Binding è la stessa Interruttore della ventola: Nessuna tasta di associazione; Ovviamente, non esiste una Chiave di Instradamento. Instradato automaticamente a tutte le code legate allo switch Cambio tema: tasto di assegnazione personalizzato; Personalizza la chiave di instradamento. Chiave di Instrada==Binding Key, e la corrispondenza fuzzy deve essere instradata con successo alla coda Interruttore della testa: nessun tasto di associazione; Ovviamente, non esiste una Chiave di Instradamento. Corrispondenze basate sull'attributo delle intestazioni nel contenuto del messaggio inviato
Coda
Memorizza i messaggi che stanno per essere consumati dall'app.
Proprietà della coda:
- Nome: Il nome della coda
- Durevole: La coda esiste ancora dopo che il broker di messaggi è stato riavviato
- Esclusivo: Utilizzato da una sola connessione, e la coda viene eliminata quando la connessione viene chiusa
- Cancellazione automatica: Cancellata quando l'ultimo consumatore si disiscrive
- Argomenti: Alcuni broker di messaggi lo usano per svolgere alcune funzioni aggiuntive simili a TTL
Creazione della coda: Le code possono essere usate solo dopo essere state dichiarate. Se una coda non esiste già, dichiararne una crea la creazione. Se la coda dichiarata esiste già e gli attributi sono identici, la dichiarazione non ha effetto sulla coda originale. Se gli attributi nella dichiarazione differiscono da quelli nella coda esistente, viene lanciata un'eccezione a livello di canale con codice di errore 406.
Persistenza della coda: La coda di persistenza viene memorizzata su disco e rimane lì quando il broker viene riavviato. Le code che non vengono persistite sono chiamate code transitorie. Non tutti gli scenari e casi richiedono la persistenza della coda.
Una coda persistente non rende persistenti i messaggi instradati ad essa. Se l'agente dei messaggi si blocca e viene riavviato, la coda di persistenza verrà ridichiarata durante il riavvio e, in ogni caso, solo i messaggi persistenti possono essere ripristinati.
Consumatore
Notizie sul consumo dei consumatori. In AMQP, ci sono due modi per i consumatori di ricevere messaggi in sospeso:
Il middleware per messaggi consegna messaggi ai consumatori (push API) I consumatori ricevono attivamente messaggi (pull API) Nota: Quando più consumatori ascoltano la stessa coda, i messaggi in coda saranno consumati solo da uno dei consumatori (non una volta per ciascun consumatore)
Messaggio
I dati trasmessi tra messaggi, servizi e applicazioni sono costituiti da Proprietà e corpi.
Gli attributi modificano i messaggi, come priorità del messaggio, ritardo e altre funzionalità avanzate, e il corpo principale è il contenuto del corpo del messaggio.
Proprietà del messaggio:
- Tipo di contenuto
- Codifica dei contenuti
- Chiave di instradamento
- Modalità di consegna (persistente o meno)
- Modalità di consegna (persistente o non persistente)
- Priorità del messaggio
- Timestamp di pubblicazione dei messaggi
- Periodo di scadenza
- ID applicazione dell'editore
Corpo del messaggio: Oltre agli attributi, i messaggi AMQP contengono anche un payload (i dati che il messaggio effettivamente trasporta), che viene trattato dal proxy AMQP come un array opaco di byte.
Il broker di messaggi non ispeziona né modifica il payload. I messaggi possono contenere solo attributi senza portare un payload. Tipicamente utilizza dati in formato serializzato come JSON e, per risparmiare, i buffer di protocollo e i MessagePack serializzano i dati strutturati per la pubblicazione come payload di messaggi. AMQP e i suoi pari tipicamente utilizzano i campi "content-type" e "content-encoding" per comunicare con i messaggi e identificare i payload, ma ciò si basa solo sulle convenzioni.
Persistenza del messaggio: I messaggi vengono pubblicati in modo persistente e l'agente AMQP memorizza questo messaggio su disco. Se il server viene riavviato, il sistema conferma che il messaggio di persistenza ricevuto non è andato perso.
Semplicemente inviare un messaggio a uno switch persistente o instradarlo in una coda persistente non rende il messaggio persistente: la persistenza del messaggio dipende interamente dalla modalità di persistenza del messaggio stesso.
Pubblicare messaggi in modo persistente può avere un impatto sulle prestazioni.
Processo di lavoro AMQP
L'Editore pubblica un messaggio tramite lo Exchange.
Lo switch distribuisce i messaggi in ingresso alla coda vincolata allo switch secondo le regole di routing.
Infine, l'agente AMQP consegnerà il messaggio al consumatore che si è iscritto a questa coda, oppure il consumatore lo riceverà autonomamente secondo necessità.
Meccanismo di messaggistica AMQP
Conferma del messaggio
I consumatori occasionalmente non riescono a elaborare i messaggi o a volte si bloccano direttamente. E anche le ragioni di rete possono causare vari problemi. Questo ci pone la domanda su quando sia il momento giusto per gli agenti AMQP di eliminare i messaggi.
Le due modalità di conferma dei messaggi dell'AMQP:
Modalità di conferma automatica: Elimina il messaggio non appena viene inviato al consumatore dal middleware del messaggio. (Usando il metodo AMQP: basic.deliver o basic.get-ok) Modalità di conferma esplicita: Aspettare che il consumatore invii un conferma prima di cancellare il messaggio. (Usando il metodo AMQP: basic.ack) Se un consumatore riattacca senza inviare una ricevuta di conferma, l'agente AMQP riconsegna il messaggio a un altro consumatore. Se non ci sono consumatori disponibili in quel momento, il broker di messaggi aspetta che il prossimo consumatore si registri in questa coda e poi prova a consegnare di nuovo.
Rifiuta i messaggi
Quando un consumatore riceve un messaggio, il processo di elaborazione può avere successo o fallire. Il consumatore può indicare al broker di messaggi (middleware dei messaggi) che il messaggio non è stato elaborato (o non si è completato a questo punto) a causa di un "messaggio rifiutato". Quando un messaggio viene rifiutato, il consumatore può dire al broker di messaggi cosa fare con il messaggio: distruggerlo o rimetterlo in coda.
Quando c'è un solo consumatore in questa coda, assicurati di non rifiutare il messaggio e scegliere di rimetterlo in coda, facendo sì che il messaggio rimanga in loop indefinitamente sullo stesso consumatore.
In AMQP, il metodo base.reject viene utilizzato per eseguire l'operazione di rifiuto dei messaggi. Tuttavia, basic.reject ha una limitazione: non puoi usarlo per rifiutare più messaggi con confermi. Ma se usi RabbitMQ, puoi usare l'estensione AMQP 0-9-1 chiamata confermani negativi (chiamati anche nacks) per risolvere questo problema.
Originale:Il login del link ipertestuale è visibile.
|