分散型インタフェース冪等

https://www.cnblogs.com/huaixiaonian/p/9577567.html

最近、友人とこの話題についておしゃべり次の勉強したいので、要約レコードを学んで、この記事では、感謝する包括的なから、次のブログを参照してください。

http://blog.brucefeng.info/post/api-idempotent

http://825635381.iteye.com/blog/2276077

https://www.cnblogs.com/leechenxiang/p/6626629.html

1.インターフェースの存在が問題を呼び出します

        今日、当社のシステムは、主に別のサービスを呼び出すために傾向があり、サービスはRPC通信を使用して通話サービス以外の何物でもない分散型SOAに分割、またはマイクロサービス、システムは、複数のサブシステムやサービス、およびサービス・サブシステムが含まれていますそれはコミュニケーションであるため、サーバは、応答しませんでした長い時間のためのクライアントを見つけるために、この時間をハングアップする場合や安らかな、それが処理のリターンをもたらすことができる、それはボタンを数回、非常に多くの時間をクリックします要求、データの処理があります結果は、それを統一する必要があるかどうか?それは確かです!特に決済シーンインチ

 

2.インターフェースの冪等とは何ですか

       冪等のためのユーザインターフェイスを開始同じ操作の要求または複数の要求の結果が同じで、複数のクリックは副作用を生じないです。簡単な例を与えるために、それが支払われているユーザーが商品の支払いを購入した後、成功したデビットが、異常なネットワークは、お金が控除されているこの時間は、ユーザーがもう一度ボタンをクリック返す結果は、この時間は、第二のバックルになりますお金、成功した結果への復帰は、戻って、ユーザーのクエリにバランスがお金を控除以上のものを見つけ、水が、レコード2となっています。、どちらが保証インターフェース等べきではありません

 

そのインターフェイスの冪等を確保する必要がどのような状況下では3

   4回のCRUD操作では、特に注意が追加または変更することで、

  A:クエリ操作

     クエリ結果は、かつて何度も変更する必要があり、およびクエリクエリではないでしょうについては、同じデータの場合には、クエリ結果は同じです。自然の冪等の操作を選択

 B:削除

    一度削除し、複数のは、すべてのデータが削除され、削除します。(同様に削除操作を考慮せずにリターン結果に戻り結果、複数の冪等aは、削除されたデータの複数の、0に戻り、削除するデータが存在しない、結果を返さないことに注意)

 C:アップデート

   ほとんどのシナリオでの変更の結果が、増分変更がその冪等性を確保するために必要とされる場合は、次の例:

   idフィールドは、値XXXを表1に記録さに設定され、この操作は関係なく、何回冪等されているのが行われる
   表のIDフィールド値はXXXを増加させる、この操作は、冪等レコードではありませんの

 D:新事業

   シーンを繰り返し提出に発生し、上記の支払いの問題として冪等の問題を、増加

 

4.どのように我々はそう何インターフェースの電源を設計することができますか?

   二つの一般的な実装:1. 2.以下のメカニズムは、冪等インタフェースおよび実装を説明するそれぞれコード決意ロジックによって例として支払システムをトークン実装する実装

    A:実装コード・ロジックは、インターフェイス冪等によって決定される、判定のために実装ロジックの一部のみが満たされ、一定の制限を有しています

   商品を購入するためのシステムおよび支払いシステムのユーザを注文。ユーザーの購入履歴を記録するための責任が発注システムは、状態の転送順序(オーダーステータス)、支払いの決済システム、分散ネットワークの相互作用を介して決済システムとのシステムを注文するためのインタフェースを提供してきました。

ブールペイint型のaccountId のBigDecimal 金額を//支払いのために、私たちは、ユーザーのから控除しました

この場合、決済システムが充電されていますが、注文システムを再試行する必要がありますので、注文システムネットワーク上の理由から、正確な結果を取得できませんでした。図は、システムが最初の呼び出しと2番目の通話を注文し、ユーザーは二回お金拘留され、決済システムは、冪等のインタフェースをしない示し、かかわらず、(冪等の原則と同じ順序に準拠していません。何度も呼び出され、ユーザーはのみ)一度課金されます。あなたは冪等をサポートする必要がある場合は、支払インターフェースは、次のインターフェイスを変更する必要があります。

  ブール  有料int型  注文ID int型  のaccountId のBigDecimal 

受注コード一意で注文を校正するために、限り決済システムは、注文が既に支払われていることを検出すると、2番目の呼び出しは課金されず、直接結果を返します:

異なる企業の異なるインタフェースでは、ネットワーク上の理由は、結果を決定していないので、特に分散システムでは、異なる冪等を必要とし、多くの場合、我々は、インタフェースの冪等をサポートする必要があります。

システムを呼び出すために導いたネットワーク理由は冪等と呼ばれるようにシステムを必要とする、再試行につながる正確な結果を得るために失敗したため、分散システム及びマイクロサービスの人気が。注文の支払いのステータスが決定されると、例えば上述し、支払いシステム、冪等の支払いを確実にするのと同じ順序ため、以降の動作は、同じ結果が返され、ユーザは一度だけのために課金されます。このインタフェースの冪等、操作のデータ側面を簡素化:

update userAmount set amount = amount - 'value' ,paystatus = 'paid' where orderId= 'orderid' and paystatus = 'unpay'

其中value是用户要减少的订单,paystatus代表支付状态,paid代表已经支付,unpay代表未支付,orderid是订单号。

在上文中提到的订单系统,订单具有自己的状态(orderStatus),订单状态存在一定的流转。订单首先有提交(0),付款中(1),付款成功(2),付款失败(3),简化之后其流转路径如图:


当orderStatus = 1 时,其前置状态只能是0,也就是说将orderStatus由0->1 是需要幂等性的
update Order set orderStatus = 1 where OrderId = 'orderid' and orderStatus = 0

    当orderStatus 处于0,1两种状态时,对订单执行0->1 的状态流转操作应该是具有幂等性的。这时候需要在执行update操作之前检测orderStatus是否已经=1,如果已经=1则直接返回true即可。

    但是如果此时orderStatus = 2,再进行订单状态0->1 时操作就无法成功,但是幂等性是针对同一个请求的,也就是针对同一个requestid保持幂等。

    这时候再执行

 update Order set orderStatus = 1 where OrderId = 'orderid' and orderStatus = 0 

    接口会返回失败,系统没有产生修改,如果再发一次,requestid是相同的,对系统同样没有产生修改。

 

 B: 使用token机制实现接口幂等性,通用性强的实现方法

     token机制实现步骤:

     1. 生成全局唯一的token,token放到redis或jvm内存,token会在页面跳转时获取.存放到pageScope中,支付请求提交先获取token

     2. 提交后后台校验token,执行提交逻辑,提交成功同时删除token,生成新的token更新redis ,这样当第一次提交后token更新了,页面再次提交携带的token是已删除的token后台验证会失败不让提交


     token特点:   要申请,一次有效性,可以限流

     注意: redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用

おすすめ

転載: www.cnblogs.com/Andrew520/p/11407334.html