⚠️ このエントリーは1年以上前に作成されたものです。情報の賞味期限切れにご注意ください。
たかがPub/SubごときにRedisを使うのは、構成要素に余計なものが増えて嫌だなーってなっていた。
で、MongoDBでPub/Subすることにした。
ところが、globalsign/mgoを使ってcapped collectionを作ろうとすると、 not master
のエラーで死ぬ。
どうやらレプリカセットのsecondaryに繋ごうとして死ぬっぽいが、デフォルトって普通は primary
だよな?
よく分からん。
分からんものはどうしようもないから、うまいことやる。
mgoのgodocを見ると、 Strong mode
なるものが存在している。
これは自称 強力な整合モード
らしく、要するに primary
っぽい。
なので、 session.SetMode(mgo.Strong)
を指定するとcollectionを作れた。
ちゃんと書くならこんなんかな?
めんどくさいから must
の方にブチ込んだけど。
func session(address string, ssl bool) (*mgo.Session, error) {
dialInfo, err := mgo.ParseURL(address)
if err != nil {
return nil, err
}
if ssl {
tlsConfig := &tls.Config{}
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
return conn, err
}
}
session, err := mgo.DialWithInfo(dialInfo)
session.SetMode(mgo.Strong, true)
return mgo.DialWithInfo(dialInfo)
}
Go流石に primary
のままはアホなので、戻すのを忘れないようにしておく。
と言っても defer
で secondaryPreferred
とかに戻せばいいだけ。
session.SetMode(mgo.Strong, true)
defer session.SetMode(mgo.SecondaryPreferred, true)
Goみたいな感じ。
Merge pull request #39 from mohemohe/PKT-36 · mohemohe/parakeet@c023457#36 ReplSet環境でpubsub用collectionが作成されないのを修正