2

Oracle AQ は初めてですが、私が取り組んでいるプロジェクトを本当に簡単にするはずです。

複数の永続的なサブスクライバーを持つキューを作成したいのですが、テストで、リッスンしているサブスクライバーが 2 つになるとすべてが遅くなることがわかりました。

1 人の加入者がリッスンしているときは、すべてが高速です。キューに新しいメッセージを作成すると、ほぼ瞬時にリスナーによって消費されます。

次に、別のサーバーから別のリスナーを追加します。即座に Oracle の速度が低下します。キューにメッセージを作成するのに 60 秒以上かかります。メッセージは数分後まで消費されません。

キューがマルチコンシューマーの場合、オーバーヘッドはさらに増えるのでしょうか? そのオーバーヘッドはサーバーの起動時のみですか? それとも常にそこにあるでしょうか?

シングル コンシューマ キューを使用して 2 回目のテストを実行しましたが、これらの問題は発生しませんでした。

おそらく、リスナーの設定で何か間違ったことをしたのでしょうか?

これは、キューテーブルをセットアップする方法です。

EXEC dbms_aqadm.create_queue_table(queue_table=>'MY_QUEUE_TABLE',
     queue_payload_type=>'sys.aq$_jms_text_message',
     multiple_consumers=>TRUE);

そして、これは私の構成です:

<jms:listener-container 
        connection-factory="AQjmsFactory"
        container-type="default"
        destination-type="durableTopic"
        client-id="MY-ADAPTER" 
        acknowledge="transacted">
    <jms:listener destination="MYA_INFO_QUEUE" ref="personUpdateListener" subscription="MYADAPTERJ"/>
    <jms:listener destination="MYB_INFO_QUEUE" ref="courseUpdateListener" subscription="MYADAPTERJ"/>
</jms:listener-container>
4

1 に答える 1

0

モデルが複数のサブスクライバーでどのように機能するかは、実際には「オーバーヘッド」ではありません。メッセージングには、ある程度の「スピンアップ」時間と「スピンダウン」時間があります。とはいえ、これらの遅延の間、データベースはまだ比較的アイドル状態です。処理の開始を待っている間、CPU/メモリ/IO の消費量が大幅に増加することはありません。

仕組みを理解していれば、特定の間隔で実行される AQ メッセージを処理するバックグラウンド ジョブがあります。ジョブが実行されていないときは、サイクルを焼き付けませんが、何も起きていません。エンジンがかかっていないときや、赤信号で座っているときにフェラーリが遅いと言っているようなものです。

パフォーマンスをテストするには、キューに処理するメッセージが多数ある場合ほど、これらのアイドル時間について心配する必要はありません。つまり、フェラーリが公道を走っているときです!

于 2010-11-28T04:07:26.017 に答える