mgoのConsistencyについて
mgoのサンプルにあった
session.SetMode(mgo.Monotonic, true)
の意味がよくわからないので調べてみました。
結論から書きますと、これは複数DBを利用した際の、
データの一貫性をどの程度保証するかの設定です。
一貫性制御
mgoには複数のDB間での一貫性を制御する3種類のモードがあります。
const (
Eventual mode = 0
Monotonic mode = 1
Strong mode = 2
)
SetModeにこれを渡すことで、モードを切り替えられます。
それぞれの内容は以下の通りです。
おそらく一貫性がちゃんとしていくに従って、複雑化&遅くなっていきます。
Eventual Consistency
最終的に辻褄が合えばいいよね設定です。
データに変更が無く十分な時間が過ぎると、最終的に全ての更新が反映されます。
更新済みのノードと、そうでないノードが混在する可能性があるため、
どのノードから読み込むのかが固定されない場合、
新しい値を読み込んだ後に、別のノードから古い値を読み込んでしまう…
といったことが起きる可能性があるはずです。
同じノードから読み取る場合は、後述するMonotonic Consistencyと同じになると思います。
Monotonic Consistency
あるプロセスが値を参照したら、以降はその値かそれより新しい値が読み込まれるという設定です。
おそらく、値を参照したタイミングで最新かどうかは保証されないが、
少なくとも古い値が読み込まれることはない、という状態だと思われます。
Strong Consistency
常に必ず最新の値が読み込めるという状態です。
一見すると良さそうですが、最新の値が読めるようになるまで読み込めないため、
注意が必要です。