SlideShare a Scribd company logo
1 of 27
Crafting Rails4 Applications
7. Managing Application Events with
Mountable Engines
morimorihoge
この章で解説すること
• 大きなテーマは三つ
– Mountable Engineによって汎用性の高い機能を
mountする様なコードを書く
• Chap. 5でやったのはEngineそのものをextendしていた
が,もっとうまくやれるぜ
– ActiveSupport::NotificationによるRailsの提供する
pub/sub event API
– Rack middlewareの仕組みと内部構造
• Railsのバックエンドを覗いてmiddlewareを作りつつ動
きを見るぜ
Mountable/Isolated Engines
• 独自にEngineをExtendすると・・・
– Routing namespace等が共有されるため,名前の衝
突が怖い
• rake routesしたときに,Engine拡張して作ったplugin routes
なのか,アプリ用に作ったroutesなのか分からなくなる
• HelperやらModelも同様
• Mountable Engineを使うと
– アプリ側のrouterと別々の名前空間でroutingが使え
る
• Isolated Engineを使うと
– model/controller/view/assets/helperをpluginの名前
空間内に閉じ込められる
とりあえずrails plugin new
• --mountableオプションを付ける
--mountableあり
--mountableなし
Rails.application.routesを直接拡張しないようになる
Mountable engine
アプリ側でmountする
これで/mongo_metrics以下にmountable engineのroutesが組み込まれる
Mountable engine
Routing的にも別々(Engine別)に表示される
mountの内部
• routingの内部的には
get/post/put/delete/resources/resource等は全
てmatch()のwrapper
• mount()はそもそも挙動が全く別物で,Engineを
指定URL以下に指定し,処理をブン投げる
pp.142
env[“SCRIPT_NAME”]/env[“PATH_INFO”]から/mongo_metricsを削除して
Engineに投げることで,MongoMetrics::Engine内部ではそもそも
/mongo_metrics部分は見えない
(元アプリ側の参照はmain_app()で取得可能)
Mountable engine
Namespace Isolation
Isolated engine
PluginのEngine側にisolate_namespaceを記述することで,Engine内で使う
クラスが自動的にnamespaceを補完する様になる
pp.133
ActiveSupport::Notifications API
• よくあるpub/sub式のevent API
– Publish : ActiveSupport::Notifications.instrument(event_name, payload)
• Blockを渡すとBlock部分の時間がsubscriberに通知される
– Subscribe: ActiveSupport::Notifications.subscribe(event_name)
pp.133
pp.134
※instrumentは全てのsubscriberに通知される
Loggerなんかで使われることを想定
Notifications API
MongoDB/Mongoid gem
• MongoidはMongoDB
を楽に使うためのGem
• Mongoid::Documentを
includeし,store!を実
装すれば良いよ!
MongoDB/Mongoid
MongoMetrics::Engineの実装
MongoMetrics::Engine
普通のRailsアプリの様に実装して良いが,MongoMetrics moduleに入れる必要が
あることに注意(Isolated Engine)
(以下略)
Routingは普通のRailsアプリの様に書ける
テストコード
MongoMetrics::Engine
適当なRouting呼び出しをさせればNotificationが飛ぶので,test/dummy以下で
$ rails new controller Home foo bar baz
しておく
main_appでアプリ側を参照できる
Rack Basics
Rack
Rackの基本
・リクエストをcall()に投げる
・callの返値は[STATUS_CODE, HEADER, RESPONSE_BODY]
・RESPONSE_BODYはeachを実装していること
config.ru
pp.141
config.ruがあるディレクトリで
$ rackup
すればRack serverが起動する(-sでWeb serverを選べる)
Rack on Rails
Rack
Railsのconfig.ru
Rails RouterとRackのカンケイ
Rack
Config/routes.rbはこんな書き方ができる
Rackのcall(env)メソッドそのもの
toが文字列の場合,自動的に呼び出し先を変換している.
”post#index”なら以下のController.action()を返す(action()の戻り値はcall()を実装している)
Rack middleware
Rack middleware stack
rake middleware
Rack middleware stack
インストールされたミドルウェア一覧を取得できるrakeコマンド
この順序を眺めながらメシが食える
(上に行くほど先に適用される)
rake middlewares (1)
Rack middleware stack
rake middlewares (2)
Rack middleware stack
Adding Rack Middlewares
Rack middleware stack
Controllerで任意のmiddlewareを使うには,useすれば良いだけ
MuteMiddleware
Rack middleware stack
MongoMetricsはそのままだと全てのアクセスに対してログを記録してうるさいので,
それを黙らせるmiddlewareを作る
こんな感じでブロックでmuteさせたい
MuteMiddleware
Rack middleware stack
特に何事も無い感じの実装
MuteMiddlewareをどこに入れるか?
Rack middleware stack
MuteMiddlewareをインストールする
Rack middleware stack
MongoMetricsのEngineではデフォルトmute
アプリケーション側ではMuteしたいもので個別にmute
必要の無いdependencyを減らす
Gem optimization
Gemspecにrailsのdependencyを書くと,ActionMailerやActiveRecordなど,plugin
に本来必要無いgemもdependしてしまう
Dependencyを個別に書くことで,pluginの依存関係はすっきりする
# ただし,これをやるとdummyアプリケーションの方でActionMailerやActiveRecord
# に依存する部分の定義を外さないとテストが通らなくなるので注意
pp.149
Streaming plugin
Another sample of plugin development
MongoMetricsのデータをCSV streamingで出すぜ
Content-Lengthを削除することでstreamingになる
詳細はpp.151辺りを参照.見ればわかります
Rack-level v.s. Rails-level
Another sample of plugin development
Streaming的なことは,Rack middlewareレベルで書くこともできる
Rackアプリとして#eachをstreaming
ぽく返す様に作ればstreamingで返せる
Rack-levelで実装した方がmiddlewareの読み込み数が減るのでオーバーヘッドは小さい
が,Rails-levelで実装した方がデータサイズに応じた処理などがやりやすい.
どっちで実装すべきかは実装時に考えましょう
まとめ
• Mountable/Isolated Engineの説明をして,
MountableなEngineを含むMongoMetricsプラ
グインを作成したよ!
• Rack middlewareの挙動を追いかけて
middleware chainを覗いたよ
• 使わないgem dependencyを削って最適化し
たよ!やったね!

