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".

...
<export>
    <configuration target="rabbit_target" enabled="true" type="rabbitmq">
        <property name="broker.host">localhost</property>
        <property name="exchange.name">voltdb_exchange</property>
    </configuration>
</export>
...
Estratto di deployment.xml

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"