«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.