17.7. 永続性

17.7.1. HornetQ の永続性

HornetQ は独自の永続性を処理します。HornetQ には、メッセージング固有のユースケースに対して最適化された高パフォーマンスなジャーナルが含まれています。
HornetQ ジャーナルは設定可能なファイルサイズにのみ追加されるため、単一の書き込み操作を有効にすることでパフォーマンスを向上します。HornetQ ジャーナルは、ディスク上のファイルのセットで構成されます。これらのファイルは当初、固定サイズで事前に作成され、パディングが含まれています。サーバーの操作 (add message、delete message、update message など) が実行されると、ジャーナルファイルが満杯になるまで操作の記録がジャーナルに追加され、満杯になると次のジャーナルファイルが使用されます。
高度なガベージコレクションアルゴリズムは、ジャーナルファイルのすべてのデータが削除されたときに、ジャーナルファイルを回収および再使用できるかどうかを決定します。圧縮アルゴリズムはジャーナルファイルからデッドスペースを削除し、データを圧縮します。
また、ジャーナルはローカルおよび XA トランザクションの両方を完全サポートします。
ジャーナルのほとんどは Java で記述されますが、さまざまなプラグ可能な実装を許可するため、ファイルシステムとの対話は抽象化されます。HornetQ に同梱される 2 つの実装は次のとおりです。
  • Java New I/O (NIO)
    ファイルシステムとのインターフェースに標準の Java NIO を使用します。大変優れたパフォーマンスを実現し、Java 6 またはそれ以降のランタイムのプラットフォーム上で稼働します。
  • Linux 非同期 IO (AIO)
    ネイティブコードラッパーを使用し、Linux 非同期 IO ライブラリー (AIO) と対話します。データが永続化されると、HornetQ は AIO を用いてメッセージを受信します。これにより、明示的な同期化の必要がなくなります。通常、AIO のパフォーマンスは Java NIO よりも優れていますが、Linux カーネル 2.6 (またはそれ以降) と libaio パッケージが必要になります。
    また、AIO には ext2、ext3、ext4、jfs、または xfs タイプのファイルシステムも必要になります。
標準の HornetQ コアサーバーは次のジャーナルインスタンスを使用します。
  • bindings journal
    サーバーおよび属性にデプロイされたキューのセットを含む、バインディング関連のデータを格納します。また、ID シーケンスカウンターなどのデータも格納します。メッセージジャーナルよりもスループットが低くなるため、バインディングジャーナルは常に NIO ジャーナルになります。
    このジャーナル上のファイルには、hornetq-bindings という接頭辞が付けられます。各ファイルには bindings 拡張子が付けられます。ファイルサイズは 1048576 バイトで、bindings フォルダーに格納されます。
  • JMS journal
    JMS キュー、トピックスまたは接続ファクトリ、これらリソースの JNDI バインディングなど、JMS 関連のデータをすべて格納します。管理 API で作成された JMS リソースはすべてこのジャーナルで永続化されますが、設定ファイルで設定されたリソースは永続化されません。このジャーナルは JMS が使用される場合のみ作成されます。
  • message journal
    メッセージ自体および duplicate-id キャッシュを含む、メッセージ関連のデータをすべて格納します。デフォルトでは、HornetQ はこのジャーナルに AIO を使用します。AIO が使用できない場合は、自動的に NIO へフォールバックします。
大型のメッセージはメッセージジャーナル外部で永続化されます。メモリー不足の場合は、ディスクへメッセージを呼び出すよう HornetQ を設定します。永続化が必要ない場合は、データを永続化しないよう HornetQ を設定できます。