Введение в хронику очереди
1. обзор
Очередь хроники сохраняет каждое отдельное сообщение, используя отображенный в памяти файл. Это позволяет нам обмениваться сообщениями между процессами.
It stores data directly to off-heap memory, therefore, making it free of GC overhead. Он разработан для предоставления инфраструктуры сообщений с низкой задержкой для высокопроизводительных приложений.
В этой быстрой статье мы рассмотрим базовый набор операций.
2. Maven Зависимости
Нам нужно добавитьfollowing dependency:
net.openhft
chronicle
3.6.4
Мы всегда можем проверить последние версии, размещенные на Maven Central, по указанной выше ссылке.
3. Строительные блоки
Для Chronicle Queue характерны три концепции:
-
Excerpt – - это контейнер данных
-
ПриложениеAppender – используется для записи данных
-
Trailer – используется для последовательного чтения данных
Мы зарезервируем часть памяти для операцийread-write с использованием интерфейсаChronicle.
Вот пример кода для создания экземпляра:
File queueDir = Files.createTempDirectory("chronicle-queue").toFile();
Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build();
Нам понадобится базовый каталог, в котором в очереди будут храниться записи в отображенных в память файлах.
КлассChronicleQueueBuilder предоставляет разные типы очередей. В этом случае мы использовалиIndexedChronicleQueue, в которомh использует последовательный индекс для сохранения смещений памяти для записей в очереди.
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. Чтение из очереди
Считывание значенийfrom очереди может быть легко выполнено с помощью экземпляраExcerptTrailer.
Это похоже на итератор, который мы используем для обхода коллекции в Java.
Считаем значения из очереди:
ExcerptTailer tailer = chronicle.createTailer();
while (tailer.nextIndex()) {
tailer.readUTF();
tailer.readInt();
tailer.readLong();
tailer.readDouble();
}
tailer.finish();
После создания трейлера мы используем методnextIndex, чтобы проверить, есть ли новый отрывок для чтения.
Как толькоExcerptTailer получит новыйExcerpt для чтения, мы можем читать сообщения из него, используя диапазон методовread для значений литералов и типов объектов.
Наконец, мы заканчиваем чтение с APIfinish.
6. Заключение
В этом уроке мы дали краткое введение в Chronicle Queue и ее строительные блоки. Мы увидели, как создать очередь, записывать и читать данные. Его использование предлагает множество преимуществ, включая низкую задержку, длительную межпроцессную связь (IPC), а также отсутствие издержек на сборку мусора.
Решение обеспечивает постоянство данных через отображенные в памяти файлы - без потери данных. Это также позволяет одновременное чтение-запись от нескольких процессов; однако записи обрабатываются синхронно.
Как всегда, все фрагменты кода можно найтиover on GitHub.