Перейти к основному содержимому

Введение в очередь хроник

· 3 мин. чтения

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 .