Introdução à fila de crônica
1. Visão geral
A fila de crônica persiste em todas as mensagens usando um arquivo mapeado na memória. Isso nos permite compartilhar mensagens entre processos.
It stores data directly to off-heap memory, therefore, making it free of GC overhead. Ele é projetado para fornecer estrutura de mensagem de baixa latência para aplicativos de alto desempenho.
Neste artigo rápido, examinaremos o conjunto básico de operações.
2. Dependências do Maven
Precisamos adicionar ofollowing dependency:
net.openhft
chronicle
3.6.4
Sempre podemos verificar as versões mais recentes hospedadas pelo Maven Central com o link fornecido anteriormente.
3. Blocos de construção
Existem três conceitos característicos para a fila crônica:
-
Excerpt – é um contêiner de dados
-
Appender – appender é usado para escrever dados
-
Trailer – é usado para ler dados sequencialmente
Vamos reservar a parte da memória para as operaçõesread-write usando a interfaceChronicle.
Aqui está o código de exemplo para criar uma instância:
File queueDir = Files.createTempDirectory("chronicle-queue").toFile();
Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build();
Nós precisaremos de um diretório base onde a fila persistirá registros em arquivos mapeados na memória.
A classeChronicleQueueBuilder fornece diferentes tipos de filas. Nesse caso, usamosIndexedChronicleQueue enquantoh usa o índice sequencial para manter deslocamentos de memória de registros em uma fila.
4. Escrevendo para a fila
Para gravar os itens em uma fila, precisaremos criar um objeto da classeExcerptAppender usando a instânciaChronicle. Aqui está um código de exemplo para gravar as mensagens na fila:
Aqui está um código de exemplo para gravar as mensagens na fila:
ExcerptAppender appender = chronicle.createAppender();
appender.startExcerpt();
String stringVal = "Hello World";
int intVal = 101;
long longVal = System.currentTimeMillis();
double doubleVal = 90.00192091d;
appender.writeUTF(stringValue);
appender.writeInt(intValue);
appender.writeLong(longValue);
appender.writeDouble(doubleValue);
appender.finish();
Depois de criar o appender, iniciaremos o appender usando um métodostartExcerpt. Ele inicia umExcerpt com a capacidade de mensagem padrão de128K. Podemos usar uma versão sobrecarregada destartExcerpt para fornecer uma capacidade personalizada.
Uma vez iniciado, podemos gravar qualquer valor literal ou de objeto na fila usando uma ampla variedade de métodos de gravação fornecidos pela biblioteca.
Finalmente, quando terminarmos de escrever, terminaremos o trecho, salvaremos os dados em uma fila e, posteriormente, no disco.
5. Lendo da fila
A leitura dos valoresfrom da fila pode ser feita facilmente usando a instânciaExcerptTrailer.
É como um iterador que usamos para percorrer uma coleção em Java.
Vamos ler os valores da fila:
ExcerptTailer tailer = chronicle.createTailer();
while (tailer.nextIndex()) {
tailer.readUTF();
tailer.readInt();
tailer.readLong();
tailer.readDouble();
}
tailer.finish();
Depois de criar o trailer, usamos o métodonextIndex para verificar se há um novo trecho para ler.
Uma vez queExcerptTailer tem um novoExcerpt para ler, podemos ler mensagens dele usando um intervalo de métodosread para valores literais e de tipo de objeto.
Por fim, terminamos a leitura com a APIfinish.
6. Conclusão
Neste tutorial, fizemos uma breve introdução à fila de crônica e seus blocos de construção. Vimos como criar uma fila, escrever e ler dados. A sua utilização oferece muitos benefícios, incluindo IPC (comunicação entre processos durável e baixa latência), bem como nenhuma sobrecarga de coleta de lixo.
A solução fornece persistência de dados por meio de arquivos mapeados na memória - sem perda de dados. Ele também permite leitura e gravação simultânea de vários processos; no entanto, as gravações são tratadas de forma síncrona.
Como sempre, todos os trechos de código podem ser encontradosover on GitHub.