食べログで動いている自作ライブラリのお話

37
食べログで動 食べログで動 いている自作 いている自作 ライブラリの ライブラリの お話 お話

Upload: tsukasa-oishi

Post on 31-May-2015

2.093 views

Category:

Technology


0 download

DESCRIPTION

クックパッド&食べログ第2回勉強会

TRANSCRIPT

Page 1: 食べログで動いている自作ライブラリのお話

食べログで動食べログで動いている自作いている自作ライブラリのライブラリのお話お話

Page 2: 食べログで動いている自作ライブラリのお話

おおいしつかさ

tsukasa_oishi@twitter

http://www.kaeruspoon.net/

食べログ

iPhone

Page 3: 食べログで動いている自作ライブラリのお話

自作ライブラリ

Page 4: 食べログで動いている自作ライブラリのお話

既存のものではダメなのか

・必要な機能を持つライブラリがない

・食べログのニーズに微妙に合わない

・開発が止まっている

Page 5: 食べログで動いている自作ライブラリのお話

自作

・必要な機能を持つライブラリがない→ないなら作ればいい

・食べログのニーズに微妙に合わない→欲している仕様にぴったり

・開発が止まっている→開発者が自分、または同僚

Page 6: 食べログで動いている自作ライブラリのお話

食べログで動いている自作ライブラリ

ActsAsReadonlyable改 ActsAsStateMachine改 TabelogThread MiyazakiResistance TabelogAsync DrySumpException DisguiseToBusinessCode WordScoop TcHash EnhancedColumnType ExceptionLogger

Page 7: 食べログで動いている自作ライブラリのお話

食べログで動いている自作ライブラリ

ActsAsReadonlyable改 ActsAsStateMachine改 TabelogThread MiyazakiResistance TabelogAsync DrySumpException DisguiseToBusinessCode WordScoop TcHash EnhancedColumnType ExceptionLogger

Page 8: 食べログで動いている自作ライブラリのお話

ActsAsReadonlyable改

Page 9: 食べログで動いている自作ライブラリのお話

ActsAsReadonlyableとはmaster

slave2

slave1

CUD

R

RAP

Page 10: 食べログで動いている自作ライブラリのお話

障害が起こるとmaster

slave2

slave1

CUD

RAP

Page 11: 食べログで動いている自作ライブラリのお話

Webサーバーが死んでも大丈夫

APサーバが死んでも大丈夫

DBサーバが死ぬとサービスに影響あり

Page 12: 食べログで動いている自作ライブラリのお話

Webサーバーが死んでも大丈夫

APサーバが死んでも大丈夫

DBサーバが死んでも大丈夫

当然こうしたい

Page 13: 食べログで動いている自作ライブラリのお話

障害が起こるとmaster

slave2

slave1

CUD

RAP

Page 14: 食べログで動いている自作ライブラリのお話

自動切り離し

MySQL::ConnectionError発生

コネクションプール群から該当サーバのプールを除外

リトライ

Page 15: 食べログで動いている自作ライブラリのお話

運用も楽に

メンテナンス等でも気軽にDBを落とせるようになった

Page 16: 食べログで動いている自作ライブラリのお話

TabelogAsync

Page 17: 食べログで動いている自作ライブラリのお話

TabelogAsyncとは

■非同期処理ライブラリ ・backgroundrbが暴走する ・Mongrelを通したくない ・堅牢性はそれほど必要ない

■仮名のまま ・公開するときはカッコいい名前に

Page 18: 食べログで動いている自作ライブラリのお話

Rails側

TabelogAsync::Thrower.send( :class => :async_log, :args => “good”)

lib/worker

class AsyncLog < TabelogAsync::WorkerBase def do_work(args) logger.info args endend

Page 19: 食べログで動いている自作ライブラリのお話

当初の設計思想

軽くてすぐに終わって同期する必要のない大量の処理をさばく

重い処理は従来通りbackgroundrbで

Page 20: 食べログで動いている自作ライブラリのお話

いつの間にか

気軽に使えるので重い処理も回すようになった

シングルスレッドなので遅延が数時間レベルにまで拡大

いくら非同期でも遅れすぎ

Page 21: 食べログで動いている自作ライブラリのお話

Rails Rinda

TabelogAsync

normal

heavy

Rinda

Page 22: 食べログで動いている自作ライブラリのお話

WordScoop

Page 23: 食べログで動いている自作ライブラリのお話

WordScoopとは

■キーワード検索ライブラリ ・はてなダイアリーキーワード ・高速 ・軽量 ・HTML対応

■命名 ・奥さん

Page 24: 食べログで動いている自作ライブラリのお話

登録 5 μs

検索 3 ms

Page 25: 食べログで動いている自作ライブラリのお話

高速

■キーワード登録 1.399998 s (1語 : 0.000005 s)

■キーワード検索(1000回) 3.519995 s (1回 : 0.003520 s)

軽量

インデックス構築後 56Mバイト

キーワード数 262380語検索対象文字数 8789字

Page 26: 食べログで動いている自作ライブラリのお話

使い方

Page 27: 食べログで動いている自作ライブラリのお話

キーワード登録

Index = WordScoop.new(['クリスマス', '鍋'])

キーワード追加

Index << 'はくさい'

キーワード検索

index.search(“クリスマスは鍋にしようか。鍋には はくさいだよね”)

Page 28: 食べログで動いている自作ライブラリのお話

キーワード登録

Index = WordScoop.new(['クリスマス', '鍋'])

キーワード追加

Index << 'はくさい'

キーワード検索

index.search(“クリスマスは鍋にしようか。鍋には はくさいだよね”)

#=> ['クリスマス', '鍋', '鍋', 'はくさい']

Page 29: 食べログで動いている自作ライブラリのお話

HTML変換URLの登録

index.link_url = %Q|<a href="http://cookpad.com/レシピ/%s">%s</a>|

HTML文章への自動リンク付与

index.filter_html(“クリスマスは鍋にしようか”)

Page 30: 食べログで動いている自作ライブラリのお話

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>にしようか|

Page 31: 食べログで動いている自作ライブラリのお話

gem install word_scoop

Page 32: 食べログで動いている自作ライブラリのお話

今後の機能追加予定

■検索をさらに高速に ・HTMLの自動リンクアルゴリズム  の改良 ・AhoCorasick(エイホ-コラシック)法  の採用 ■さらに軽量に ・DoubleArrayの採用

Page 33: 食べログで動いている自作ライブラリのお話

まとめ

Page 34: 食べログで動いている自作ライブラリのお話

自作

・必要な機能を持つライブラリがない→ないなら作ればいい

・食べログのニーズに微妙に合わない→欲している仕様にぴったり

・開発が止まっている→開発者が自分、または同僚

Page 35: 食べログで動いている自作ライブラリのお話

ライブラリが充実すると、開発・運用ともに楽になる

作る課程も楽しい

この世界に貢献ができる

ライブラリを作ると

みんなが幸せになる

Page 36: 食べログで動いている自作ライブラリのお話

コミットログは英語で

Page 37: 食べログで動いている自作ライブラリのお話

おしまいthanks!