«1. Обзор

Chronicle Queue сохраняет каждое отдельное сообщение, используя отображаемый в памяти файл. Это позволяет нам обмениваться сообщениями между процессами.

Он хранит данные непосредственно в памяти вне кучи, что избавляет от накладных расходов на GC. Он предназначен для предоставления платформы сообщений с малой задержкой для высокопроизводительных приложений.

В этой быстрой статье мы рассмотрим базовый набор операций.

2. Зависимости Maven

Нам нужно добавить следующую зависимость:

<dependency>
    <groupId>net.openhft</groupId>
    <artifactId>chronicle</artifactId>
    <version>3.6.4</version>
</dependency>

Мы всегда можем проверить последние версии, размещенные на Maven Central, по ссылке, предоставленной ранее.

3. Building Blocks

Для Chronicle Queue характерны три концепции:

    Excerpt – это контейнер данных Appender – аппендер используется для записи данных Trailer – используется для последовательного чтения данных

Мы зарезервируем часть памяти для операций чтения-записи с использованием интерфейса 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. Он запускает отрывок с емкостью сообщения по умолчанию 128 КБ. Мы можем использовать перегруженную версию 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. Заключение

В этом руководстве мы представили краткое введение в Chronicle Queue и его строительные блоки. Мы увидели, как создать очередь, записать и прочитать данные. Его использование дает множество преимуществ, включая низкую задержку, надежное межпроцессное взаимодействие (IPC), а также отсутствие накладных расходов на сборку мусора.

Решение обеспечивает постоянство данных с помощью файлов с отображением памяти — без потери данных. Он также допускает одновременное чтение-запись из нескольких процессов; однако записи обрабатываются синхронно.

Как всегда, все фрагменты кода можно найти на GitHub.