2012-03-07 12 views
3

まず、この問題を解決するさまざまな方法を検討しています。データベースのキュー管理

私はアプリケーション内にデータベーステーブルで管理されているキューを持っています。 スケジュールされたプロセッサがあり、キューを調べ、レコードのSTATUSフィールドに基づいてレコードを取り出します。 これらのレコードを処理し、成功するとテーブルからレコードを削除します。

問題は私のアプリケーションがクラスタ化されていることです。したがって、同じレコードを取り出して処理するいくつかのインスタンスがあります。

これを解決するには、私が従ったアプローチは です。レコードの状態を更新する前に(例えば、PENDINGからWORKINGに)処理され、テーブルのエンティティマッピングにバージョンが追加されたので、アクションのシーケンスは

となります。1)PENDINGレコードのテーブルを照会します。 2)ステータスをWORKINGとして更新します。 (誰かが既にレコードを更新したときにプロセッサの別のインスタンスがそれを更新しようとすると、例外が発生し、次のレコードに移動します) 3)成功した​​とき。レコードを削除し、それ以外の場合はPENDINGに更新してください。

は今、

は同様の問題に直面している人々がそれを解決した方法を探していました...これを行うことで、それはかなり問題を解決するだろうが、非常にこのアイデアのようにいけません。

同じアプリケーションがテーブルにデータを入力し、それにデータを設定したホストとその特定のTomcatのスケジュールされたプロセッサにそのホストのレコードのみを照会するので、これを解決する別の方法がありました。基本的には、最初の解決策を続けるスラッシングを最小限に抑えようとしています。

それは春の3.0.5で、これは非常に共通の問題であるアプリケーション

+0

ZeroMQまたはApache Kafkaを見たことがありますか? – eSniff

答えて

2

を休止。

  • 新しいステータス+オプティミスティックロックを割り当てることで、現在処理されているレコードを所有しています。これはあなたのアプローチですが、動作しますが、現在ノードを処理しているノードが死んでいる場合は、テーブルのクリーンアップについて覚えておく必要があります。唯一の単一ノードが全体のキューにアクセスすることができます - そこにノードがたくさんあると楽観的ロックの失敗は

  • グローバル/外部ロックが頻繁に発生した場合より良いアプローチかもしれない - 悲観的ロックではなく上記と同じ

  • テーブル。表レベルのロックを使用して、他のすべてのノードまたは一部をブロックすることができます。

  • キューテーブルに新しいレコードを配置する場合は、ランダム化して特定のノードに割り当てます。他のノードはそれを処理できません。この道を歩かないでください、maintanenceの悪夢、例えば。ノードを追加または削除するときに使用します。

  • を使用すると、ジョブは自動的にクラスタ化され、1つのノードで実行されます。上記のような手法(共有データベースの悲観的なロック)

  • ...または通常のJMSプロバイダを使用すると、データベースは実際にキューとして使用されることはありません。

関連する問題