ActiveMQメッセージの永続性[ストレージ]戦略

メッセージ永続ストレージ


       メッセージの永続性は、信頼性の高いメッセージ配信のためのより良い方法です。送信者と受信者が同時にオンラインになっていない場合や、送信者がメッセージを送信した後にメッセージセンターがダウンしている場合でも、メッセージセンターが再起動した後もメッセージを送信できます。 。

       メッセージの永続性の原則は非常に単純です。メッセージを送信した後、メッセージセンターは最初にメッセージをローカルファイル、メモリ、またはリモートデータベースに保存し、次にメッセージを受信者に送信します。メッセージが正常に送信されると、メッセージは次のようになります。ストレージから削除され、失敗します。その後、試行を続けてください。

次に、ブローカーでのメッセージの永続ストレージの実装を見てみましょう。

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>

 サーバー側でメッセージを周期的に送信すると、データベースとの同期でデータが遅延していることがわかります。

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/m0_46405589/article/details/115172421