Tech Racho エンジニアの「?」を「!」に。
  • インフラ
  • 開発

RailsのキャッシュにKyotoTycoonを使えるkyototycoon-storeを作ってみた

RailsのActionCacheを配置するためのActiveSupport::Cache::Storeには、以下のようなものがあります。
(使ったことあるもののみ)

  • FileStore
  • MemoryStore
  • MemCacheStore
  • DalliStore

今回、キャッシュとしての使いやすさから、以下のようなものを探していました。

expires_inサポート
キャッシュなので、しばらくしたら消えてくれないと困ります。
Rails3.2のActiveSupport::Cache::Entryが対応していますが、これはread時にexpireしていたら削除するという方法なので、パフォーマンス上多少不利なほか、キーのパターンが非常に多い場合にキャッシュが肥大化する問題があります。

長いkeyサポート
基本的にURLをそのままkeyにしたいです。
検索ページなどで、1000文字を超えるURLが生成されることは十分ありそうです。

正規表現・prefixによる削除
URLでキャッシュしつつも、ニュースが更新されたらすぐに/news/*をすべて削除すると言った運用をしたいところです。

memcached系は、keyが250byte程度なのと、key一覧を取得できない(非常に重い)ため、非現実的です。
FileStoreは、長いファイル名がたまに問題を引き起こすほか、複数ホストで利用できないのが拡張性の点から不安です。
MemoryStoreは、同様に複数ホストで使えないのと、保存期間を制御しづらいのが使いにくい。

そこで、上記をすべて満たせるKyotoTycoonをキャッシュストアとして使うことにしました。

KyotoTycoonは、KyotoCabinetをネットワーク経由で利用できるようにしたものです。
TokyoTyrantの後継で、以下のような特徴を持っています。

  • TokyoTyrantのように永続化できる
  • HTTPベースのAPI(REST, RPC)
  • memcached互換API、バイナリプロトコルもサポート
  • expireをサポート

また、key一覧の取得(すべて・前方一致・正規表現)をサポートしているのも特徴です。

これぞまさに求めていたもの!
PixivドラクエX、ファイナルファンタジーなどの採用実績もあるようで、安心感もばっちり。

KyototycoonStore

ということで、キャッシュストアとして使えるKyotoTycoonのラッパーを作ってみました。といっても、ActiveSupport::Cache::Storeをコピペして少し書き換えただけですが...

https://github.com/babatakao/kyototycoon-store
接続には、kyototycoon-rubyを利用しています。

利用方法

# Gemfile
gem 'kyototycoon-store', :git => 'git@github.com:babatakao/kyototycoon-store.git'

# config/environments/development.rb
config.action_controller.perform_caching = true
config.action_controller.cache_store = :kyototycoon_store, 'localhost:1978', { expires_in: 600, namespace: 'SAMPLE' }

まだ試験運用中ですが、MANGA REBORNのキャッシュとして利用しています。
ちょくちょくバージョンアップ目指していこうと思います。

TODO:
現状、手抜きしてEntryをMarshalしているので、無駄に重い。
複数台での運用を試す。

KyotoTycoon自体のインストール方法は、丁寧に解説くださっている方がいるので、こちらを参照すると良いと思います(注: リンク更新しました)。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。