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には3つの特徴的な概念があります。


  • 抜粋 –

    はデータコンテナです


  • アペンダー –

    アペンダーはデータの書き込みに使用されます


  • トレーラー –

    は、データを順次読み取るために使用されます


Chronicle

インタフェースを使用して、メモリの一部を

read-write

操作用に予約します。

これは、インスタンスを作成するためのコード例です。

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

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


ChronicleQueueBuilder

クラスはさまざまな種類のキューを提供します。この場合は、インデックス内のレコードのメモリオフセットを維持するためにシーケンシャルインデックスを使用するために

IndexedChronicleQueue

を使用しました。


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



Excerpt

が開始されます。カスタム容量を提供するために

startExcerpt

のオーバーロードバージョンを使用できます。

いったん開始されると、ライブラリによって提供される広範囲のwriteメソッドを使用して、リテラルまたはオブジェクトの値をキューに書き込むことができます。

最後に、書き込みが終了したら、抜粋を完了し、データをキューに保存し、後でディスクに保存します。


5キューから読む

キューからの値の読み取りは、ExcerptTrailerインスタンスを使用して簡単に実行できます。

これは、Javaでコレクションをトラバースするために使用するイテレータのようなものです。

キューから値を読みましょう。

ExcerptTailer tailer = chronicle.createTailer();
while (tailer.nextIndex()) {
    tailer.readUTF();
    tailer.readInt();
    tailer.readLong();
    tailer.readDouble();
}
tailer.finish();

トレーラーを作成した後、

nextIndex

メソッドを使用して、読み取る新しい抜粋があるかどうかを確認します。


ExcerptTailer

が新しい

Excerpt

を読むようになったら、リテラルとオブジェクト型の値のための

read

メソッドの範囲を使ってそこからメッセージを読むことができます。

最後に、

finish

APIで読み終わりました。


6. 結論

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

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

いつものように、すべてのコードスニペットはhttps://github.com/eugenp/tutorials/tree/master/core-java-9[GitHubに追加]を見つけることができます。