1

ActiveMQ キューからデータを消費すると、次の問題が発生します

次のコードを使用します。

$stomp = new Stomp($activeMQURI);
$stomp->subscribe($queue);
while ($stomp->hasFrame()) {

    $frame = $stomp->readFrame();

    if ($frame) {
        $stomp->ack($frame);
    }

}

$stomp->hasFrame() が false を返す前に、約 1 ~ 10 個のメッセージをループします。問題は、まだキューに 10,000 件のメッセージがあることです!

確認の後に遅延を入れると、すべてが期待どおりに機能します。

$stomp = new Stomp($activeMQURI);
$stomp->subscribe($queue);
while ($stomp->hasFrame()) {

    $frame = $stomp->readFrame();

    if ($frame) {
        $stomp->ack($frame);
        sleep(1);
    }

}

これは、消費者 (私のコード) が別のフレームを要求する前に、ActiveMQ サーバーが ack を処理する機会がなかったために発生していると考えていました。これが起こっている本当の理由を説明できる人はいますか?

4

1 に答える 1

0

使用しているクライアントを実際に指定するわけではないため、一般的な回答を次に示します。ほとんどのクライアントは、メッセージが到着したときに戻るか、時間指定された場合に失敗を示す、時間指定または無限待機のいずれかのブロッキング受信呼び出しを提供します。ブローカーがクライアントにメッセージをディスパッチする速度は、宛先のコンシューマーの数、各コンシューマーによって設定されたプリフェッチ サイズ、ネットワークの速度など、非常に多くの要因によって異なります。コードメッセージ トラフィックが停滞している場合に対処できるようにする必要があります。私はあなたの設定についてこれ以上知らないので、それは私が与えることができるのと同じくらい良い答えです.

于 2012-12-21T15:07:10.717 に答える