ホームページ  >  に質問  >  本文

java - 分布式环境下,定时任务或异步处理如何保持幂等性?

天蓬老师天蓬老师2766日前787

全員に返信(9)返信します

  • 黄舟

    黄舟2017-04-18 09:28:19

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

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

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

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

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

    返事
    0
  • PHPz

    PHPz2017-04-18 09:28:19

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

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

    返事
    0
  • 迷茫

    迷茫2017-04-18 09:28:19

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

    1. +1 演算を = 演算に変更するなど、演算自体を冪等にします

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

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:28:19

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

    返事
    0
  • 黄舟

    黄舟2017-04-18 09:28:19

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

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:28:19

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

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:28:19

    redis + トークンで十分です

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

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

    返事
    0
  • キャンセル返事