2017-10-11 12 views
0

Spring Cloudを使用してSimple Queue Service(SQS)を使用しています。 Iは、並列処理のために、以下の構成を有する:金額並列処理Simple Queue Service(SQS)

@Bean 
public SimpleAsyncTaskExecutor simpleAsyncTaskExecutor() { 
    SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor(); 
    simpleAsyncTaskExecutor.setConcurrencyLimit(50); 
    return simpleAsyncTaskExecutor; 
} 

@Bean 
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(
     SimpleAsyncTaskExecutor simpleAsyncTaskExecutor) { 

    SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory(); 
    factory.setAutoStartup(true); 
    factory.setTaskExecutor(simpleAsyncTaskExecutor); 
    factory.setWaitTimeOut(20); 
    factory.setMaxNumberOfMessages(10); 

    return factory; 
} 

Iは

(maxNumberOfMessagesはSQSから返された)50件のスレッド(豆SimpleAsyncTaskExecutorで構成)50件のメッセージを処理する必要はなく、並列にわずか10のメッセージを処理しています

10の代わりに50のメッセージを処理するにはどうすればよいですか?

+0

だから、50本の(並列に)糸、またはその処理合計で10件のメッセージに10件のメッセージを処理するのですか?あなたは 'SimpleMessageListenerContainerFactory.setMaxNumberOfMessages(10);を設定しました。したがって、10個のメッセージに対して50個のスレッドを並列に処理する場合は、その数を50個に増やします。 *編集* nevermind、私はドキュメントでは、その最大のメッセージを参照してください。リクエストは10です。ボトルネックに陥っている場合は、さらにスレッドをプールする必要があります。 –

+0

文書では、要求ごとに返されるメッセージの最大数は10です。 したがって、50個のスレッドで10個のメッセージを処理しています。 10個のメッセージの処理が終了すると、新しい要求が行われます。 私はSQSキューで50個のメッセージが50個のスレッドで処理される5つの要求を作成したいと考えています。 –

答えて

0

解決策が見つかりました。

このメソッドに@Asyncという注釈を付けるには、deletionPolicyNEVERに変更し、実行を終了するときにメッセージを削除する必要があります。

このように、キュー消費は構成されたスレッド数を尊重します。たとえば、スレッドが50個ある場合、SQSキューに5つの要求(要求ごとに10個のメッセージ)が作成され、合計50個のメッセージが並行して処理されます。

コードは次のようになります。

@Async 
@SqsListener(value = "sqsName", deletionPolicy = SqsMessageDeletionPolicy.NEVER) 
public void consume(String message, Acknowledgment acknowledgment) throws InterruptedException, ExecutionException { 

    //your code 

    acknowledgment.acknowledge().get(); //To delete message from queue 
} 
0

あまりにも多くの50個のメッセージ(50個のスレッド)のような特定の数字にはなりません。代わりにパフォーマンスをテストしてみてください(ピーク時の予想される数のメッセージをキューにプッシュするサービスを構築し、サービスがそれを処理してボトルネックがないかどうかを確認してください)。

あなたの実際の質問によると、あなたはできません。 AWS SQSは、10個以上のメッセージをフェッチすることはできません。要求。参照のためにhttp://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.htmlを参照してください。 (それは第1段落にあります)。

+0

私は大量のメッセージを持っています。したがって、一度に10メッセージでは不十分です。 実際には、各リクエストは10個のメッセージしか返しませんが、SQSキューに対して複数のリクエストを行いたいと思います。例えば、私はSQSに対して5つのリクエストを行い、合計50のメッセージを生成したいと考えています。ここで50は50のスレッドで処理されます。 –

+0

ああ、私はあなたの意見を見ます。私はエグゼキュータが同時にポーリングリクエストを行っていると思っていましたが、実際のメッセージを処理しているコンテナで使用されています。私は、自分自身で手を出すことなく、オンザフライで適切な提案をするために春雲について知っているわけではありません。ごめんなさい。 –

関連する問題