Export VoltDB su RabbitMQ
Una delle tante cose notevoli che VoltDB è in grado di fare è inviare nativamente messaggi verso un exchange RabbitMQ, mediante semplici operazioni SQL che possono essere inserite in qualunque stored procedure.
Per attivare questa funzionalità è necessario svolgere due passi:
- Creare un target, che punti al nostro broker RabbitMQ.
- Creare, utilizzando il target creato, uno o più stream.
Il target è l'anello di congiunzione tra VoltDB e il mondo esterno (in questo caso, il nostro broker RabbitMQ). E' definito nel file di configurazione deployment.xml. Nell'esempio sotto, viene definito un target denominato "rabbit_target" che punta a un broker in localhost e invia messaggi su un exchange denominato "voltdb_exchange".
Nota: l'exchange deve esistere prima dell'utilizzo.
Altra nota: è necessario fornire a VoltDB la libreria Java con il client ufficiale di RabbitMQ; questo file va scaricato e copiato nella cartella lib/extension:
cd cartellavoltdb/lib/extension
wget https://repo1.maven.org/maven2/com/rabbitmq/amqp-client/5.9.0/amqp-client-5.9.0.jar
Su un target possono essere costruiti uno o più stream. Lo stream altro non è che una specie di tabella virtuale, sulla quale possono essere svolte solo operazioni di INSERT. Lo stream si crea a runtime mediante comandi SQL come una qualunque tabella.
create stream prova
partition on column colonna1 --facoltativo
export to target rabbit_target (
colonna1 varchar not null, -- se presente il partition on
colonna2 integer
)
Quando si effettua un insert nella tabella prova, i campi inseriti vengono inviati all'exchange RabbitMQ sotto forma di messaggio di testo i cui componenti sono separati da virgola. I primi sei elementi sono informazioni interne ad uso di VoltDB e possono essere ignorati (potrebbero essere disattivati, ma per compatibilità con possibili sviluppi futuri conviene lasciarli attivi).
Il partizionamento non è necessario per questo utilizzo. Nel nostro caso serve solo a specificare la colonna il cui valore è usato per costruire la seconda parte della routing key utilizzata da VoltDB per pubblicare il messaggio su RabbitMQ (la prima parte è sempre uguale al nome della tabella). Se non viene specificato il valore usato è un numerico.
insert into prova values ('ciao', 1000)
// Routing key
PROVA.2 //senza partition by
PROVA.ciao //con partition by column colonna1
// Payload messaggio
"3619649763033090","1587471016689","1","2","8589934592","1","ciao","1000"