More Related Content

Similar to Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable Engines

Open daylightバージョンアップ対応
Open daylightバージョンアップ対応Open daylightバージョンアップ対応
Open daylightバージョンアップ対応Tatsuki Iida
 
Drupalサイトの管理を楽にしてくれる? Multi-site機能について
Drupalサイトの管理を楽にしてくれる? Multi-site機能についてDrupalサイトの管理を楽にしてくれる? Multi-site機能について
Drupalサイトの管理を楽にしてくれる? Multi-site機能についてShumpei Kishi
 
基礎から学ぶ超並列SQLエンジンImpala #cwt2015
基礎から学ぶ超並列SQLエンジンImpala #cwt2015基礎から学ぶ超並列SQLエンジンImpala #cwt2015
基礎から学ぶ超並列SQLエンジンImpala #cwt2015Cloudera Japan
 
Amazonでのレコメンド生成における深層学習とAWS利用について
Amazonでのレコメンド生成における深層学習とAWS利用についてAmazonでのレコメンド生成における深層学習とAWS利用について
Amazonでのレコメンド生成における深層学習とAWS利用についてAmazon Web Services Japan
 
Rails解説セミナー: Railsのアップグレード編
Rails解説セミナー: Railsのアップグレード編Rails解説セミナー: Railsのアップグレード編
Rails解説セミナー: Railsのアップグレード編Yohei Yasukawa
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説baban ba-n
 
Cloud Formation Best Practice
Cloud Formation Best PracticeCloud Formation Best Practice
Cloud Formation Best Practiceyutamuramot
 
Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~Kenji Shirane
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshopDaisuke Sugai
 

Similar to Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable Engines (13)

Open daylightバージョンアップ対応
Open daylightバージョンアップ対応Open daylightバージョンアップ対応
Open daylightバージョンアップ対応
 
Drupalサイトの管理を楽にしてくれる? Multi-site機能について
Drupalサイトの管理を楽にしてくれる? Multi-site機能についてDrupalサイトの管理を楽にしてくれる? Multi-site機能について
Drupalサイトの管理を楽にしてくれる? Multi-site機能について
 
UnicastWS vol.2
UnicastWS vol.2UnicastWS vol.2
UnicastWS vol.2
 
基礎から学ぶ超並列SQLエンジンImpala #cwt2015
基礎から学ぶ超並列SQLエンジンImpala #cwt2015基礎から学ぶ超並列SQLエンジンImpala #cwt2015
基礎から学ぶ超並列SQLエンジンImpala #cwt2015
 
Amazonでのレコメンド生成における深層学習とAWS利用について
Amazonでのレコメンド生成における深層学習とAWS利用についてAmazonでのレコメンド生成における深層学習とAWS利用について
Amazonでのレコメンド生成における深層学習とAWS利用について
 
Rails解説セミナー: Railsのアップグレード編
Rails解説セミナー: Railsのアップグレード編Rails解説セミナー: Railsのアップグレード編
Rails解説セミナー: Railsのアップグレード編
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説
 
Cloud Formation Best Practice
Cloud Formation Best PracticeCloud Formation Best Practice
Cloud Formation Best Practice
 
Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~Drupal のコア要素を知る ~構築を支える道具立て~
Drupal のコア要素を知る ~構築を支える道具立て~
 
110409 slintky lt
110409 slintky lt110409 slintky lt
110409 slintky lt
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 

Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable Engines