java - 分布式环境下,定时任务或异步处理如何保持幂等性?
天蓬老师
天蓬老师 2017-04-18 09:26:19
0
9
790
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(9)
黄舟

インポテンスとは、一般に、そのメソッドがビジネス ステータスを変更しないことを意味するため、繰り返しの呼び出しの効果が 1 回の呼び出しの効果と同じであることを保証できます。

説明を見ると、 スケジュールされたタスク 非同期処理 はビジネス ステータスを変更する可能性があります (データの挿入など)。メソッド自体は、メソッドではない可能性があります。 power 待ってください。この場合、基本的に解決策はありません。

あなたの質問の背後にある実際のアイデアは次のとおりだと思います: 分散環境において、スケジュールされたタスクや非同期処理に対して 繰り返しリクエスト を送信するときに、実際のビジネス ロジックが のみ実行されるようにする方法一度?

その場合、集中ストレージ (redis など) を使用して呼び出し元のリクエスト レコードを保存できます。リクエストを受信した後、サーバーはアトミック クエリと保存操作 (redis の

setnx コマンドなど) を使用します。 1 つのリクエストのみが正常に保存されるようにするため、実際のビジネスを 1 回だけ実行するという効果が得られます。 リーリー

いいねを押す +0
PHPzhong

私はこの分野での経験はありませんが、同社のアプローチは IP を使用して判断することであり、指定された IP のみがこのスケジュールされたタスクを実行できます。

以下は実際の経験を持たない個人的な空想です:
スケジュールされたタスクを処理するためだけにパブリック アプリケーションを構築し、特定のアプリケーションが呼び出すためのメッセージ インターフェイスを提供します。

いいねを押す +0
迷茫

トランザクション、分散トランザクション、またはメッセージ キューを使用して実装します

いいねを押す +0
洪涛
  1. +1 演算を = 演算に変更するなど、演算自体を冪等にします

  2. 各オペレーションに ID を与え、各実行を記録します。実行前に、この ID のオペレーションが以前に実行されたかどうかを確認します。

いいねを押す +0
大家讲道理

RabbitMQ などの ACK メカニズムを備えたメッセージ キューを検討できます。これにより、タスクが 1 つのワーカーにのみ割り当てられるだけでなく、タスクの成功の整合性も保証されます

いいねを押す +0
黄舟

これは、zk スケジューリングによって実現されます。分散環境では、ZK はこの機能を最大限に実現できます。

いいねを押す +0
巴扎黑

これまでの答えは、受け入れられたものも含めてすべて間違っています。その理由は、スケジュールされたタスクや非同期処理は冪等性とは何の関係もないからです。

いいねを押す +0
巴扎黑

redis + トークンで十分です

いいねを押す +0
洪涛

キューを使用すると、一度だけ実行され、実行が失敗した場合はキューに戻され、次回まで待機されます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート