メッセージ永続ストレージ
メッセージの永続性は、信頼性の高いメッセージ配信のためのより良い方法です。送信者と受信者が同時にオンラインになっていない場合や、送信者がメッセージを送信した後にメッセージセンターがダウンしている場合でも、メッセージセンターが再起動した後もメッセージを送信できます。 。メッセージの永続性の原則は非常に単純です。メッセージを送信した後、メッセージセンターは最初にメッセージをローカルファイル、メモリ、またはリモートデータベースに保存し、次にメッセージを受信者に送信します。メッセージが正常に送信されると、メッセージは次のようになります。ストレージから削除され、失敗します。その後、試行を続けてください。
次に、ブローカーでのメッセージの永続ストレージの実装を見てみましょう。
ActiveMQメッセージ永続ストレージサポートタイプ
ActiveMQは、主に次の5つの異なる永続化メソッドをサポートしますが、どの永続化メソッドを使用しても、メッセージストレージロジックは同じです。
他のタイプのストレージを変更して使用する必要がある場合は、 conf /activemq.xml ファイルを編集する必要があります。
- KahaDBストレージ(デフォルトのストレージ方法)
- JDBCストレージ
- メモリストレージ
- LevelDBストレージ
- ActiveMQジャーナルを使用したJDBC存储
1.KahaDBストレージ
KahaDBは現在、デフォルトの保存方法であり、あらゆるシナリオで使用できます。KahaDBストレージを使用すると、パフォーマンスとデータ回復機能が向上します。メッセージストレージは、[トランザクションログ]と[インデックスファイルのみ]を使用してすべてのアドレスを保存します。
KahaDBストレージは、メッセージの永続性に特化したソリューションであり、一般的なメッセージの使用パターンを最適化します。カハでは、データはデータログログファイルに追加されます。ログファイルのデータが不要になった場合は、ログファイルを直接破棄できます。
1.1KahaDBの設定方法
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
1.2KahaDBのストレージの原則
では、データ/ kahadbのディレクトリ、4つのファイルが生成されます。
- db.dataこれはメッセージのインデックスファイルであり、本質的にはBツリー(Bツリー)であり、db-*。logに格納されているメッセージを指すインデックスとしてBツリーを使用します。
- db.redoはメッセージ回復に使用されます
- db-*。logは、メッセージの内容を格納します。新しいデータは、APPENDによってログファイルの最後に追加されます。シーケンシャル書き込みに属しているため、メッセージの保存は比較的高速です。デフォルトは32Mで、しきい値に達すると自動的に増加します。つまり、db-1.log、db-2.logなどが増加します。
- ロックファイルロックは、現在kahadbの読み取りおよび書き込み権限を持っているブローカーを表します
2.JDBCストレージ
JDBCストレージ、つまり、私たちがよく使用するMySQLおよびOracleデータベース。ActiveMQは、JDBC永続性を使用して、データベースに3つのテーブル、つまりactivemq_msgs、activemq_acks、activemq_lockを作成します。
- activemq_msgsメッセージテーブル、キュー、トピックはこのテーブルに保存されます
- activemq_acksは、永続サブスクリプションメッセージと最後の永続サブスクリプションによって受信されたメッセージIDを格納します
- activemq_lockロックテーブルは、特定の時間に1つのActiveMQBrokerインスタンスのみがデータベースにアクセスできるようにするために使用されます。
2.1JDBCストレージを構成する方法
2.1.1永続モードの構成
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#MySql-DS" createTablesOnStartup="true"/>
</persistenceAdapter>
2.1.2 データベースBeanの構成(ここではドルイド接続プールが使用され、activeMQに組み込まれているデータベース接続プールはdbcp接続プールです。他のサードパーティのデータベーステクノロジを使用しているため、activemqのlibディレクトリに関連するjarパッケージを導入する必要があります。 mysql-connector-javaのjarパッケージ)
<bean id="MySql-DS" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.204.201:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="xxxxxx"/>
</bean>
2.1.3Jarパッケージの依存関係を追加する
druid-1.0.9.jar
mysql-connector-java-5.1.7-bin.jar
3.LevelDBストレージ
LevelDBの永続性パフォーマンスはKahaDBよりも高くなっています。現在のデフォルトの永続化メソッドはKahaDBですが、ActiveMQ 5.9は、LevelDBとZooKeeperに基づくデータレプリケーションメソッドを提供します。これは、マスタースレーブメソッドの推奨データレプリケーションソリューションです。
ただし、ActiveMQの公式WebサイトのLevelDBの説明によると、LevelDBの使用は公式に推奨されていますが、サポートされなくなりました。KahaDBをお勧めします。LevelDBが推奨されない具体的な理由は不明です。
3.1LevelDBの構成方法
<persistenceAdapter>
<levelDBdirectory="activemq-levelDB"/>
</persistenceAdapter>
4.メモリストレージ(メモリ)
メモリベースのメッセージストレージ、メモリメッセージストレージは、主にすべての永続メッセージをメモリに保存するためのものです。ブローカータグでは、persistent = "false"の構成は、永続ストレージが設定されておらず、メモリに直接保存されていることを意味します。
4.1メモリストレージを構成する方法
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" persistent="false">
<!-- 内容省略 -->
</broker>
5. JDBCでのActiveMQジャーナル存储
このアプローチは、JDBCストレージの欠点を克服します。メッセージがJDBCから送信されるたびに、ライブラリに書き込み、ライブラリを読み取る必要があります。JDBC With ActiveMQ Journalストレージは、キャッシュ書き込みテクノロジーを使用して、パフォーマンスを大幅に向上させます。コンシューマーの消費率がプロデューサーのメッセージ生成率に時間内に追いつくことができる場合、ジャーナルファイルはDBに書き込む必要のあるメッセージを大幅に減らすことができます。
たとえば、プロデューサーが1000個のメッセージを生成した場合、これらの1000個のメッセージはジャーナルファイルに保存されます。コンシューマーの消費速度が非常に速い場合、ジャーナルファイルがDBに同期される前に、コンシューマーはすでに90個を消費しています。メッセージの%上記の場合、この時点でメッセージの残りの10%のみをDBに同期する必要があります。
コンシューマーの消費速度が非常に遅い場合、この時点でジャーナルファイルはDBにメッセージをバッチで書き込むことができます。
5.1 ActiveMQJournalストレージを使用してJDBCを構成する方法
1.元のラベルをコメントアウトします
2.次のタグを追加します:(データベースBeanの構成もここで必要です)
<persistenceFactory>
<journalPersistenceAdapterFactory dataSource="#MySql-DS" dataDirectory="active-journal"/>
</persistenceFactory>
サーバー側でメッセージを周期的に送信すると、データベースとの同期でデータが遅延していることがわかります。