Informazioni sulle operazioni non-bloccanti nella libreria client
MariaDB, a partire dalla versione 5.5.21, supporta le operazioni non-bloccanti nella libreria client. Questo permette a un'applicazione di iniziare una query o altre azioni su un database, e continuare a eseguire altri compiti (nello stesso thread) mentre la richiesta viene inviata attraverso la rete, la query viene elaborata dal server e il risultato viene rispedito al client. Man mano che porzioni del risultato sono pronte, l'applicazione può — a suo piacere — richiamare la ribreria, ripetendo questa azione finchè l'operazione non è completata.
Le operazioni non-bloccanti sono implementate interamente nella libreria client. Questo significa che non è necessario alcun supporto da parte del server e tali operazioni funzionano con qualsiasi versioni del server MariaDB o MySQL, esattamente come la normale API bloccante. Significa anche che non è possibile avere due query eseguite allo stesso tempo e nella stessa connessione (a causa di un limite del protocollo). Ma un singolo thread potrebbe lanciare un qualsiasi numero di query non bloccanti allo stesso tempo, ognuna delle quali utilizza un diverso oggetto connessione MYSQL.
Le operazioni non-bloccanti sono utili per le applicazioni che devono eseguire un certo numero di query indipendenti in parallelo allo stesso tempo, per eseguire certe operazioni più rapidamente di quanto potrebbero fare eseguendole in sequenza. Può trattarsi di diverse query eseguite su un solo server (per utilizzare meglio le core della CPU e/o un sistema di I/O ad alta capacità del server), o potrebbero essere query lanciate su server diversi (per esempio SHOW STATUS
su tutti i server per monitorarne il funzionamento, o un'operazione di mappamento su grandi database frammentati).
Le operazioni non-bloccanti servono anche alle applicazioni che sono già scritte in uno stile non-bloccante, per esempio grazie a un framework come libevent o, per esempio, un'applicazione GUI che utilizza un ciclo negli eventi. Usare la libreria client non-bloccante permette l'integrazione di query sui database in tali applicazioni, senza rischiare che comandi che richiedono molto tempo tengano bloccata l'interfaccia utente o il loop dell'evento, e senza dover creare manualmente dei thread separati per eseguire le query e ri-sincronizzare i thread per recuperare i risultati.
In questo contesto, "bloccante" sta a indicare indicare una situazione in cui le comunicazioni di rete al server devono attendere l'elaborazione di una query. L'attesa può essere necessaria perché il server non ha ancora avuto il tempo di eseguire il comando richiesto, o perché i dati devono essere inviati attraverso la rete dal server, o anche perché la prima parte di una lunga richiesta deve essere inviata in rete prima che i buffer dei socket locali possano accettare l'ultima parte. Ogni qual volta tale attesa sia necessaria, il controllo ritorna all'apprilazione. Essa eseguirà allora select()
o poll()
(o comandi simili) per sapere quando le condizioni di attesa sono soddisfarre, e quindi richiamare la libreria perché riprenda l'elaborazione.
Un programma di esempio è disponibile nei sorgenti di MariaDB:
tests/async_queries.c
Esso utilizza libevent
per eseguire un insieme di query in parallelo da un singolo thread/loop di un evento. E' un buon esempio su come integrare l'elaborazione di query non-bloccanti in un framework basato sugli eventi.
L'API non-bloccante nella libreria client è assolutamente opzionale. La nuova libreria è completamente compatibile - sorgenti e binari - con le applicazioni esistenti. Inoltre, le applicazioni che non usano le operazioni non-bloccanti non sono influenzate da esse, nè vi è un significativo calo delle performance a causa del supporto alle stesse.