食べログで動いている自作ライブラリのお話
DESCRIPTION
クックパッド&食べログ第2回勉強会TRANSCRIPT
食べログで動食べログで動いている自作いている自作ライブラリのライブラリのお話お話
自作ライブラリ
既存のものではダメなのか
・必要な機能を持つライブラリがない
・食べログのニーズに微妙に合わない
・開発が止まっている
自作
・必要な機能を持つライブラリがない→ないなら作ればいい
・食べログのニーズに微妙に合わない→欲している仕様にぴったり
・開発が止まっている→開発者が自分、または同僚
食べログで動いている自作ライブラリ
ActsAsReadonlyable改 ActsAsStateMachine改 TabelogThread MiyazakiResistance TabelogAsync DrySumpException DisguiseToBusinessCode WordScoop TcHash EnhancedColumnType ExceptionLogger
食べログで動いている自作ライブラリ
ActsAsReadonlyable改 ActsAsStateMachine改 TabelogThread MiyazakiResistance TabelogAsync DrySumpException DisguiseToBusinessCode WordScoop TcHash EnhancedColumnType ExceptionLogger
ActsAsReadonlyable改
ActsAsReadonlyableとはmaster
slave2
slave1
CUD
R
RAP
障害が起こるとmaster
slave2
slave1
CUD
RAP
Webサーバーが死んでも大丈夫
APサーバが死んでも大丈夫
DBサーバが死ぬとサービスに影響あり
Webサーバーが死んでも大丈夫
APサーバが死んでも大丈夫
DBサーバが死んでも大丈夫
当然こうしたい
障害が起こるとmaster
slave2
slave1
CUD
RAP
自動切り離し
MySQL::ConnectionError発生
コネクションプール群から該当サーバのプールを除外
リトライ
運用も楽に
メンテナンス等でも気軽にDBを落とせるようになった
TabelogAsync
TabelogAsyncとは
■非同期処理ライブラリ ・backgroundrbが暴走する ・Mongrelを通したくない ・堅牢性はそれほど必要ない
■仮名のまま ・公開するときはカッコいい名前に
Rails側
TabelogAsync::Thrower.send( :class => :async_log, :args => “good”)
lib/worker
class AsyncLog < TabelogAsync::WorkerBase def do_work(args) logger.info args endend
当初の設計思想
軽くてすぐに終わって同期する必要のない大量の処理をさばく
重い処理は従来通りbackgroundrbで
いつの間にか
気軽に使えるので重い処理も回すようになった
シングルスレッドなので遅延が数時間レベルにまで拡大
いくら非同期でも遅れすぎ
Rails Rinda
TabelogAsync
normal
heavy
Rinda
WordScoop
WordScoopとは
■キーワード検索ライブラリ ・はてなダイアリーキーワード ・高速 ・軽量 ・HTML対応
■命名 ・奥さん
登録 5 μs
検索 3 ms
高速
■キーワード登録 1.399998 s (1語 : 0.000005 s)
■キーワード検索(1000回) 3.519995 s (1回 : 0.003520 s)
軽量
インデックス構築後 56Mバイト
キーワード数 262380語検索対象文字数 8789字
使い方
キーワード登録
Index = WordScoop.new(['クリスマス', '鍋'])
キーワード追加
Index << 'はくさい'
キーワード検索
index.search(“クリスマスは鍋にしようか。鍋には はくさいだよね”)
キーワード登録
Index = WordScoop.new(['クリスマス', '鍋'])
キーワード追加
Index << 'はくさい'
キーワード検索
index.search(“クリスマスは鍋にしようか。鍋には はくさいだよね”)
#=> ['クリスマス', '鍋', '鍋', 'はくさい']
HTML変換URLの登録
index.link_url = %Q|<a href="http://cookpad.com/レシピ/%s">%s</a>|
HTML文章への自動リンク付与
index.filter_html(“クリスマスは鍋にしようか”)
HTML変換URLの登録
index.link_url = %Q|<a href="http://cookpad.com/レシピ/%s">%s</a>|
HTML文章への自動リンク付与
index.filter_html(“クリスマスは鍋にしようか”)
#=>
%Q|<a href=”http://cookpad.com/レシピ/クリスマス”>クリスマス</a>は<a href=”http://cookpad.com/レシピ/鍋“>鍋</a>にしようか|
gem install word_scoop
今後の機能追加予定
■検索をさらに高速に ・HTMLの自動リンクアルゴリズム の改良 ・AhoCorasick(エイホ-コラシック)法 の採用 ■さらに軽量に ・DoubleArrayの採用
まとめ
自作
・必要な機能を持つライブラリがない→ないなら作ればいい
・食べログのニーズに微妙に合わない→欲している仕様にぴったり
・開発が止まっている→開発者が自分、または同僚
ライブラリが充実すると、開発・運用ともに楽になる
作る課程も楽しい
この世界に貢献ができる
ライブラリを作ると
みんなが幸せになる
コミットログは英語で
おしまいthanks!