hagetak's blog

どうも、はげたかです。

冪等性(べきとうせい)とは

冪等性(べきとうせい)とは

ココ1年くらいで、冪等性(べきとうせい)という言葉を何度も聞いた。 ついに業務でもこの言葉が出てきたので、改めて意味を調べてみることにする。

冪等性とは

冪等性とは、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。

よく例にあげられるのは、i = 0i = i + 1 である。

var i = 0; // i は必ず 0 になる:冪等性が保たれる


// 実行する度に i が 1 足される。(実行回数によって、 i の値が変わってしまう)
// :冪等性が保たれない
i = i + 1 

他に例を挙げるなら、 copy も同様である。

copy a.txt b.txt # copy できた

copy a.txt b.txt # 既に b.txt があるため、copy できない overwrite b.txt? (y/n [n])

インフラと冪等性

この概念をインフラ構成に組み込んだのが、ChefAnsible などである。 システムの機能を変更するなら、サーバーをぶっ壊して、新しく作りなおすというものである。

サーバに nginx がインストールされていれば、繰り返しインストールすると、エラーが返ってくる

を何度実行しても Nginx がインストールされて起動した状態に収束し、何回も繰り返しインストールされたり、既にインストールされているからといってエラーになったりすることはありません。
ほとんどの場合、 Chef の動作は冪等性が保証されていますが、 Script や Execute などの DSL は書き方によっては冪等性が保証されないことがあります。
ですのでレシピを書く際は冪等性が保証されるように意識的に作り込んでください。

from: http://blog.schoolwith.me/chef-re-introduction/

REST と冪等性

  • GET

/show/1

API の種類にもよるが)これは、必ず ID の値が 1 のデータが返ってくる。 何度も、show/1 にリクエストを送っても、 1 のデータが返ってくる。

  • DELETE

/delete/1

id が 1 であるデータが削除される。これも冪等性が保たれる。

おわかりだろうか。

冪等とは「ある操作を何回行っても結果が同じこと」を意味する数学用語です。たとえばPUTとDELETEは冪等ですので、PUTやDELETEを同じリソースに何回発行しても、必ず同じ結果(リソースの内容が更新されている、リソースが削除されている)が得られます。
安全とは「操作対象のリソースの状態を変化させないこと」を意味します。リソースの状態に変化を与えることを副作用といいますので、安全は「操作対象のリソースに副作用がないこと」とも言います。たとえばGETには副作用がないので、GETを同じリソースに何回発行してもリソースの状態は変化しません。

http://blog.ruedap.com/2011/03/25/http-method-post-put-idempotence

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

実践編

http://blog.schoolwith.me/chef-re-introduction/

さいごに

冪等性。冪等性を理解するのは、難しい。実際に AnsibleChef を使ってみることで、有り難みが理解できるのかな。

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)