Blog
[AdTech Scala Meetup] Finagle
こんにちは、CA ProFit-Xという広告サービスを開発している塚本です。
今回も弊社で行っているAdTech Scala Meetupの様子をご紹介します。そろそろ何回目か分からなくなってきました。今回のテーマはFinagleでした。
Finagle (フィネーグル) はTwitter社が開発しているRPC用のフレームワークです。Webサービス/Webアプリケーション フレームワークと捉えても良いかもしれません。
我々アドテクスタジオではほとんど導入実績が無いため、語れる人は少ないのですが、幸いこの前のアドテクハックで利用された方がいらっしゃったため、発表していただけました!アドテクハックはアドテクスタジオで開催している社内向けハッカソンです。詳細は以下の記事を御覧ください。
もろもろFINAGLE
一人目はhuyさんのもろもろFINAGLEです。
Finagleについて幅広く語っていただきました。
Clientから見るFinagle
二人目は阿川さんのClientから見るFinagleです。
私はよくSprayというフレームワークを利用しますが、あれにもServer用のライブラリとClient用のライブラリが詰まっています。FinagleもClient用のライブラリがあるんですね。
—
FinagleのClientは機能が豊富ですね。huyさんのまとめの部分でFinagleはMicroservices向けとありましたが、こうしてClientについて色々見ていくと、本当にMicroserviceに向いてそうですね。
ちなみにClientは単体でも利用できるようで、ドキュメントにも載っています。
https://twitter.github.io/finagle/guide/Quickstart.html
上記のdoc通りですが、このような感じで動かすことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
% git clone https://github.com/twitter/finagle.git % cd finagle/doc/src/sphinx/code/quickstart/ % sbt console scala> import com.twitter.finagle.{Http, Service} import com.twitter.finagle.{Http, Service} scala> import com.twitter.finagle.http import com.twitter.finagle.http scala> import com.twitter.util.{Await, Future} import com.twitter.util.{Await, Future} scala> val client: Service[http.Request, http.Response] = Http.newService("www.scala-lang.org:80") 4 1, 2016 00:00:00 午前 com.twitter.finagle.Init$$anonfun$1 apply$mcV$sp 情報: Finagle version 6.34.0 (rev=44f444f606b10582c2da8d5770b7879ddd961211) built at 20160310-155158 client: com.twitter.finagle.Service[com.twitter.finagle.http.Request,com.twitter.finagle.http.Response] = <function1> scala> val request = http.Request(http.Method.Get, "/") request: com.twitter.finagle.http.Request = Request("GET /", from 0.0.0.0/0.0.0.0:0) scala> request.host = "www.scala-lang.org" request.host: Option[String] = Some(www.scala-lang.org) scala> val response: Future[http.Response] = client(request) response: com.twitter.util.Future[com.twitter.finagle.http.Response] = Promise@16606747(state=Transforming(List(),Future@1633934466(depth=2,parent=Promise@1407771348(state=Transforming(List(<function1>, <function1>, <function1>),Promise@175693394(state=Transforming(List(<function1>),Future@1641987256(depth=1,parent=Promise@514255821(state=Transforming(List(<function1>, <function1>),Promise@181163151(state=Transforming(List(<function1>),Promise@1175093706(state=Transforming(List(<function1>),Promise@1378213583(state=Transforming(List(<function1>),Future@2079637445(depth=1,parent=Promise@326427672(state=Transforming(List(<function1>, <function1>),Promise@31601517(state=Transforming(List(<function1>),Promise@2110608952(state=Transforming(List(<function1>),Promise@597279955(state=Transformi... scala> Await.result(response.onSuccess { rep: http.Response => | println("GET success: " + rep) | }) GET success: Response("HTTP/1.1 Status(200)") res0: com.twitter.finagle.http.Response = Response("HTTP/1.1 Status(200)") |
RPCやMicroserviceは一旦置いておいて、とりあえずClientだけ使ってみる、というのもありかもしれませんね。
塚本
Author