一个项目在集群中运行,如何让定时任务只运行一次?不加限制就会导致重复计算的问题。
人生最曼妙的风景,竟是内心的淡定与从容!
Java の場合は、quartz を使用することをお勧めします。 1. Quatz は、スケジュールされたさまざまなタスクを実行するのに非常に便利です。 2. クラスターをサポートすることにより、同じタスクがデータベース テーブルを通じてのみ実行されます。
最も単純な方法で使用すると仮定すると、quartz、コードを変更し、ジョブ ロジックにロックを取得する操作を追加する必要があります。このロックはデータベースで使用できます。具体的な方法は次のとおりです。ビジネス上重要なレコードをキーとして実行し、クラスター内で同じジョブの挿入が成功するのは 1 回だけです。これは、ロックが取得されて実行できることを意味します。それ以外の場合、ジョブは実行されずに終了します。
quartz
JDBC-JobStore を使用してクラスタリングを構成する
Quartz のクラスタリング機能は、フェイルオーバーおよびロード バランシング機能を通じてスケジューラに高可用性とスケーラビリティの両方をもたらします。
quartz 自体はクラスタリング、フォールトトレランス、ロードバランシングをサポートしています。これはコードを変更することなく実現できます。
quartzフレームワークはクラスタリングをサポートします
スケジュールされたタスクのトリガー、メッセージのサブスクリプションと消費を具体的に管理するミドルウェア システムを作成できます。時間がトリガーされると、メッセージが送信され、クラスター システムがこのメッセージをサブスクライブします。メッセージはクラスター内の任意のマシンにランダムに配信できます。
マシンが計時を開始すると、他のマシンにメッセージをブロードキャストする必要があります。ただし、各マシンの時間間隔が問題です。メッセージが送信される前に、すべてのマシンが定期的にオンになります...
zookeeper、redis などを使用して、スケジュールされたタスクの実行ステータスやその他の情報を手動で保存し、タスクが 1 回だけ実行されるようにします。
スケジュールされたタスクを別のプロジェクト (単一マシン上で実行) に抽出しますが、タスクの特定の内容はリモート呼び出し (dubbo、mq など) を通じて特定の分散サービスを呼び出します。つまり、スケジュールされたタスクはタスクのトリガーのみに単独で使用され、特定のタスクは分散して実行されます。
Uncode-Schedule などのさまざまな分散タスク スケジューリング システムを使用する
私はそれを取り出してスタンドアロンのプログラムを作ることが多いです
Java の場合は、quartz を使用することをお勧めします。
1. Quatz は、スケジュールされたさまざまなタスクを実行するのに非常に便利です。
2. クラスターをサポートすることにより、同じタスクがデータベース テーブルを通じてのみ実行されます。
最も単純な方法で使用すると仮定すると、
quartz
、コードを変更し、ジョブ ロジックにロックを取得する操作を追加する必要があります。このロックはデータベースで使用できます。具体的な方法は次のとおりです。ビジネス上重要なレコードをキーとして実行し、クラスター内で同じジョブの挿入が成功するのは 1 回だけです。これは、ロックが取得されて実行できることを意味します。それ以外の場合、ジョブは実行されずに終了します。JDBC-JobStore を使用してクラスタリングを構成する
Quartz のクラスタリング機能は、フェイルオーバーおよびロード バランシング機能を通じてスケジューラに高可用性とスケーラビリティの両方をもたらします。
quartz 自体はクラスタリング、フォールトトレランス、ロードバランシングをサポートしています。これはコードを変更することなく実現できます。
quartzフレームワークはクラスタリングをサポートします
スケジュールされたタスクのトリガー、メッセージのサブスクリプションと消費を具体的に管理するミドルウェア システムを作成できます。時間がトリガーされると、メッセージが送信され、クラスター システムがこのメッセージをサブスクライブします。メッセージはクラスター内の任意のマシンにランダムに配信できます。
マシンが計時を開始すると、他のマシンにメッセージをブロードキャストする必要があります。ただし、各マシンの時間間隔が問題です。メッセージが送信される前に、すべてのマシンが定期的にオンになります...
zookeeper、redis などを使用して、スケジュールされたタスクの実行ステータスやその他の情報を手動で保存し、タスクが 1 回だけ実行されるようにします。
スケジュールされたタスクを別のプロジェクト (単一マシン上で実行) に抽出しますが、タスクの特定の内容はリモート呼び出し (dubbo、mq など) を通じて特定の分散サービスを呼び出します。つまり、スケジュールされたタスクはタスクのトリガーのみに単独で使用され、特定のタスクは分散して実行されます。
Uncode-Schedule などのさまざまな分散タスク スケジューリング システムを使用する
私はそれを取り出してスタンドアロンのプログラムを作ることが多いです