はじめに
チャットボットフレームワークといえばGithub製のHubotが有名ですが、私はRubyが好きなので @r7kamura さん作のRubotyを使ってます。
RubotyにはBrainというデータを持つ仕組みがあり、標準ではメモリに保存されます。
メモリに保存するだけではデータの永続化ができないので、永続化にはプラグインを使用します。
この記事では、RubotyのデータをローカルのLevelDBに保存して永続化する方法を紹介します。
LevelDBを使うので、Redisのようにサーバを建てる必要はありません。
Rubotyを自前のサーバで運用してて、無駄なサーバは建てたくないという人には向いています。
逆に、RubotyをHerokuなどローカルでのファイルが永続化されない環境で運用してる人には向いてません。
(ほとんど後者だと思いますがw)
Rubotyについてはr7kamuraさんのブログを御覧ください。
LevelDB
LevelDBはGoogle製のKVSです。
InfluxDBやRiakのバックエンドに使われています。
Google先生は
LevelDB is a fast key-value storage library
と表現してます。
よくあるDBはサーバーを建てたり運用したりとめんどくさいですが、LevelDBの場合はライブラリから直接ファイルを操作するためサーバは不要です。
操作もとてもシンプルで、基本はPut(key, val)
とGet(key)
とDelete(key)
だけです。
そのためLevelDBをバックエンドにしてリッチなインターフェースを提供する、みたいな形で使われることが多いようです。
KyotoCabinetなんかのKVSライブラリと似ています。
ruboty-leveldb
RubotyのLevelDBでのデータ永続化を行うのは非常に簡単で、RubotyのGemfile
にgem "ruboty-leveldb"
を追加するだけです。
ただし、実行する環境にSnappyという圧縮ライブラリをインストールする必要があります。
Snappyインストール
Mac
MacだとHomebrewでインストールできます。
brew install snappy
CentOS 6 / 7
CentOSはyumでインストールできます。
sudo yum install snappy
Ubuntu
Ubuntuはapt-getでインストールできます。
sudo apt-get install snappy
Ruboty作成
では実際にLevelDB BrainのRubotyを作ってみます。
mkdir ldb-ruboty
cd ldb-ruboty
bundle init
echo 'gem "ruboty-leveldb"' >> Gemfile
echo 'gem "ruboty-alias"' >> Gemfile
bundle install --path vendor/bundle
Rubotyを起動して、データの永続化を確認します。
確認にはaliasを使います。
$ bundle exec ruboty
Type `exit` or `quit` to end the session.
> ruboty alias name -> nownabe
Registered alias: name -> nownabe
> ruboty list alias
name -> nownabe
> quit
$ bundle exec ruboty
Type `exit` or `quit` to end the session.
> ruboty list alias
name -> nownabe
> quit
1度終了してもaliasは登録されたままになっているので、データが永続化されていることがわかります。
データの実態は、Rubotyを起動したら作成されるruboty.ldb
というディレクトリになります。
これはLevelDBのファイル群です。
$ ls
Gemfile Gemfile.lock ruboty.ldb vendor
このディレクトリは、LEVELDB_PATH
という環境変数で指定できます。
おわりに
Rubotyのデータ永続化にRedisみたいなリッチなDBは必要ないと言う方は、是非試してみてください。