6

HornetQ ストア アンド フォワード メカニズムを使用しようとしていますが、コア ブリッジを使用して 1 つのスタンドアロン HornetQ インスタンスから別のインスタンスにメッセージを転送するのは非常に遅くなります。1 秒あたり 200 メッセージを超えるスループット レートを上げることはできませんでした。

驚くべきことに、同じクライアント (メッセージを転送する HornetQ インスタンスにパブリッシュしていたクライアント) を宛先 HornetQ インスタンスで直接指定すると、1 秒あたり 1000 メッセージを超えるスループット レートが観測され始めます (このクライアントは JMS ベースです)。これは基本的に、Forwarding HornetQ インスタンスと宛先 HornetQ インスタンスの間に設定されたコア ブリッジに問題があることを意味します。

以下は、Forwarding HornetQ でコアブリッジを設定するための関連セクションです。

<connectors>
            <connector name="netty-bridge">
                 <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
                 <param key="host" value="destination.xxx.com"/>
                 <param key="port" value="5445"/>
                 <param key="batch-delay" value="50"/>
                 <param key="tcp-send-buffer-size" value="1048576"/>
                 <param key="tcp-receive-buffer-size" value="1048576"/>
                 <param key="use-nio" value="true"/>
           </connector>
</connectors>
<address-settings>
      <address-setting match="jms.queue.Record">
                <dead-letter-address>jms.queue.RecordDLQ</dead-letter-address>
                <max-size-bytes>262144000</max-size-bytes>
                <page-size-bytes>10485760</page-size-bytes>
                <address-full-policy>PAGE</address-full-policy>
        </address-setting>
</address-settings>
<queues>
         <queue name="jms.queue.Record">
                  <address>jms.queue.Record</address>
         </queue>
</queues>
<bridges>
        <bridge name="core-bridge">
                <queue-name>jms.queue.Record</queue-name>
                <forwarding-address>jms.queue.Record</forwarding-address>
                <retry-interval>1000</retry-interval>
                <retry-interval-multiplier>1.0</retry-interval-multiplier>
                <reconnect-attempts>-1</reconnect-attempts>
                <confirmation-window-size>10485760</confirmation-window-size>
                <static-connectors>
                        <connector-ref>netty-bridge</connector-ref>
                </static-connectors>
        </bridge>
</bridges>

以下は、宛先 HornetQ でコアブリッジを設定するための関連セクションです。

<acceptors>
      <acceptor name="netty">
        <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
         <param key="host"  value="${hornetq.remoting.netty.host:192.168.2.xxx}"/>
         <param key="port"  value="${hornetq.remoting.netty.port:xxxx}"/>
         <param key="tcp-send-buffer-size"  value="1048576"/>
         <param key="tcp-receive-buffer-size"  value="1048576"/>
         <param key="use-nio"  value="true"/>
         <param key="batch-delay"  value="50"/>
         <param key="use-nio"  value="true"/>
      </acceptor>
<acceptors>
<address-settings>
          <address-setting match="jms.queue.Record">
                    <dead-letter-address>jms.queue.RecordDLQ</dead-letter-address>
                    <max-size-bytes>262144000</max-size-bytes>
                    <page-size-bytes>10485760</page-size-bytes>
                    <address-full-policy>PAGE</address-full-policy>
            </address-setting>
    </address-settings>
    <queues>
             <queue name="jms.queue.Record">
                      <address>jms.queue.Record</address>
             </queue>
    </queues>

すべてのシステム変数 (CPU/メモリ/ディスク IO/ネットワークなど) は十分に活用されておらず、ログにエラーはありません。

: NIO とレガシー/古い IO の両方を試しました。これは、HornetQ-2.2.5-Final と HornetQ-2.2.8-GA の両方で試行されました (2.2.8-GA はソースからビルドされました)。

この問題の原因と解決策について何か考えはありますか?

その他の観察事項: コア ブリッジを介して送信されているメッセージはトランザクションに対応しているように見えます...したがって、これらのトランザクションをバッチ処理して、2 つの HornetQ インスタンス間の通信を非同期に行うことは可能ですか?

4

2 に答える 2

3

わかりました..私は自分でこれを理解しました。

Forwarding HornetQ がブリッジを作成するとき、ブリッジを介してメッセージを送信するために 1 つのスレッドのみを内部的に使用し、宛先 HornetQ への接続を 1 つだけ開きます。そのため、複数のプロセッサを利用することができず、ネットワーク (レイテンシ / 帯域幅 / rtt) によっても制限され、メッセージの送信を効果的に並列化することができません。そのため、スループットが高い場合は、上限に達し始めます (この場合、1 秒あたり約 200 メッセージ)。HornetQ コネクターとアクセプターのパラメーター (TCP 送信および受信バッファーサイズなど) とブリッジ設定 (確認ウィンドウサイズ) を調整することでこれを増やすことができますが、それほど時間がかかることはありません (1 秒あたり最大約 300 メッセージのスループットが得られました)。 )。

解決策 - Forwarding と Destination HornetQ インスタンスの同じペアの間に複数のブリッジを作成します (同じキューを使用)。これにより、メッセージの転送が効果的に並列化され、スループットが向上します。3 つのブリッジを作成すると、スループットがほぼ 3 倍になり、毎秒 870 メッセージになりました。

JBoss は、理想的には、この並列化をコア ブリッジで構成可能にする必要があります。

于 2012-04-03T13:15:25.377 に答える
1

あなたが言っていた問題を引き起こしているブリッジにバグがあった2.2.5(あなたが使用していたバージョンはあなたの投稿からは明らかではありません)を使用していたと思います。

一部のバージョンでは、ブリッジは非同期確認を頼りにするのではなく、同期的にメッセージを送信していました。

最新バージョンでどのように動作するかを見てみましょう。

于 2012-05-07T19:18:42.160 に答える