1. Обзор
Chronicle Queue сохраняет каждое отдельное сообщение, используя отображаемый в памяти файл. Это позволяет нам обмениваться сообщениями между процессами.
Он хранит данные непосредственно в памяти вне кучи, что избавляет от накладных расходов на GC. Он предназначен для предоставления платформы сообщений с малой задержкой для высокопроизводительных приложений.
В этой быстрой статье мы рассмотрим базовый набор операций.
2. Зависимости Maven
Нам нужно добавить следующую зависимость :
<dependency>
<groupId>net.openhft</groupId>
<artifactId>chronicle</artifactId>
<version>3.6.4</version>
</dependency>
Мы всегда можем проверить последние версии, размещенные на Maven Central, по ссылке, предоставленной ранее.
3. Строительные блоки
Для Chronicle Queue характерны три понятия:
- Выдержка – это контейнер данных
- Appender — аппендер используется для записи данных
- Трейлер — используется для последовательного чтения данных
Мы зарезервируем часть памяти для операций чтения-записи
с использованием интерфейса Chronicle .
Вот пример кода для создания экземпляра:
File queueDir = Files.createTempDirectory("chronicle-queue").toFile();
Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build();
Нам понадобится базовый каталог, в котором очередь будет сохранять записи в отображаемых в память файлах.
Класс ChronicleQueueBuilder
предоставляет различные типы очередей. В этом случае мы использовали IndexedChronicleQueue
, который использует последовательный индекс для сохранения смещений
в памяти записей в очереди.
4. Запись в очередь
Чтобы записать элементы в очередь, нам нужно создать объект класса ExcerptAppender
, используя экземпляр Chronicle .
Вот пример кода для записи сообщений в очередь:
Вот пример кода для записи сообщений в очередь:
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();
После создания приложения мы запустим приложение с помощью метода startExcerpt
. Он запускает Excerpt
с емкостью сообщения по умолчанию 128K
. Мы можем использовать перегруженную версию startExcerpt
для предоставления пользовательской емкости.
После запуска мы можем записать любое литеральное или объектное значение в очередь, используя широкий спектр методов записи, предоставляемых библиотекой.
Наконец, когда мы закончим писать, мы закончим отрывок, сохраним данные в очередь, а затем на диск.
5. Чтение из очереди
Чтение значений из
очереди можно легко выполнить с помощью экземпляра ExcerptTrailer
.
Это похоже на итератор, который мы используем для обхода коллекции в Java.
Прочитаем значения из очереди:
ExcerptTailer tailer = chronicle.createTailer();
while (tailer.nextIndex()) {
tailer.readUTF();
tailer.readInt();
tailer.readLong();
tailer.readDouble();
}
tailer.finish();
После создания трейлера мы используем метод nextIndex
, чтобы проверить, есть ли новый отрывок для чтения.
Когда у ExcerptTailer
есть новый Excerpt
для чтения, мы можем читать из него сообщения, используя ряд методов чтения
для литеральных значений и значений типа объекта.
Наконец, мы заканчиваем чтение с помощью Finish
API.
6. Заключение
В этом уроке мы дали краткое введение в очередь хроник и ее строительные блоки. Мы увидели, как создать очередь, записать и прочитать данные. Его использование дает множество преимуществ, включая низкую задержку, надежное межпроцессное взаимодействие (IPC), а также отсутствие накладных расходов на сборку мусора.
Решение обеспечивает постоянство данных благодаря отображенным в памяти файлам без потери данных. Он также допускает одновременное чтение-запись из нескольких процессов; однако записи обрабатываются синхронно.
Как всегда, все фрагменты кода можно найти на GitHub .