冪等とは何ですか

つのプライマリと複数のリソース要求:HTTP / 1.1は、それがあるべき等と定義されているリソース自体には、(ネットワークタイムアウトの問題を除いて)同じ結果を持っている必要があります。換言すれば、その複数の実行のいずれかは、それ自体に有するリソースの影響一度同じ衝撃を用いて実施しました

方法は、N> 0の同一の要求の副作用が単一のリクエストと同じである(余談エラーまたは有効期限の問題から)という点で、「冪等性」の性質を有することができます。

我々はいくつかのポイントに焦点を当てるべきです:

  1. 冪等だけではなく1つ(または複数)のリソースに悪影響要求しない(例えばデータベース操作を照会として、無付加および欠失を、したがってデータベースへの影響はありません)。

  2. 初めての冪等も副作用を生成するために、リソースの要求が含まれていますが、多くの後続の要求は、資源への悪影響をもたらすことはありません。

  3. べき等の懸念はむしろ結果に焦点を当てるよりも、生成されたリソースを繰り返し要求した後、副作用かどうかです。

  4. ネットワークタイムアウトやその他の問題は、議論を冪等ではありません。

冪等(そして達成しない)限り、成功したコール・インターフェースへのコミットメントとして、システムに外部からの衝撃に複数のコールが一致しているコミットメント外部システムサービスです。宣言された冪等のサービスコールは、規範の外側を考える失敗し、失敗した後そこに再試行する必要があります。

何の下では状況が冪等を必要とします

事業開発は、多くの場合、重複提出の場合に遭遇し、いずれかのネットワークの問題の要求、または繰り返し提出によって引き起こされるフロントエンドジッタの動作を再開始するための要求の結果を受け取ることができません。繰り返し例えば、特に顕著な質問を提出する原因となった取引システム、決済システムでは:

  1. ユーザは、背景が一つだけ注文を生成する必要があり、注文を提出連続APPの数をクリックします。

  2. ネットワークの問題またはシステムBUG再送に、宝の支払いに支払い要求を開始し、アリペイはお金だけ一度控除されなければなりません。 もちろん、電源や他のサービスの文は、外部の発信者の存在が複数回呼び出されることを信じて、外部データシステム状態への複数の呼び出しの発生を防止するためにサービスを電源に設計されたというようにされ、何度も変更しました。

冪等VSアンチリプレイ

中小アウトにより発生した問題の上記の例が、重複して提出した場合、およびサービスの冪等本来の意図は異なっています。最初の要求が成功した繰り返しの場合に提出、人間の複数の操作、電源が得られことは、複数のサービス変更状態の要件を満たしていません。電源状況、およびより多くの(例えば、タイムアウトなど)または複数の要求を開始する障害が発生した例外的なケースでの結果を知らない最初の要求を使用している、リクエストの目的はなく、ために複数の要求の、初めて確認に成功し、多くの倍でした状態の変化が数回発生します。

どのような状況の下で冪等性を確保する必要性

SQLには、例えば、以下の3つのシナリオがあり、唯一の第三のシナリオは冪等を確保するために、他の戦略を使用する開発者が必要です。

  1. SELECT col1 FROM tab1 WHER col2=2どんなに実行状態を変更しません何回、それは自然な冪等ではありません。

  2. UPDATE tab1 SET col1=1 WHERE col2=2、かかわらずの実装の成功回数の状態が同じであるため、電源や他の操作。

  3. UPDATE tab1 SET col1=col1+1 WHERE col2=2、結果が変わります各実行には、これは冪等ではありません。

なぜ冪等の設計サービス

べき等のクライアントは、単純な論理を扱うが、サービス・ロジックを犠牲にして複雑であることができるように。ロジックで少なくとも2点を含むようにニーズを満たすために、冪等のサービス:

  1. その後、最初の要求であると考えられていない場合、最初の状態の実装に問い合わせに行きます

  2. その抗ロジックの重複提出を確保するためのサービスのビジネスロジックの状態を変更する前に

不適切な冪等

べき等は、可能な限りのインタフェース冪等を提供するのではなく、特殊な運用要件に加えて、ロジックをクライアントロジックを簡素化するために、必要に応じて、サービスプロバイダのコストが増加している、シーン解析のための特定の必要性、そう。

  1. 追加の制御冪等ビジネスロジック、複雑なビジネス機能を追加します。

  2. 実行される機能の並列実行のシリアルは、効率が低下します。

そして、他の戦略は、電力を確保するために、

べき等が必要なだけで、単一の事業数が保証されます。ビジネスとしているのと同じ単一の事業番号。そのビジネスユニットを確実にするために、このユニークな番号を使用し、複数の単一番号サービスと同様の効果の背後に処理ロジックを実行することは一貫しています。以下は同時実現冪等を考慮せず場合には、例えば、カバーすることは簡単です:①注文が既に支払われている場合は、オフに支払っている場合は、最初のチェックは、その後の成功のお支払いに戻って、②、見るために、お支払い手続きを支払っていない場合は、修正「有給」に注文状況。

抗再送信戦略

