2016-12-26 6 views
1

クラスタ環境で石英+春を使用して実行するジョブはほとんどありません。これらのジョブはクラスタ化環境で実行するように設定されていないので、各ジョブは所有しているインスタンスの数に基づいて複数回実行されます。これらのジョブはAWS環境で実行されます。動的に増減することができるインスタンス数は不明です。私たちはコードをリファクタリングしています。石英スプリングデザインの提案

問題は、特定のアクティビティに基づいてユーザーに電子メールを送信する仕事の例を挙げることができます。毎日1000人のユーザーが電子メールを送信する必要があります。

現在、クラスタ化された環境で実行するように設定されているわけではないため、各インスタンスはジョブを実行し、そのアクティビティについてユーザーに電子メールを送信します。 3つのインスタンスを実行している場合、ジョブは3回実行され、同じ電子メールがユーザーに3回送信されます。

私たちは、ジョブが1回だけ実行されることを確認するために、quartz jdbcを使用することに決めました。

私は以下の部分を行う方法に関する提案を探しています。

私は、300人のユーザーに電子メールを送信し、1人のインスタンスを実行しているジョブではなく、300人のユーザーに電子メールを送信する必要があると私はDBから300人のユーザーを取得し、他のインスタンスも300人のユーザーの処理に参加します。それを行う最良の方法は何でしょうか。私は一時テーブルに300人のユーザーを保存し、DBからユーザーを選んで欲しいとは思わない。そこに300人のユーザーをmemcachedのようなグローバルメモリに保存し、そこからデータを取り出す別のインスタンス(仕事を処理しているときの負荷分散の一種)で仕事をする方法があります。私はmemcacheを使用したくないので、他のオプションを利用することもできるし、最善の方法で私は設計を進めることができます。

+0

DBにレコードを挿入するのはあなたのアプリケーションですか?またはあなたのアプリケーションはDBからレコードを取り出して電子メールを送信するだけですか? –

+0

このアプリケーションは、残りのサービスを使用するユーザーのリストを取得し、各ユーザーのために電子メールを送信するために他の休憩サービスを呼び出します – prred

答えて

0

数ヶ月前、我々は同じ問題を抱えています。これを修正して、以下に示すようなjobというテーブルを作成し、実行中のスケジューラを制御するだけです。

+-----------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+--------------+------+-----+---------+----------------+ 
| id  | bigint(20) | NO | PRI | NULL | auto_increment | 
| createdAt | datetime  | NO |  | NULL |    | 
| updatedAt | datetime  | NO |  | NULL |    | 
| version | int(11)  | YES |  | NULL |    | 
| running | tinyint(4) | YES |  | NULL |    | 
| scheduler | varchar(255) | YES | UNI | NULL |    | 
+-----------+--------------+------+-----+---------+----------------+ 

基本的に第1のインスタンス場合、スケジューラ1(実行中)に属性を「実行中」のセットのときを起動0(停止)に設定完了。このアプローチ

問題:

  • すべてのスケジューラは、テーブル(冗長コード)を検証するためのコードの同じ束を有します。
  • このバンチを忘れた場合、スケジューラが正しく動作しません。

最適な解決策ではありませんが、緩和策では機能します。

+0

応答のおかげで、これは本当に私はクォーツjdbcサポートを使用する予定ですが、私が最初の仕事から得たユーザーのリストを処理しながらロードバランシングを行う方法について。 – prred