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

常に必ず最新の値が読み込めるという状態です。
一見すると良さそうですが、最新の値が読めるようになるまで読み込めないため、
注意が必要です。