1. 概要

Chronicle Queueは、メモリマップトファイルを使用してすべてのメッセージを保持します。 これにより、プロセス間でメッセージを共有できます。

データをオフヒープメモリに直接保存するため、GCオーバーヘッドがなくなります。高性能アプリケーションに低遅延のメッセージフレームワークを提供するように設計されています。

このクイック記事では、基本的な操作セットについて説明します。

2. Mavenの依存関係

次の依存関係を追加する必要があります。

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

以前に提供されたリンクを使用して、MavenCentralによってホストされている最新バージョンをいつでも確認できます。

3. ビルディングブロック

ChronicleQueueに特徴的な3つの概念があります。

  • 抜粋–はデータコンテナです
  • Appender –appenderはデータの書き込みに使用されます
  • トレーラー–はデータを順次読み取るために使用されます

Chronicleインターフェイスを使用した読み取り/書き込み操作用にメモリの一部を予約します。

インスタンスを作成するためのサンプルコードは次のとおりです。

File queueDir = Files.createTempDirectory("chronicle-queue").toFile();
Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build();

キューがメモリマップトファイルのレコードを保持するベースディレクトリが必要になります。

ChronicleQueueBuilder クラスは、さまざまなタイプのキューを提供します。 この場合、 IndexedChronicleQueue を使用しましたが、 h はシーケンシャルインデックスを使用して、キュー内のレコードのメモリオフセットを維持します。

4. キューへの書き込み

アイテムをキューに書き込むには、Chronicleインスタンスを使用してExcerptAppenderクラスのオブジェクトを作成する必要があります。 メッセージをキューに書き込むためのサンプルコードは次のとおりです。

メッセージをキューに書き込むためのサンプルコードは次のとおりです。

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メソッドを使用してアペンダーを起動します。 抜粋をデフォルトのメッセージ容量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を読み取ると、リテラルおよびオブジェクトタイプ値の読み取りメソッドの範囲を使用してメッセージを読み取ることができます。

最後に、 finishAPIを使用して読み取りを終了します。

6. 結論

このチュートリアルでは、クロニクルキューとその構成要素について簡単に紹介しました。 キューを作成し、データを読み書きする方法を見ました。 これを使用すると、低遅延、耐久性のあるプロセス間通信(IPC)、ガベージコレクションのオーバーヘッドがないなどの多くの利点があります。

このソリューションは、データを失うことなく、メモリマップトファイルを介してデータの永続性を提供します。 また、複数のプロセスからの同時読み取り/書き込みも可能です。 ただし、書き込みは同期的に処理されます。

いつものように、すべてのコードスニペットはGitHubにあります。