Rubotyのデータ永続化にLevelDBを使う

More than 3 years have passed since last update.


はじめに

チャットボットフレームワークといえば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のGemfilegem "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は必要ないと言う方は、是非試してみてください。