2016-12-29 6 views
0

長時間実行しているプロセスで複数のワーカーのタスクキューとして使用しているSQSキュー(標準でFIFOではありません)があります。どのように読み込みに対してSQSキューをフリーズすることができますか?

私は、作業者がメッセージを受信/処理できないように一時的に停止する「キルスイッチ」を追加しようとしています。

メッセージを削除したり、新しいメッセージがキューに入るのを止めたくない場合は、再度キルスイッチを切り替えるまで、読者を停止してください。

これはSDKで可能ですか?またはパーミッションを持つ?

答えて

3

私はsqsの一時停止ボタンを知らないので、有望なようなsqs API呼び出しはありません。

iamポリシーからアクセス権を削除して、読者が読むことができます。

ネットワークレベルでsqs public ipsへのアクセスを削除できます。

しかし、私はこれらの解決策が嫌いです。成功した失敗シナリオをぼやけてしまい、アプリケーション内でオーケストレーションするよりも、もはやエレガントで便利ではありません。

私のエンジニアに、ダイナモ、領事、または他の一貫したキーバリューストアでこれに機能フラグを使用するよう伝えたい場合は、許可またはネットアクセスが削除されている間にすべての読み取りが連続して失敗するのを防ぐよりも、私にはもっと意味があります。

1

java awsクライアントを使用しているなど、いくつか不明な点がありますか?どのバージョン、これは実稼働環境かデバッグ/テスト専用です、killスイッチのマニュアルか自動的に起動します。

いくつかの前提に基づいて、ここでどのように求められるかを達成する方法があります。

あなたは以下の

@SqsListener(value = mySqsQueueNameHere", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS) 
public void onMessage(String payloadStr, Acknowledgment acknowledgement) throws InterruptedException, ExecutionException, JsonParseException, JsonMappingException, IOException { 
    if(isKillSwitchOn) throw new SomeExceptionHere(); 
    .....rest of code here if kill switch not on.... 
} 

任意の例外がスローされたときSqsMessageDeletionPolicy.ON_SUCCESSがキューに戻ってメッセージを置くような何かを行うことができ、最新のAWSクライアントと春のjavaアプリケーションにSQSリスナーを持っている場合。 SqsListenerは、キュー名と削除ポリシーのリストのみを受け入れます。リスナーをシャットダウンするためのきれいな方法はありません。

これにより、メッセージが消費されてから削除されますが、リスナーは引き続きメッセージはキューから取り除かれますが、すぐに戻されます。私はまた、SQSがそのメッセージが適切な場所に行を戻すことができるかどうかを確認するためにキューにどのような影響があるかもわかりません。

+0

新しいFIFOキューを除いて、Sqsキューは本質的に順序付けられていません。これは高価で控えめなアプローチのように思えますが、スイッチが無効になるまでスラッシングするだけですが、動作するように思えますし、コードを組み込むために役立ちます。 –

+0

@Dan Farrell私はこれが確かにどんな手段でも目立つ解決ではない –

関連する問題