黄舟2017-04-18 09:28:19
インポテンスとは、一般に、そのメソッドがビジネス ステータスを変更しないことを意味するため、繰り返しの呼び出しの効果が 1 回の呼び出しの効果と同じであることを保証できます。
説明を見ると、 スケジュールされたタスク と 非同期処理 はビジネス ステータスを変更する可能性があります (データの挿入など)。メソッド自体は、メソッドではない可能性があります。 power 待ってください。この場合、基本的に解決策はありません。
あなたの質問の背後にある実際のアイデアは次のとおりだと思います: 分散環境において、スケジュールされたタスクや非同期処理に対して 繰り返しリクエスト を送信するときに、実際のビジネス ロジックが のみ実行されるようにする方法一度?
その場合、集中ストレージ (redis など) を使用して呼び出し元のリクエスト レコードを保存できます。リクエストを受信した後、サーバーはアトミック クエリと保存操作 (redis のsetnx コマンドなど) を使用します。 1 つのリクエストのみが正常に保存されるようにするため、実際のビジネスを 1 回だけ実行するという効果が得られます。 リーリー
PHPz2017-04-18 09:28:19
私はこの分野での経験はありませんが、同社のアプローチは IP を使用して判断することであり、指定された IP のみがこのスケジュールされたタスクを実行できます。
以下は実際の経験を持たない個人的な空想です:
スケジュールされたタスクを処理するためだけにパブリック アプリケーションを構築し、特定のアプリケーションが呼び出すためのメッセージ インターフェイスを提供します。
PHP中文网2017-04-18 09:28:19
+1 演算を = 演算に変更するなど、演算自体を冪等にします
各オペレーションに ID を与え、各実行を記録します。実行前に、この ID のオペレーションが以前に実行されたかどうかを確認します。
大家讲道理2017-04-18 09:28:19
RabbitMQ などの ACK メカニズムを備えたメッセージ キューを検討できます。これにより、タスクが 1 つのワーカーにのみ割り当てられるだけでなく、タスクの成功の整合性も保証されます
巴扎黑2017-04-18 09:28:19
これまでの答えは、受け入れられたものも含めてすべて間違っています。その理由は、スケジュールされたタスクや非同期処理は冪等性とは何の関係もないからです。