RabbitMQ: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m modifiche di ortografia |
Recupero di 1 fonte/i e segnalazione di 0 link interrotto/i.) #IABot (v2.0.9.5 |
||
(39 versioni intermedie di 19 utenti non mostrate) | |||
Riga 1:
{{Software
|Nome = RabbitMQ
Line 6 ⟶ 5:
|Didascalia =
|Sviluppatore = [[Pivotal]]
|UltimaVersione =
|DataUltimaVersione =
|UltimaVersioneBeta =
|DataUltimaVersioneBeta =
Line 16 ⟶ 15:
|Lingua = Inglese
}}
'''RabbitMQ''' è un [[message-oriented middleware]] (detto anche [[broker di messaggistica]]) che
Un ''[[
== Storia ==
''“LShift and CohesiveFT have launched RabbitMQ, a complete open source implementation of Advanced Message Queuing Protocol (AMQP), the emerging standard for high performance enterprise messaging.”''<ref>{{Cita web|url=https://www.rabbitmq.com/resources/RabbitMQ_PressRelease_080207.pdf|titolo=Launch of RabbitMQ Open Source Enterprise Messaging}}</ref>
Nel Febbraio 2007
Nell'aprile 2010 è stata acquistata da SpringSource, una divisione di [[VMware Inc.|VMware]], che ha aggiunto il sistema di messaggistica aperta RabbitMQ nella sua suite di tecnologie che riducono la complessità associata allo sviluppo, all'implementazione e alla gestione delle applicazioni aziendali. Tuttavia i termini dell'accordo non sono stati divulgati.
== Descrizione ==
Un broker di messaggi è un modello
Lo scopo principale di un broker è di prendere i messaggi in arrivo dalle applicazioni ed eseguire alcune azioni su di essi. Ad esempio, un broker di messaggi può essere utilizzato per gestire una coda di carico di lavoro o una coda di messaggi per più ricevitori, fornendo memoria affidabile, con una consegna di messaggi garantita.
Nel tipico scenario dello scambio di messaggi, RabbitMQ introduce, oltre la presenza del
Tale implementazione differisce dal precedente scenario definito dal [[Java Message Service|JMS]], nel quale si ha la presenza dei tre elementi sopracitati ed in cui si applica un metodo di transito [[FIFO]] in una singola coda.
Con RabbitMQ il Publisher non invia più il messaggio direttamente alla coda, ma passa per l’Exchange, il quale crea la comunicazione con la coda attraverso un legame detto
[[File:Esempio_di_funzionamento_RabbitMQ.png|miniatura|Differenza tra RabbitMQ e JMS: nel RabbitMQ viene introdotto l'Exchange, per mediare lo scambio di messaggi tra il Publisher e una coda, associata ad uno specifico consumatore.|
RabbitMQ offre la possibilità di utilizzare diversi tipi di
▲RabbitMQ offre la possibilità di utilizzare diversi tipi di '''Exchange''' al fine di soddisfare i differenti bisogni. Tuttavia si possono delineare tre principali categorie:
* Fanout
Line 49 ⟶ 44:
* Topic
Ognuna di queste categorie definisce un diverso comportamento rispetto a come viene indirizzato il messaggio dall’Exchange alle code. Utilizzando l’Exchange viene a determinarsi un sistema definito
=== Fanout ===
[[File:Fanout_model.png|miniatura|
Lo scambio Fanout trasmette tutti i messaggi ricevuti a tutte le code che conosce.
Una volta che il Publisher pubblica un messaggio, questo viene lavorato dall’Exchange che lo inoltra a tutte le code sottoscritte a lui.
=== Direct ===
[[File:Direct_model.png|miniatura|
Nello scambio diretto, il messaggio viene inoltrato alle code la cui chiave di associazione corrisponde esattamente alla
Nell'esempio, Q1
Se l’Exchange riceve il messaggio con la chiave di Routing ''Orange'', invia il messaggio a Q1 e
Se l’Exchange riceve il messaggio con la chiave di Routing ''Yellow'', invia un messaggio a
Infine se l’Exchange riceve il messaggio con la chiave di Routing ''Green'' lo inoltra a
==== Fanout VS Direct ====
Nel Fanout i messaggi vengono inviati a tutte le code che sono legate all'Exchange senza verificare le
=== Topic ===
L'Exchange Topic è una sintesi dei
Nel modello Topic si instradano i messaggi verso una o più code in base al modello utilizzato per associare una coda all'Exchange. Quest’ultimo tipo di scambio lascia maggiore libertà nello specificare le chiavi di legame permettendo l’utilizzo dei cosiddetti jolly (o wildcards). Il primo è il carattere "'''*
I messaggi del modello Topic inviati a un Exchange non possono avere una Routing key arbitraria, ma deve essere un elenco di parole, delimitato da punti. Esempi validi di chiavi di Routing key sono "''stock.usd.nyse''", "''nyse.vmw''", "''quick.orange.rabbit''".
Le code possono essere collegate con l’Exchange usando modelli come
[[File:Topic_model.png|miniatura|
Facendo riferimento all'immagine che riporta un esempio di comportamento del modello Topic, tre differenti code vengono identificate dalla loro ''Binding key.'' Se il messaggio che arriva all’Exchange presenta una Routing key come “''shape''”, esso verrà inviato alla terza coda che rispetta esattamente il matching e alla seconda coda poiché nel proprio pattern è presente sia shape che il carattere "#", ovvero zero o più parole. Al contrario la prima coda non rispetta il matching poiché la struttura della sua chiave di legame richiede la presenza di due parole (di cui una deve essere ''shape'').
Line 89 ⟶ 82:
Per ottenere il comportamento di un Exchange Fanout dobbiamo utilizzare come Binding Key il semplice "#", che permette l’instradamento a prescindere dalla Routing Key poiché vi è sempre il matching con zero o più parole.
== RabbitMQ nei Data Center<ref>{{Cita web|url=http://fullstackmastery.com/2018/03/12/free-course-improve-design-architecture-rabbitmq/|titolo=fullstackmastery|accesso=25 maggio 2018|urlarchivio=https://web.archive.org/web/20180525204743/http://fullstackmastery.com/2018/03/12/free-course-improve-design-architecture-rabbitmq/|dataarchivio=25 maggio 2018|urlmorto=sì}}</ref> ==
Un cluster RabbitMQ è un [[Computer cluster|cluster]]<ref>{{Cita pubblicazione|autore=Maciej Rostanski ; Krzysztof Grochla ; Aleksander Seman|titolo=Evaluation of highly available and fault-tolerant middleware clustered architectures using RabbitMQ|rivista=|volume=|numero=}}</ref>
Nel cluster RabbitMQ, gli scambi e le configurazioni vengono replicati su tutti i nodi al fine di ottenere HA.
Per ottenere un cluster HA, è necessario disporre di
La soluzione migliore è rappresentata dal [[trade-off]] dei due scenari analizzati precedentemente, garantendo una copia del messaggio su tutti i nodi e dunque maggiore affidabilità.
=== Esempio<ref>{{Cita web|url=https://insidethecpu.com/2014/11/17/load-balancing-a-rabbitmq-cluster/|titolo=Load Balancing a RabbitMQ Cluster}}</ref> ===
In un cluster RabbitMQ HA con bilanciamento del carico, in cui le code rappresentano strutture singolari, ovvero che non esistono su più di un nodo, si ha lo scenario di seguito descritto. I nodi 1 e 3 vengono replicati, in modo tale che le istantanee di tutte le code compatibili con HA siano sincronizzate su ciascun nodo. Viene creata una nuova coda che, essendo il [[Load balancing|Load Balancer]] schedulato in modalità [[Schedulazione
La politica HA richiede di replicare la coda su tutti i nodi presenti nel cluster. Nel momento in cui vengono aggiunti messaggi alla coda, essi vengono replicati su ciascun nodo. In sostanza, viene eseguita un'istantanea della coda replicata su ciascun nodo attraverso un'attività in background asincrona, ogni qual volta lo stato della coda cambia. Quindi, collegandosi a RabbitMQ e puntando a "NewQueue", Load Balancer indirizza ad un nodo appropriato. Si può assumere di essere connessi all'istanza di "NewQueue" che risiede su quel nodo.
Tuttavia non è questo il caso. Infatti si deve sempre tenere a mente che una coda RabbitMQ è una struttura singolare, cioè esiste solo sul nodo su cui è stata creata, indipendentemente dal criterio HA. Una coda sarà sempre master ed avrà associati da ''0
Supponendo che il nodo 2 “muoia”, tecnicamente esso non restituisce un ''heartbeat'' ed è considerato disaggregato. In tale scenario la coda master "NewQueue" non è più disponibile, quindi RabbitMQ promuove l'istanza dello slave "NewQueue" sul nodo 1 o 3. Questo
Nonostante il fatto che le code siano replicate su ciascun nodo, esiste una sola istanza disponibile di ogni coda e risiede sul nodo su cui è stata creata o, in caso di errore, sull'istanza che viene promossa come master.
Per garantire l’instradamento di ogni richiesta al nodo corretto, ci sono due possibilità:
Line 114 ⟶ 109:
# Distribuire le code in modo uniforme nei nodi.
Nel primo caso, l’applicazione client deve essere a conoscenza di tutti i nodi nel cluster RabbitMQ e deve
La seconda soluzione offre un design in cui le code non sono collegate a nodi singoli. Tornando all’esempio, vengono istanziate 3 code
==Esempi==
Line 122 ⟶ 117:
===Invio===
Il seguente codice stabilisce una connessione, controlla l'esistenza della coda, invia il messaggio
<
#!/usr/bin/env python
import pika
Line 133 ⟶ 128:
print(" [x] Sent 'Hello World!'")
connection.close()
</syntaxhighlight>
===Ricezione===
Il seguente codice stabilisce una connessione, controlla l'esistenza della coda, riceve il messaggio e lo stampa a schermo:
<
#!/usr/bin/env python
import pika
Line 149 ⟶ 144:
channel.basic_consume(callback, queue='hello', no_ack=True)
channel.start_consuming()
</syntaxhighlight>
== Note ==
<references />▼
== Bibliografia ==
* https://www.3pillarglobal.com/insights/rabbitmq-understanding-message-broker {{Webarchive|url=https://web.archive.org/web/20161102173706/http://www.3pillarglobal.com/insights/rabbitmq-understanding-message-broker |date=2 novembre 2016 }}
* [https://www.packtpub.com/application-development/rabbitmq-essentials RabbitMQ Essentials] - David Dossot - April 2014 - Packt Publishing▼
* https://derickbailey.com/categories/rabbitmq/ {{Webarchive|url=https://web.archive.org/web/20160525013619/http://derickbailey.com/categories/rabbitmq/ |date=25 maggio 2016 }}
* https://web.archive.org/web/
* https://www.youtube.com/watch?v=XjuiZM7JzPw▼
* https://web.archive.org/web/20180525204743/http://fullstackmastery.com/2018/03/12/free-course-improve-design-architecture-rabbitmq/▼
* https://web.archive.org/web/20130602054940/http://www.rabbitmq.com/news.html
* https://compose.com/databases/rabbitmq {{Webarchive|url=https://web.archive.org/web/20180520124500/https://compose.com/databases/rabbitmq |date=20 maggio 2018 }}
== Voci correlate ==
*[[Apache
*[[HornetQ]]
*[[Apache Qpid]]
*[[Advanced Message Queuing Protocol]]
*[[MQTT]]
*[[Streaming Text Oriented Messaging Protocol|STOMP]] (RabbitMQ supporta STOMP)<ref>{{Cita web|url=https://www.rabbitmq.com/docs/stomp|titolo=STOMP Plugin {{!}} RabbitMQ|sito=www.rabbitmq.com|lingua=en|accesso=2024-09-25}}</ref>
*[[Centro elaborazione dati
== Altri progetti ==
{{Portale|informatica}}▼
{{interprogetto}}
==
*
▲{{Portale|informatica}}
▲* [https://www.packtpub.com/application-development/rabbitmq-essentials RabbitMQ Essentials] - David Dossot - April 2014 - Packt Publishing
▲* https://www.youtube.com/watch?v=XjuiZM7JzPw
▲* http://www.rabbitmq.com/getstarted.html
▲* http://fullstackmastery.com/2018/03/12/free-course-improve-design-architecture-rabbitmq/
▲* https://web.archive.org/web/20130602054940/http://www.rabbitmq.com/news.html
▲* Joern Barthel (2009-09-13). "[https://www.infoq.com/articles/AMQP-RabbitMQ Getting started with AMQP and RabbitMQ]"
▲== Collegamenti Esterni ==
▲<references />
|