1

ActiveMQ に関して: 小さな (約 10KB) ファイルをコンシューマーに送信するプロデューサーが 1 つあるシナリオがあります。ファイルは小さいですが、コンシューマーがそれらを分析して結果をプロデューサーに返すのに約 10 秒かかります。私は多くのことを調査しましたが、次の質問に対する答えはまだ見つかりません。

  1. ブローカーがファイルを (完全に) キューに保管するようにするにはどうすればよいですか?
  2. ObjectMessage (ファイルが小さいため) または blob メッセージを使用する必要がありますか?
  3. コンシューマーの処理が遅いため、prefetchLimit を下げるか、ラウンドロビン ディスパッチ ポリシーを使用する必要がありますか? どちらの方がよいですか?
  4. 最後に、ActiveMQ FAQ で、「コンシューマーがメッセージを受信し、閉じる前にそれを確認しない場合、メッセージは別のコンシューマーに再配信されます。」を読みました。ここでの私の質問は、ActiveMQ は 1 つのコンシューマーのみがメッセージを処理することを保証するか (したがって、プロデューサーへの回答は 1 つだけになるか) ですか? コンシューマーがメッセージを確認するのはいつですか (デフォルトの自動確認設定) - メッセージを受信して​​セッションに保存するとき、または onMessage ハンドラーが終了するとき? また、消費者の処理が非常に遅いため、「タイムアウト制限」を変更して、ブローカーが別の消費者に作業を渡す前にどれだけ待機する必要があるかを知る必要があります (これは私の以前の質問に関連しています)。
4

1 に答える 1

0

他の人についてはわかりませんが、ここにいくつかの考えがあります。

最初:あなたの正確な懸念が何であるかわかりません。ActiveMQ はメッセージをデータ ストアに保存します。すべてのデータが単一の場所 (ブローカーまたはクライアント) のメモリに存在する必要はありません。したがって、実際にはその点で優れている必要があります。以前のバージョンでは、必要なすべての ID がメモリに収まる必要がありましたが (解決されたかどうかは不明です)、数千万のキュー内メッセージがない限り、メモリ使用量は十分に低くなります。

ObjectMessage と blob について。raw バイト配列 (blob) は最もコンパクトな表現である必要がありますが、これらはすべてストレージ用にシリアル化されるため、クライアントのメモリ使用量にのみ影響します。プリフェッチは、主にアクセス レイテンシに役立ちます。しかし、それらは処理が遅いため、おそらくプリフェッチは必要ありません。はい、1または2に設定するか、完全に無効にします。

保証について: 分散メッセージ キューが保証できる最善の方法は、少なくとも 1 回 (重複の可能性あり)、または最大 1 回 (重複なし、メッセージが失われる可能性がある) のいずれかです。通常は、at-least-once を実行し、クライアントが提供する ID を使用してクライアントを重複排除することをお勧めします。確認応答の送信方法は JMS 仕様で定義されているため、JMS について詳しく読むことができます。これは ActiveMQ 固有のものではありません。はい、タイムアウトを十分に高く設定して、すべてのネットワーク遅延を含め、ワーカーが通常作業を完了できるようにする必要があります。これにより、ドロップされたメッセージの再送信が遅くなる可能性があります (作業が終了した場合) が、おそらく問題にはなりません。

于 2010-09-22T20:36:50.633 に答える