2017-02-02 12 views
0

メッセージがAWS SQSキューに配置され、Camel AWSが消費する実装があります。 concurrentConsumers = 1を使用しています。org.apache.camel.component.aws.sqs.SqsConsumerのように、キューのポーリングを記録しています。Apache CamelがSQSから適時にメッセージを取得しない

このテストでは、(リモートシステムから)SQSにメッセージを送信してから、そのメッセージがキューに記録されている時間を記録します。 Camelの終わりでは、SqsConsumerクラスのトレースログがあり、キューがいつポーリングされ、メッセージが消費されたかがわかります。

10秒ごとにメッセージをキューに入れた場合、ほとんどの場合、Camelはメッセージを1〜2秒で受信します。しかし、それにはかなりの時間がかかります(10秒以上)。

基本的に私たちは、この動作を参照してください。

  • SQS
  • 上(リモート)場所メッセージ(キャメル)投票
  • (キャメル)
  • (キャメル)投票
  • をポーリング... (多くの世論調査では、デフォルトで500ミリ秒離れています)
  • (Camel)SQSからのメッセージを受け取ります

Camelを使用せずにSQSをエンドツーエンドでテストしました。スループットに問題はありません(数秒で1000メッセージ)。

このテスト用のCamelの実装は、SQSキューからの読み取りとログのみで構成されています。他の機能はありません。

他の多くのCamel SQSパラメータを変更して、動作に違いはなくテストしました。

たとえば、concurrentConsumers = 10でテストすると、すべてのメッセージが遅延から最小限度でほぼ即座にキューから取得されます。

なぜ私の質問は、単一の消費者がタイムリーにメッセージを受け取るのではないのですか? 500ミリ秒ごとに本当にポーリングを行っている場合、メッセージを「見て」、ピックアップしていないのはどうですか?

注 - 私たちは、アプリケーションの機能のためにconcurrentConsumersを使用して提供されるマルチスレッドを可能にすることを躊躇しています。

+0

あなたは長いポーリングを試みましたか? –

+0

@ketanvijayvargiyaはい、その動作は同じようです。 –

答えて

0

@ketanvijayvargiyaが示唆しているように、長いポーリングは確かに答えのようです。私たちはあなたのコメントのためにそれをもう一度見ました。 ?私たちがしようとした値を設定するための複数の方法があります。

  1. をSQS URI、receiveMessageWaitTimeSecondsのラクダそのもの経由=
  2. コンソール、設定キューに(AWS SQSキュー自体にそれを設定するには - >受信メッセージ待ち時間)。

私は(2)をテストしたが、行動の変化は見られなかった(私のポスト時)。 (1)を使用して再度テストし、改善を見た。 (2)で再テストして改善を見たので、最初のテストを実行するときに間違いがあったと仮定することができます。

関連する問題