1

x 分/秒/ミリ秒などごとに実行されるジョブを設定し、Amazon SQS キューをポーリングしてメッセージを処理しようとしています。私の質問は、これに対する最善のアプローチは何であるかということです。x 個のスレッドで ScheduledThreadPoolExecutor を作成し、scheduleAtFixedRate メソッドを使用して単一のタスクをスケジュールし、それを非常に頻繁に (10 ミリ秒など) 実行して、必要なときに複数のスレッドが使用されるようにするか、同僚に提案しているように、 x 個のスレッドを持つ ScheduledThreadPoolExecutor を使用して、スケジュールされた複数のタスクをわずかにオフセットした間隔で作成しますが、実行頻度は低くなります。これは、STPE の使用方法のように思えます。

通常、私はこの種のものに Spring/Quartz を使用しますが、現時点ではそれはありません。

それで、あなたの考えは何ですか?

4

3 に答える 3

0

ロング ポーリングは20 seconds、呼び出しが返されるまでの最大 のブロッキング キューのようなものです。ポーリング サイクル間に必要な最大遅延であれば、ロング ポーリングで十分です。それを超えると、scheduledExector が必要になります。

スレッドの数は、受信したメッセージをどれだけ速く処理できるかによって異なります。メッセージを非常に高速に処理できる場合、スレッドは 1 つしか必要ありません。私は次のように設定しています

  1. SingleThreadScheduledExecutorwithscheduleWithFixedDelayは前回の完了から 5 分後に実行されます
  2. 各実行では、処理するメッセージがなくなるまで、SQS からメッセージがバッチで取得されます (各バッチは最大 10 個のメッセージを受け取ることに注意してください)。
  3. メッセージは処理された後、キューから削除されます。

私のシナリオでは、シングル スレッドで十分です。バックログが増加している場合 (たとえば、待機を伴う可能性のあるメッセージごとにネットワーク操作が必要な場合)、複数のスレッドを使用することができます。1 つの処理ノードでリソースが制約された場合、いつでも別のインスタンス (おそらく EC2) を開始して容量を追加できます。

于 2013-08-15T01:09:30.243 に答える