まず、この問題を解決するさまざまな方法を検討しています。データベースのキュー管理
私はアプリケーション内にデータベーステーブルで管理されているキューを持っています。 スケジュールされたプロセッサがあり、キューを調べ、レコードのSTATUSフィールドに基づいてレコードを取り出します。 これらのレコードを処理し、成功するとテーブルからレコードを削除します。
問題は私のアプリケーションがクラスタ化されていることです。したがって、同じレコードを取り出して処理するいくつかのインスタンスがあります。
これを解決するには、私が従ったアプローチは です。レコードの状態を更新する前に(例えば、PENDINGからWORKINGに)処理され、テーブルのエンティティマッピングにバージョンが追加されたので、アクションのシーケンスは
となります。1)PENDINGレコードのテーブルを照会します。 2)ステータスをWORKINGとして更新します。 (誰かが既にレコードを更新したときにプロセッサの別のインスタンスがそれを更新しようとすると、例外が発生し、次のレコードに移動します) 3)成功したとき。レコードを削除し、それ以外の場合はPENDINGに更新してください。
は今、
は同様の問題に直面している人々がそれを解決した方法を探していました...これを行うことで、それはかなり問題を解決するだろうが、非常にこのアイデアのようにいけません。同じアプリケーションがテーブルにデータを入力し、それにデータを設定したホストとその特定のTomcatのスケジュールされたプロセッサにそのホストのレコードのみを照会するので、これを解決する別の方法がありました。基本的には、最初の解決策を続けるスラッシングを最小限に抑えようとしています。
それは春の3.0.5で、これは非常に共通の問題であるアプリケーション
ZeroMQまたはApache Kafkaを見たことがありますか? – eSniff