PlumeのRiker導入
問題:トランザクションのコミット後に、add_documentとかされるようにしたい
Post::insert()とかの中で即座にadd_document()とかすると、コミットがされてなくてデータを取れないタイミングがある
今はそのために、アドホックに500ミリ秒待ってるけど、例えばトランザクションの中で外部サービス叩いたりすると容易に崩壊する
解決案:アクターにはDB接続じゃなくて、ドキュメントだけを文字列で渡す
検索関連からDBへの依存を削除できるので、疎結合にはなる
現段階で意味のある疎結合なのか微妙だけど
この場合はPost::publish_published()とかの中で、関連するブログとかのデータもDBから引っ張ってくることになる
Postはチャネルの向こうでどんなアクターが待っているか知らないから、ブログデータとかを使うアクターがいなくなった際に気付かず、無駄なクエリーを発行し続ける可能性もある
解決案:「トランザクション後コールバック」をPost::insertとかに渡して、その中でpublish_publishedとかを呼ぶ
解決案:独自DbConnを作る
↑のバリエーション。
DbConnをPost::insert()とかに渡すという今のシグニチャーは変わらない
独自DbConnには、トランザクション終わりのコールバックを登録できる
トランザクションのネストもちゃんと管理しないといけない
トランザクション使ってない時の挙動もエミュレーションしたいから、結構中身を調べないといけない
Dieselにパッチを送るのがいいかも
それ以外は今のDbConnと変わらない
「トランザクション失敗時に、DBに保存されなかったデータもチャネルに投げてしまう」ということを防げる
解決案:SearchActorにリトライを設ける
トランザクションを使わない時(現在がそう)は、500ミリ秒待ちを入れなくても特に問題が起こらない
recvに、というかPostPublishedとかにリトライ回数を渡すようにしてやる
リトライ戦略(イクスポーネンシャルバックオフとかリトライ回数とか)は初期化時に持つのでいいよね
トランザクションを使う場合は、一回目はほぼ失敗することになる
トランザクション待ちのためだと思うといけてない気はするが、いずれリトライ機構は欲しくなるから、Rikerのアドオンとして作るのはあり
解決案:Post更新サービスオブジェクトを設ける
Postの中の一メソッドでもよい
そいつがトランザクション実行とpublish_publishedを両方やる
とにかく、必ずセットで実行される、ということをプログラマーに期待するのでなく保証したい
もっと大きいトランザクションの中でそのサービスが呼ばれた時に検知できないからあまりよくない