分散ロック
概要
英語で Distributed Lock と言う
リソースのロック状態を管理するものを分散ロックマネージャ (Distributed Lock Manager)という
Redlock
Redis 分散ロックマネージャとして使った分散ロックのこと
特徴
常に一つのクライアントのみがロックを取得できる
dead-lock free
耐障害性
Redis ノードが過半数生きている限り
Redis クラスターを使う前提ぽい
ドキュメントには Redis 1台で SETNX を使って分散ロックを実現する方法も書いてあった (それは Redlock ではない)
分散ロックを使おうとなること自体が誤り
そして、分散ロックを使うと結局は分散システム上でトランザクションを再発明することになる、とのこと
分散システムなので、ロックを取ったものが突然消えることはよくある
これによって無理やりロックを解放する必要が出てくる
例えば、一定時間経過後にロックを自動で解放する、とか
こうすると問題が2つ起きる
一つは、ロックを取ったマシンがダウンした、などで消えるケースではなく
消えたと思ってもネットワーク切断していただけで実は生きて処理を継続していた、バグとか何かの要因でいつもより処理時間が掛かって自動解放されるまで処理が終わらなかった、とかだと思われる
もう一つは、ロックを解放しても処理がどこまで実行されたのかわからない、という問題
中途半端にストレージに永続化してしまったかもしれないし、実は全部の処理が終わっていたのかもしれない
これらに対処するのは大変である
そして、対処するなら結局は処理をアトミックに扱う、まさにトランザクションを分散システムの上に作ることに行き着くのだ、という記事
たぶん