Weitere ähnliche Inhalte Ähnlich wie 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~ (20) Kürzlich hochgeladen (12) 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~3. @mumoshu
• 2008年~ NECビッグローブ (JavaScript)
• 2010年~ フリュー (JavaScript/Scala)
• 2013年~ グリー (Scala/Ruby/インフラ)
• 2014年~ クラウドワークス(Ruby/インフラ)
13. アジェンダ
• play2-memcachedについて
• Playプラグイン?モジュール?
• Play 2.3までのキャッシュプラグイン
• Play 2.4からのキャッシュモジュール
• Play 2.4でキャッシュモジュールを書くときに知ってお
きたいこと
17. アジェンダ
• play2-memcachedについて
• Playプラグイン?モジュール?
• Play 2.3までのキャッシュプラグイン
• Play 2.4からのキャッシュモジュール
• Play 2.4でキャッシュモジュールを書くときに知ってお
きたいこと
20. Playプラグイン?モジュール?
• Play 2.3まで
• Playプラグインでフレームワークを拡張する
• Play 2.4から
• Playモジュールで拡張する
• 2.4.0-M2時点ではプラグインもまだ使えるようだが、既に
Playの組み込みプラグインはモジュールに置き換えされてい
る
22. アジェンダ
• play2-memcachedについて
• Playプラグイン?モジュール?
• Play 2.3までのキャッシュプラグイン
• Play 2.4からのキャッシュモジュール
• Play 2.4でキャッシュモジュールを書くときに知ってお
きたいこと
25. Play 2.3までのキャッシュ
• play.api.cache.CachePlugin
• play.api.cache.CacheAPIの実装を返す
• Playの起動・終了時に処理をフックできる
• play.api.cache.CacheAPI
• キャッシュの読み書きのインタフェース
26. Play 2.3までのキャッシュ
• イメージ
• EhcachePluginがEhcacheCacheAPIImplを提供
• MemcachedPluginがMemcachedCacheAPIImplを
提供
• RedisPluginがRedisCacheAPIImplを提供
• みんなCacheAPIで同様に扱える!
27. Play 2.3までのキャッシュ
• Playプラグインの機構で、PlayにCachePlugin
をロードさせる
• 標準のEhCachePluginを無効化して
MemcachedPluginを有効化すれば、Playは
Memcachedの方を使う
29. # application.confに設定が書かれている前提で…
val app = new
play.core.StaticApplication(new
java.io.File(“.”))
# 2.3までの、Playがプラグイン経由でMemcachedベー
スのキャッシュ実装をロードする方法
play.api.Play.current.plugin[play.api.cache
.CachePlugin]
//=> Option[play.api.cache.CachePlugin] =
Some(com.github.mumoshu.play2.memcached.Mem
cachedPlugin@47afef67)
30. # テストならapplication.confに相当する設定をもと
に…
val app = play.api.test.FakeApplication(
additionalConfiguration = Map(
"ehcacheplugin" -> "disabled",
"memcached.host" -> "127.0.0.1:11211"
)
)
play.api.Play.current.plugin[play.api.cache
.CachePlugin]
31. アジェンダ
• play2-memcachedについて
• Playプラグイン?モジュール?
• Play 2.3までのキャッシュプラグイン
• Play 2.4からのキャッシュモジュール
• Play 2.4でキャッシュモジュールを書くときに知ってお
きたいこと
34. Play 2.4からのキャッシュ
• play.api.inject.Module
• play.api.cache.CacheApiの実装を返す(2.3まで
はCachePluginでしたね)
• play.api.inject.ApplicationLifecycle
• Playの終了時に処理をフックできる(2.3までは
CachePluginでしたね)
35. Play 2.4からのキャッシュ
• プラグインとは別の「Playモジュール」の機構
を使って、Playの標準モジュールを入れ替えた
り、追加したりできる。
• 標準のEhCacheModuleを無効化して、代わり
にMemcachedModuleを追加すればCacheApi
の実装を変えることができる
43. val app = play.api.test.FakeApplication(
additionalConfiguration = Map(
"play.modules.enabled" ->
List("com.github.mumoshu.play2.memcached.Memcach
edModule"),
"play.modules.disabled" ->
List("play.api.cache.EhCacheModule"),
"play.modules.cache.defaultCache" ->
“default”,
"memcached.1.host" -> memcachedHost
)
)
val cacheApi =
app.injector.instanceOf(classOf[play.api.cache.C
acheApi])
44. アジェンダ
• play2-memcachedについて
• Playプラグイン?モジュール?
• Play 2.3までのキャッシュプラグイン
• Play 2.4からのキャッシュモジュール
• Play 2.4でキャッシュモジュールを書くときに知ってお
きたいこと
49. play.api.inject
• Play2のDependency InjectionのAPI
• Play2にはDIフレームワークのラッパとなるAPIと、デ
フォルトの実装が同梱
• デフォルト実装はGoogleのDIフレームワーク Guice
ベース
• Play 2.4からはPluginは非推奨になり、
play.api.inject.ModuleによってPlayを拡張
51. play.api.inject
• Play2のDependency InjectionのAPI
• Play2にはDIフレームワークのラッパとなるAPIと、デ
フォルトの実装が同梱
• デフォルト実装はGoogleのDIフレームワーク Guice
ベース
• Play 2.4からはPluginは非推奨になり、
play.api.inject.ModuleによってPlayを拡張
56. # Play 2.3まで
trait CacheAPI {
def set(key: String, value: Any,
expiration: Int)
def get(key: String): Option[Any]
def remove(key: String)
}
57. # Play 2.4から
trait CacheApi {
def set(key: String, value: Any,
expiration: Duration = Duration.Inf)
def get[T: ClassTag](key: String):
Option[T]
def remove(key: String)
def getOrElse[A: ClassTag](key: String,
expiration: Duration = Duration.Inf)(orElse:
=> A): A
}
63. ApplicationLifecycle
• Play 2.4版play2-memcachedではPlay終了時
にMemcachedクライアントのリソースを解放
するため、ApplicationLifecycleを利用
• Play 2.3版まではPlugin中で同様の処理
• Play 2.4版からはMemcachedClientProviderで
64. trait ApplicationLifecycle {
def addStopHook(hook: () => Future[Unit]):
Unit
def addStopHook(hook:
Callable[F.Promise[Void]]): Unit = {
import
play.api.libs.iteratee.Execution.Implicits.tra
mpoline
addStopHook(() =>
hook.call().wrapped().map(_ => ()))
}
}
68. ApplicationLifecycle
• 詳しくは↓
https://github.com/playframework/
playframework/blob/2.4.0-M2/framework/
src/play/src/main/scala/play/api/inject/
ApplicationLifecycle.scala
74. play.api.cache.EhCacheModu
le
• Play2.4標準のEhCacheベースのキャッシュを
提供するModule
https://github.com/playframework/
playframework/blob/2.4.0-M2/framework/
src/play-cache/src/main/scala/play/api/
cache/Cache.scala
• 実質的にリファレンス実装ですよね
75. play.api.cache.EhCachePlugin
• Play 2.3まで標準のEhCacheベースのキャッシュを提供
するPlugin
• https://github.com/playframework/playframework/
blob/2.3.7/framework/src/play-cache/src/main/scala/
play/api/cache/Cache.scala
• ModuleよりPlugin時代のほうがとっつきやすいと思う
ので、まずPlay 2.3向けにプラグイン書くことからはじ
めてもいいかも
80. trait Plugin {
/**
* Called when the application starts.
*/
def onStart() {}
/**
* Called when the application stops.
*/
def onStop() {}
/**
* Is the plugin enabled?
*/
def enabled: Boolean = true
}
84. TODO
• Moduleによる実行時の依存性解決だけでなく、コ
ンパイル時に依存性解決にも対応する(CakePattern)
• 必須ではないがPlay2のドキュメントでも推奨さ
れている
• https://www.playframework.com/
documentation/2.4.0-M2/
ScalaCompileTimeDependencyInjection
85. TODO
• Play 2.0.x, 2.1.x, 2.2.x, 2.3.x, 2.4.x向けのクロスビ
ルド
• 2.3と2.4間で互換性のない変更があるので、同
じソースではコンパイルエラー。ソースわけない
とだめ
• 今はPlayバージョン毎にブランチを分けててメ
ンテがつらい
86. TODO
• Play 2.0.x, 2.1.x, 2.2.x, 2.3.x, 2.4.x向けのクロ
スビルド
• 最新ブランチでは以下のようにビルド仕分
けられるようにした
PLAY_VERSION=2.3.0 sbt
PLAY_VERSION=2.4.0-M2 sbt
87. まとめ
• Playプラグインは2.4からPlayモジュールに
• play.api.{cache, inject}パッケージ
• play.api.inject.{Module, ApplicationLifecycle}
• play.api.cache.CacheApi
• play2-memcachedはPlay 2.4に対応してます