お昼休みに慌ててリリースしたのでEbisuConnectionの新しいバージョンがまた出てしまう

Tsukasa OISHI

今日のお昼休み、会社の食堂で実装してREADME書いてブログ書いて慌てた感満載でEbisuConnectionをリリースしましたが、案の定、スレーブサーバの設定にRails.envの指定ができないという不具合が存在していました。

家に帰ってきてをお風呂に入れてミルクをあげて笑わせて抱っこして寝かしてつけてから、ようやくコーヒーをいれてダイニングテーブルに座ってMacbookAirを広げてEbisuConnectionを見直しました。

https://github.com/tsukasaoishi/ebisu_connection/tree/v0.0.3

まず、config/slave.yamlの設定に、Railsのenvironmentを指定できるようになりました。

development:
  - "slave"

production:
  - "slave1, 10"
  - "slave2, 20"
  -
    host: "slave3"
    weight: 30

サービスを提供するAPサーバと、バッチを実行するサーバとでは、使用するスレーブサーバのグループを分けたいときもあると思います。そういうときは、config/slave.yamlで以下のように設定しておいて

production:
  service:
    - "slave1, 10"
    - "slave2, 10"
  batch:
    - "batch_s, 10"

config/initializers/ebisu_connection.rbなどで

EbisuConnection:: ConnectionManager.slave_type = "batch"

というように指定しておけば、そのグループのスレーブサーバ群を使用するようになります。

また、スレーブサーバ群の設定ファイル名自体を以下のようにして変更可能です。

EbisuConnection:: ConnectionManager.slaves_file = File.join(Rails.root, "config/slave_db.yml")

EbisuConnectionはスレーブサーバ群の設定の変更を、動的に取り込むことができますが、ざっくり説明すると以下のような動作を行います。

  1. Railsのアクションでの処理が終了し、レスポンスを返す途中、Rack内で現在時刻を確認
    1. 前回確認時から1分以内の場合は何もしない
    2. 1分以上が経過していた場合は、config/slave.yamlのタイムスタンプを確認
    3. Rails起動時の設定を読み込んだときのタイムスタンプと違っている場合、現在の設定値を読み直す
    4. 全コネクションを切断する

2,の手順で確認を行う閾値である、「1分間」はデフォルト値です。以下のようにすれば、好きな間隔に変更できます。

EbisuConnection:: ConnectionManager.check_interval = 10.minutes