A maior parte da atividade na fila estará gravando no final e lendo e excluindo desde o início, no entanto, há casos em que o consumo de uma mensagem pode falhar por motivos não relacionados à fila e o item precisa ser movido para a fila. fim da fila.
Estou familiarizado com algumas estruturas de dados que funcionam bem no disco para outros casos específicos. Uma árvore de mesclagem estruturada em log parece ser ótima para dados de acesso aleatório, mas não quando as leituras e gravações são localizadas no final e no início da árvore (com base em meu entendimento). B Trees e B + Trees também parecem mais destinados ao acesso aleatório e ao percurso.
NOTA: Em relação ao SQLite, uma das minhas preocupações é o tempo de compactação. É provável que o conteúdo da fila seja de alta rotatividade e é importante que qualquer tipo de compactação que precise ser feita possa acontecer em um conjunto de dados bastante grande sem um impacto muito grande no desempenho. Ou seja se houver 4G de mensagens sentadas na fila, não quero um cenário em que as coisas fiquem bloqueadas por 2 minutos enquanto ele faz compactação, que é o que eu suspeito que acontecerá com o SQLite.
Acho que tenho informações suficientes para fornecer uma resposta. Pode não ser o que você está procurando, no entanto.
Persistência necessária para lidar com reinicializações limpas (não estou falando de picos de energia ou falta de energia);
Armazene cada mensagem como um único arquivo, nomeie-as com um timestamp ou um contador que você pode controlar de uma fonte confiável e aproveite os recursos do sistema de arquivos para você.
Você seria limitado pelo que o sistema de arquivos pode fazer por você (número de arquivos por diretório, número de diretórios por disco, tamanho máximo por arquivo, etc.), mas é muito flexível, fácil de depurar e monitorar e extremamente portátil e flexível, permitindo que você aumente a velocidade do seu IO mudando apenas o hardware (HD - > SSD - > Raid - > Storage Server, etc.).