上述した実施形態は、2つのステップ、第一のステップ②①クエリ結果の従属ステップを冪等されていることを確認するために、アトミック性を保証することはできません。以下は、高い同時実行の場合に表示されます。第二に、要求が最初の要求ステップ②発注状況の場合には来ては「支払った状態」に変更されていません。それがこの結論に達しましたので、残りの問題は簡単になります。操作のロック状態を照会および変更するには、代わりにシリアル動作の並列に動作します。

オプティミスティック・ロック

のみ更新する場合は、既存のデータを、通常バージョン楽観的ロックによって行わ楽観的ロックの設計テーブルの構造を、使用して、ビジネスのロックを行う必要がないので、実装の効率性を保証することができますが、またようにその力を確保します。たとえば:  UPDATE tab1 SET col1=1,version=version+1 WHERE version=#version# しかし、楽観的ロックの障害の存在は、多くの場合、バージョンがある場合、それは表示されませんので、ABAの問題は、しかし、バージョンが成長していると言われABAの状況を。(例示的な楽観的ロックである画像を見つけるためにインターネットから、楽観的ロックのためのMyBatisの支持体から、上に引用) 

アンチ重いテーブル

表重量に対して一意のインデックスとしてORDERNO順序番号を使用し、これは各リクエストの順序番号の重量に応じてデータテーブルに挿入されます。最初の支払い要求が成功したか否か、注文状況、支払われていないもちろんのオーダー、決済業務を照会するために、更新発注状況の実装後に成功したか失敗したか、データ重複排除テーブルを削除しています。その後の注文は一意のインデックステーブルが失敗挿入するので、それは、操作が失敗した最初の最大の要求の完了(成功または失敗)を返します。重いアンチロック機能を見ることができるように関数テーブルです。

分散ロック

本明細書で使用される抗重みテーブルは、Redisのように、分散ロックの代わりに使用することができます。ご注文は、支払い要求を開始し、支払キーキャッシュシステムが存在しない場合は、注文番号をキーとしてRedisの増加し、Redisのに注文番号が存在するかどうかをチェックします。その後、完全な支払い後の注文数を、それを支払うキーは削除しない場合はご注文のお支払いは、支払われたか確認してください。Redisのは、このオーダオーダ支払い要求が、中に来て次の要求を完了し、分散ロックによって行わ。重いテーブルと比較すると、同時に行うキャッシュより効率的に置きます。同じ考え、同じ時間だけで支払い要求後に完了することができます。 

トークントークン

位相およびアプリケーショントークン支払い相:このモードでは、2つのフェーズに分かれています。第一段階は、前の注文ページに入るに提出する、あなたは、Redisのキャッシュを保存する第二段階のために支払うことになるトークン支払いシステム要求トークン決済システムのために適用するために、ユーザ情報システムに基づいて受注を開始する必要があります。第二段階は、トークンの支払い要求が開始されるに適用するためのシステムを取った、トークン決済システムの存在はRedisのを確認し、存在する場合、トークンは論理処理を払って起動した後にキャッシュを削除し、最初の支払い要求が開始される表し、キャッシュ場合それは、存在する不正な要求を示すものではありません。実際には、ここでトークンに基づいてトークン記念品、決済システムである、あなたの母親の子供であることを確認。相互作用の欠如は、2つのシステム間に必要とされる上記より、複雑な処理を行います。 

ペイ・バッファ

支払依頼の注文はすぐに迅速な単一バッファパイプライン、その後、続いています。支払指図書をフィルタリングするための非同期タスクにおけるデータ処理パイプラインのその後の使用が繰り返されます。利点は、同期、非同期転送、高スループットです。タイムリーに結果を返すことができません支払うには不十分である、我々はフォローアップの結果が支払うことに非同期で返される監視する必要があります。

CAS(楽観的ロック)、およびABAの問題

排他ロックは、同期悲観的ロックは、排他ロックの一種であり、それは他のスレッドが実行を妨げないことを保証するために、そして唯一のケースでは、最悪のケースを想定しているロックを保持するために必要になるまで他のすべてのスレッドが中断させますロックのスレッドがロックを解除します。

いわゆる楽観的ロックは、アクションを完了するために離れて矛盾がないと仮定すると、毎回ロックが解除され、その後、競合とは、それが成功するまで再試行する行けば。

CASは、(比較とスワップ)のよく知られたロックフリーのアルゴリズムです。CASアルゴリズムは楽観的ロックの実装です。CASは、メモリ値V、旧Aの期待値は、新しい値Bを変更する、3つのオペランドを持っています 場合にのみ期待値V Aの値と同じメモリなら、メモリ値は、V Bを変更し、真を返し、そうでない場合は偽を返しています。

注:同期とReentrantLockのは悲観的ロックです。

注意:、楽観的ロック効率を使用しているもののより一層の活用をより悲観的ロック効率を使用している場合、それは実際の状況に基づいて判断する必要があります。

何CASのメカニズムである
CASは、比較と交換するために変換され、英語の単語の略語比較とスワップです。

三つの基本的なオペランドを使用してCASメカニズム:メモリアドレスV、旧Aの期待値、Bの新しい値を変更するには

