Sto esplorando come potrei creare un registro di scrittura in anticipo. Il mio caso d'uso è per operazioni come:
- Registra messaggi (INFO, DEBUG, ecc.)
- Upload di file
Dove scriverei le informazioni che rappresentano il messaggio di registro o un caricamento di file nel WAL, quindi tentare di svuotare il messaggio nella sua destinazione finale. In effetti quello che sono dopo è una coda persistente. Ho pensato che un WAL si adattava qui e dovrebbe essere facilmente implementato senza dipendenze aggiuntive, forse ho torto, quindi il feedback è apprezzato, poiché la mia applicazione dovrebbe essere in grado di continuare / ripristinare in caso di interruzione di corrente o qualche altro crash.
Il mio dispositivo in questo caso è un chiosco, quindi sarà praticamente solo al mondo da solo a canticchiare finché non accadrà qualcosa di brutto: qualcuno lo scollegherà accidentalmente per esempio e alla fine verrà riacceso. Ho capito che il WAL si adatta allo scenario per il ripristino all'avvio dell'applicazione.
A tal fine, considero System.IO.MemoryMappedFiles.MemoryMappedFile
come una potenziale soluzione di implementazione.
Quello che ho abbozzato finora è l'esecuzione di maniglie da 2 mmap.
- il WAL
- un indice sul WAL
L'intestazione dell'indice memorizzerebbe l'HEAD corrente e il COMMIT corrente. Sto usando COMMIT qui per significare "sì, tutto fino a questo punto è stato gestito con successo"
Ogni punto indice dopo HEAD e COMMIT memorizzerebbero la posizione dei dati WAL nel file WAL.
quindi l'indice sarebbe simile a qualcosa (ogni voce indice rappresenta un int per 4 byte):
Head Commit Index 0 Index 1
v v v v
00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 58
La voce di registro 0 inizia dal byte 0 nel file WAL
La voce di registro 1 inizia dal byte 88 nel file WAL
Quindi leggere una voce dal WAL sarebbe una questione di leggere l'indice N per ottenere l'inizio dell'intervallo e quindi leggere l'indice N + 1 per ottenere la fine (ovvero il prossimo avvio).
Dietro le quinte avrei un intervallo di tempo per eseguire i checkpoint e pulire l'indice e il WAL. Sto andando avanti con me stesso in quanto il mio scopo principale con questa domanda è di ottenere un feedback sul tempo o no, questa è anche una buona idea e in tal caso, se si utilizza un MemoryMappedFile
per il WAL e l'indice WAL è il modo migliore per gestirlo.
In un caso come catturare i messaggi di log, potrebbe esserci un po 'di scrittura in breve tempo.