2016-04-08 9 views
0

私は仕事をキューに入れる、例えば電子メールを送るのに使われるキネシスストリームを持っています。キューを読んで電子メールを送信する消費者のクラスタがあります。キネシス - コンシューマのクラスタ

このような場合、コンシューマがキューから1つのアイテムを読み取ると、他のコンシューマは同じアイテムを読み取るべきではありません。他には私は重複した電子メールを送るでしょう。

どうすればよいですか?

答えて

0

まず、KinesisコンシューマアプリケーションにKCLを使用します。ご存じのように、ストリームに配置されたレコードは特定の断片になり、KCLを使用することによって、アプリケーション内の1つのコンシューマノードだけがその断片をポーリングすることが保証されます。したがって、同じ断片を二重に聞く(つまり、同じレコードを処理する)リスクはありません。

第2に、Kinesisは電子メールのようなトランザクションのものを送信するためのアーキテクチャが間違っている可能性があります。それは複製されても、処理されなくてもよい。これは信頼できるキューシステムではありません。

たとえば、ストリームの各レコードには電子メールが含まれていますが、送信中にエラーが発生したとしましょう。あなたならどうしますか?再試行のために、その1レコードをもう一度ストリーミングしますか?何回再試行しますか? また、Kinesisのコンシューマーはストリームから一括してレコードをポーリングするので、あるレコードがレコードのバッチ(ProcessRecordsInput.getRecords)で破損した場合、そのバッチのチェックポイント(ProcessRecordsInput.getCheckpointer)には、したがって、アプリケーションを再起動すると、二重処理の危険があります。

キューベースのシステム(HornetQ、ActiveMQなど)を使用することをお勧めします。

関連する問題