変数を更新し、場合にのみ、メモリアドレスが値V Bを修正するために、対応する同一の、唯一のメモリアドレスである変数AとVの期待値の実際の値

CASは、比較と交換するために翻訳し、英語の単語の比較とスワップの略です。

三つの基本的なオペランドを使用してCASメカニズム:メモリアドレスV、旧Aの期待値、Bの新しい値を変更するには

変数を更新し、場合にのみ、メモリアドレスが値V Bを修正するために、対応する同一の、唯一のメモリアドレスである変数AとVの期待値の実際の値

少し抽象的かもしれないと言う、我々は例を見て:

Vのうちのメモリアドレスにおいて、10の記憶変数値。

 

2.スレッド1 1は、変数の値を増やすことをお勧めします。スレッド1、旧A = 10の期待値は、11 =新しい値Bを変更します。

 

3.更新スレッド1、スレッド2先に別のステップを提出する前に、可変値Vのメモリアドレス11を更新する最初となりました。

 

4.スレッド1が送信アップデートを開始し、まず、V Aの実際の値とアドレスコンパレータ(比較)、AはVの実際の値に等しく見つからない場合、コミットは失敗します。

 

5.スレッド1は現在の値のVメモリアドレスを再取得し、変更する新しい値を再計算します。この時点で、スレッド1は、B = 12、A = 11です。このリトライ処理は、スピンと呼ばれています。

 

ラッキー6.この時、他のスレッドは、Vアドレスの値を変更しません。スレッド1の比較、我々は、アドレスAとVの実際の値が等しいことがわかりました。

 

7.スレッド1 SWAP、アドレスの値は12であり、BのようにVを置換されています。

 

イデオロギー的に悲観的ロックは、同時実行プログラムは真剣に、そう粘着を防止するために悲観的なことを、同期、属する話します。CASは、プログラムがそれほど深刻ではないと楽観楽観的ロック、並行性を属し、それでは、スレッドを更新しようとしていきましょう。

CASの長所と短所:
それも欠点がありますが、それは本当に並行性を改善するための主な手段となっている、とが、楽観的ロックは悲観的ロック排他的なオブジェクト現象を避けるため、だけでなく、同時実行性を向上させるために、楽観的ロックは、悲観的ロックの改善であります契約中のJDKともCASベースの楽観的ロックの数が多いです。次のようにしかし、それはまた、欠点があります。

1.CPUは大きなオーバーヘッドかもしれ
多数のスレッドが無限に、CPUは多くの圧力をもたらすでしょう、変数を更新しようとする試みを繰り返したが、失敗した更新されている場合、同時の場合よりも高いですで。

コードの2個の原子がブロック保証できない
CAS機構をアトミック操作が唯一の変数であり、全体のコードブロックの原子を保証することはできません保証します。このような一般的な三つの変数は、原子性を更新することを確保する必要性として、あなたはロックされた悲観的使用する必要があります。

3.ABAの問題。
CASの核となるアイデアは、期待値よりもメモリも同じであり、メモリ値はターンオーバーしているかどうかを判断するが、元のメモリの値は、スレッドが後でBに変更されましたし、最後に変更された場合、裁判官は、厳格なロジックではありませんAは、CASはこのメモリの値が変更されていないと考えているが、実際に裏返しにする他のスレッド、プロセス・シナリオの値に依存演算の結果に、この大きな影響があります。アイデアは、すべての変数とみなさバージョン番号に1を加えた更新されたバージョン番号の導入を解決することです。

ABAの質問:
値この前にCASを持つ変数を変更する準備ができて、スレッド1は、変数の他のスレッドの値はAのBに置き換え、そしてAはBで構成されて交換され、その変数の値が実行CASスレッド1のままで見つけ、 CASそう成功しました。しかし、実際には、この時間は、サイトが異なるとオリジナルを持っています。

 

 

ABA問題:
思考:ABAは、最も簡単な解決策を解決するには、変更されたバージョン番号に値が変化すると、それはバージョン番号がこのバージョン番号CAS操作を比較している修正するたびに値を追加することです。

 

ABAソリューションにおけるJAVA(AtomicStampedReference / AtomicMarkableReference)

AtomicStampedReferenceは、本質的に変性されるまで各変更は、このint値の最初のバージョンを取る前に、バージョン番号としてint値を有し、現在のスレッドに現在のバージョンを比較し、バージョン番号を保持し、次に変更を行う同じ場合は、同じですこの方法は+1とバージョン番号を使用しても飼育係におけるデータの一貫性を維持し、(もちろん、それら自身の、またはすべてを定義することができるどの程度によって数を増加させます)。

AtomicMarkableReferenceは、2つのバージョン番号の間で前後に切り替えるために時間を変更し、基本的にそのバージョン番号の2つだけ、trueとfalse、著しい変更があるかどうかのブール値を吸引し、これはABAの問題を解決しませんしかし、ABAの問題にのみ発生の可能性が低くなります。

おすすめ

転載: www.cnblogs.com/h-c-g/p/11209896.html
おすすめ