SlideShare a Scribd company logo
1 of 39
Download to read offline
ビズリーチの新サービスを
Scalaで作ってみた
Naoki Takezoe
BizReach, Inc
About BizReach
今日は新しいサービスの
話をします
求人検索エンジン
スタンバイ
Available for PC Web, Mobile Web, iOS and Android
今日話すこと
• マイクロサービスアーキテクチャ
• Apache Spark
• Scalaで開発する上での課題
マイクロサービス
アーキテクチャ
マイクロサービスとは?
• サービスによるコンポーネント化:ライブラリではなく別プロセスで動作するサービスに
よってアプリケーションのコンポーネント化を実現している。
• ビジネスケイパビリティに基づく組織化:役割ごとにチームが構成されるのではなく、複
数の役割が混在したチームがひとつのサービスを構築する。(コンウェイの法則!)
• プロジェクトではなくプロダクト:コンポーネントは期限のあるプロジェクトとして開発
されるではなく、継続的なプロダクトとして提供される。
• スマートエンドポイント、ダムパイプ:サービス間のメッセージは、HTTP経由でAPI呼
び出しされるか、RabbitMQやZeroMQといった軽量メッセージングシステムによる通信
で交換される。
• 分散ガバナンス:サービスごとに言語やデータベースなどは統一されず、個別に適切なも
のが選択される。
• 分散データ管理:サービスごとにデータを持ち、統合されていない。
• インフラストラクチャ自動化:継続的デリバリが実現され、自動テスト、自動デプロイな
どが採用されている。
• 障害設計:構成されるサービスの障害に耐性を持つように設計されている。
• 進化的設計:各サービスごとに変更が行なわれ、漸進的に設計がされる。
疎結合な小さなサービスの
集合体としてシステムを構築する
マイクロサービス
マイクロサービス
マイクロサービス
HTTP
Messaging
HTTP
• 独立して開発・メンテナンスが可能
• 耐障害性の高いシステムを構築可能
なにがうれしいのか?
• 並列処理を記述するのが容易
• ノンブロッキングI/Oベースのミドルウェア、フ
レームワーク、ライブラリが豊富
• 巨大なシステムにおける静的型付けの安全性
なぜScalaなのか?
アーキテクチャ
PC Web Mobile Web iOS App Android App
Front API
Backend APIs Backend APIs Backend APIs
Elasticsearch MySQL Memcached
JSON over HTTP
JSON over HTTP
elasticsearch4s Slick ???
アーキテクチャ
PC Web Mobile Web iOS App Android App
Front API
Backend APIs Backend APIs Backend APIs
Elasticsearch MySQL Memcached
JSON over HTTP
JSON over HTTP
elasticsearch4s Slick ???
Webアプリもフロントエンドと
サーバサイドでレイヤリング
Webアプリもレイヤリング
play2-stub play2-handlebars
フロントサーバ(Play2)
APIサーバ(Play2)
JSON over HTTP
開発時は固定の
JSONを返す
JSONをテンプレートに
渡してHTMLをレンダリング
request response
ねらい
•サーバサイドとフロントエンドのライフサイクルは異な
るので別々にデプロイできるようにしたい
•フロントエンドの修正はフロントエンジニアだけで完結
したい
•サーバサイドはScalaで固く、フロントエンドは
JavaScriptやテンプレートエンジンで柔らかく作ること
で両者のメリットを活かせる
play2-stub
• リクエストを受け取り、routingやstubbingを行うフロントコントローラ
• フロントエンドとサーバサイドを分離して開発するためのもの
• リクエストやレスポンスを加工するフィルタを挟んだり、複雑な処理は別のコ
ントローラにデリゲートしたりすることもできる
play2stub {!
routes: [!
{!
"GET /author/~authorName/books" {!
template = "author-biology"!
data = "authors/:authorName.json"!
}!
}!
]!
}
https://github.com/bizreach/play2-stub
リモートAPIを呼び出す代わりに
静的なJSONでレンダリング
play2-handlebars
• Play2でHandlebarsを使うためのプラグイン
• コンパイルなしでテンプレートを修正可能
• デザイナにも扱いやすいテンプレート記法
• Play2のTwirlテンプレートはコンパイルが遅いし記法も複雑で、カッチリ作る
にはいいが、デザインを迅速に反映・修正するのには向いてない
https://github.com/bizreach/play2-stub
object Application extends Controller {!
!
def simple = Action {!
Ok(HBS("simple", "who" -> "World"))!
}!
!
}
現実は厳しい
•Handlebarsの自由度が低すぎるので大量にヘルパーを
作らなくてはいけない(ヘルパーの作成がボトルネック
になることも)
•結局画面の仕様に対応したAPIが必要になるケースが多
く、再利用可能なAPIにならない
•性能面・工数面などの理由で直接DBに接続せざるを得
ない、というような部分もあり、密結合になってしまっ
ている
複数のAPIの呼び出し
Web API
Web API
Web API
Web API
Controller
1つのコントローラから複数のWeb APIを呼び出す必要がある
シリアルに呼び出していてはAPIが増えるほど遅くなってしまう
Future
import scala.concurrent._!
import scala.concurrent.ExecutionContext.Implicits.global!
!
val fileNames = Seq("1.jpg", "2.jpg", "3.jpg", …)!
!
fileNames.foreach { fileName =>!
Future {!
resizeAndStore(fileName)!
}!
}
•FutureはScalaにおける非同期処理の基本的なインターフェース
•Play標準のWS APIはFutureを返す
•Dispatchなど他の通信系ライブラリもFutureを返すものが多い
PlayのWS API
// 戻り値としてFutureを返す!
val f: Future[WSResponse] = WS.url(requestUrl).get()!
!
// アクションの実行結果をFutureで返す!
def wsAction = Action.async {!
WS.url(requestUrl).get().map { res =>!
Ok(res.body)!
}!
}
Futureによる並列処理
// 1つ目のAPIを呼び出す!
val res1: WSResponse !
= Await.result(WS.url(url1).get(), Duration.Inf)!
// レスポンスを取得!
val body1: String = res1.body!
!
// 2つ目のAPIを呼び出す!
val res2: WSResponse !
= Await.result(WS.url(url2).get(), Duration.Inf)!
// レスポンスを取得!
val body2: String = res2.body
複数のWeb APIをシリアルに呼び出す
Futureによる並列処理
// 1つ目のAPIを呼び出す!
val res1: WSResponse !
= Await.result(WS.url(url1).get(), Duration.Inf)!
// レスポンスを取得!
val body1: String = res1.body!
!
// 2つ目のAPIを呼び出す!
val res2: WSResponse !
= Await.result(WS.url(url2).get(), Duration.Inf)!
// レスポンスを取得!
val body2: String = res2.body
複数のWeb APIをシリアルに呼び出す
Await.resultを使うとFutureから値を
取り出すことができるがブロックしてしまう
Futureによる並列処理
val f1 = WS.url(url1).get()!
val f2 = WS.url(url2).get()!
!
val f: Future[(String, String)] = for {!
res1 <- f1!
res2 <- f2!
} yield {!
(res1.body, res2.body)!
}
複数のWeb APIをパラレルに呼び出す
やってみて思ったこと
• 開発時のオーバーヘッドやサービス毎の冗長化によるコス
ト増など、短期的にはデメリットの方が大きい
• デバッグが難しくなる、並列プログラミングのスキルが必
要になる
• 最初はモノリシックに作り、大きくなってきたタイミング
でマイクロサービスにするのがよい
• 大きくなるタイミングはサービスとしては攻め時なので判
断としては難しい
Apache Spark
クローリング・インデキシング
データを加工 Elasticsearchクロール JSONHTML
DispatchでHTMLを取得する
アクターをスケジュール実行する
ことでサーバのリソースを活用
HTMLを解析したり、別のデータと
結合して検索用のインデックスを
生成する処理をSparkで実行
クローリング・インデキシング
データを加工 Elasticsearchクロール JSONHTML
DispatchでHTMLを取得する
アクターをスケジュール実行する
ことでサーバのリソースを活用
HTMLを解析したり、別のデータと
結合して検索用のインデックスを
生成する処理をSparkで実行
Apache Sparkとは?
• Scala製の高速バッチ処理フレームワーク
• 簡単なプログラムで分散処理を記述できる
• 機械学習のMLlib、SQLインターフェースを提供するSpark-SQL、
ストリーミング処理用のSpark-Streamingなど様々なサブプロ
ジェクトが存在する
• elastichadoop-sparkというアダプタを使うことでElasticsearch
への入出力が可能
並列分散処理を手軽に記述できる
def main(args: Array[String]) {!
val sc = new SparkContext("local", "Log Query", !
System.getenv("SPARK_HOME"), !
SparkContext.jarOfClass(this.getClass)) // ログファイルをロード!
!
val dataSet = sc.textFile("hdfs://...")!
// ERRORで始まるデータを抽出しキャッシュ!
val cached = dataSet.filter(_ startsWith "ERROR").cache()!
!
val counts1 = cached!
.flatMap(_ split " ") // スペースで分割しフラット化!
.map(_ -> 1) // 文字列とカウントのタプルに変換!
.reduceByKey(_ + _) // 集計!
!
// キャッシュしたデータを使って別の条件で集計する!
val counts2 = cached.filter・・・!
}
毎回ストレージにアクセス
しないようキャッシュ
通常のScalaプログラムと
同じ感覚でコードを書ける
複数のインデックスを結合
val conf = new SparkConf().setAll(Seq(!
ES_NODES -> "localhost",!
ES_PORT -> “9200",!
ES_RESOURCE -> "job",!
ES_QUERY -> "?q=*:*"!
))!
!
val spark = new SparkContext(conf)!
!
val rdd = spark.esRDD.leftOuterJoin(spark.esRDD(Map(!
ES_RESOURCE -> "geo",!
ES_QUERY -> "?q=*:*"!
))).flatMap { case (_id, (_source, geo)) =>!
geo.map { x =>!
_source ++ Map("location" -> x(“location"))!
}!
}
jobインデックスに
geoインデックスを外部結合
複数のインデックスを更新
// 加工したデータをキャッシュしておく!
val rdd = spark.esRDD.map { x=>!
…!
}.cache!
!
// 1台目のElasticsearchにデータを登録!
rdd.saveToEs(Map(!
ES_NODES -> "localhost",!
ES_PORT -> "9200"!
))!
!
// 2台目のElasticsearchにデータを登録!
rdd.saveToEs(Map(!
ES_NODES -> "localhost",!
ES_PORT -> "9201"!
)) 加工したデータをキャッシュしておくことで複数の
インデックスを高速に更新することができる
注意点
• I/Oが多いとCPUを使い切れずSparkの良さが出せない
• 細かいジョブを大量に投げると失敗することがある
• 処理の並列度がElasticsearchのシャード数に依存する
(elastichadoop-sparkの場合)
• 記述の仕方を少し変えただけで猛烈にパフォーマンス
が変わるので使いこなすのが難しい
Scalaを使う上での
一番の課題
一番の課題
• Scalaプログラマの教育・採用
• JavaよりもLLからのほうが入りやすい様子
• 長期的にはScalaをもっと普及させる
• 短期的には社内で育成していくしかない
長期的な取り組み
• 書籍・雑誌記事等の執筆
• イベントでの登壇・支援(スポンサー)
• 他社さんとの合同での勉強会
• OSS活動(足りない物を作る)
短期的な取り組み
• Daily Scala(毎朝30分Scalaの勉強会)
• GitHubでのプルリクレビュー
• ハンズオンコンテンツの作成
Play2ハンズオン
https://github.com/bizreach/play2-hands-on
まとめ
• マイクロサービスは良いことばかりではない
• Future大事
• Apache Sparkは便利だけど使いこなすのが難しい
• Scalaプログラマの教育・採用が一番の課題です
お知らせ
• 弊社オフィスのイベントスペースを使用して渋谷java、Swift
もくもく会などいろんな勉強会をやってます
• 会場提供も可能です
お問い合わせはhttp://dcube.ioまたは@takezoenまで!

More Related Content

What's hot

DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRecruit Technologies
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方Shohei Koyama
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
 
Monitoring - 入門監視
Monitoring - 入門監視Monitoring - 入門監視
Monitoring - 入門監視Eiji KOMINAMI
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったことRecruit Technologies
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜aha_oretama
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 FallYoshitaka Kawashima
 
Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較Mei Nakamura
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。toshihiro ichitani
 
データモデリング・テクニック
データモデリング・テクニックデータモデリング・テクニック
データモデリング・テクニックHidekatsu Izuno
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 

What's hot (20)

DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
Monitoring - 入門監視
Monitoring - 入門監視Monitoring - 入門監視
Monitoring - 入門監視
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
 
データモデリング・テクニック
データモデリング・テクニックデータモデリング・テクニック
データモデリング・テクニック
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 

Similar to ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala

Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
Azure 高速サイトソリューション
Azure 高速サイトソリューションAzure 高速サイトソリューション
Azure 高速サイトソリューションHiromasa Oka
 
OWIN って何?
OWIN って何?OWIN って何?
OWIN って何?miso- soup3
 
ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験miso- soup3
 
第12回rest勉強会 これまでの補足・展望編
第12回rest勉強会 これまでの補足・展望編第12回rest勉強会 これまでの補足・展望編
第12回rest勉強会 これまでの補足・展望編ksimoji
 
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介株式会社スカイアーチネットワークス
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますfukuoka.ex
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれMasataka MIZUNO
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介Shotaro Suzuki
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺Yusuke Wada
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をTech Summit 2016
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をTech Summit 2016
 
2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordova2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordovamiso- soup3
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWINYoshifumi Kawai
 
AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -SORACOM, INC
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」fukuoka.ex
 
Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの PerlのつかいかたRyuzo Yamamoto
 

Similar to ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala (20)

Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Azure 高速サイトソリューション
Azure 高速サイトソリューションAzure 高速サイトソリューション
Azure 高速サイトソリューション
 
OWIN って何?
OWIN って何?OWIN って何?
OWIN って何?
 
ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験
 
第12回rest勉強会 これまでの補足・展望編
第12回rest勉強会 これまでの補足・展望編第12回rest勉強会 これまでの補足・展望編
第12回rest勉強会 これまでの補足・展望編
 
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
 
densan2014-late01
densan2014-late01densan2014-late01
densan2014-late01
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれ
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_を
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_を
 
UnicastWS vol.2
UnicastWS vol.2UnicastWS vol.2
UnicastWS vol.2
 
2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordova2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordova
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWIN
 
AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -
 
SocketStream入門
SocketStream入門SocketStream入門
SocketStream入門
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
 
Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの Perlのつかいかた
 

More from takezoe

Journey of Migrating Millions of Queries on The Cloud
Journey of Migrating Millions of Queries on The CloudJourney of Migrating Millions of Queries on The Cloud
Journey of Migrating Millions of Queries on The Cloudtakezoe
 
GitBucket: Open source self-hosting Git server built by Scala
GitBucket: Open source self-hosting Git server built by ScalaGitBucket: Open source self-hosting Git server built by Scala
GitBucket: Open source self-hosting Git server built by Scalatakezoe
 
Testing Distributed Query Engine as a Service
Testing Distributed Query Engine as a ServiceTesting Distributed Query Engine as a Service
Testing Distributed Query Engine as a Servicetakezoe
 
Revisit Dependency Injection in scala
Revisit Dependency Injection in scalaRevisit Dependency Injection in scala
Revisit Dependency Injection in scalatakezoe
 
How to keep maintainability of long life Scala applications
How to keep maintainability of long life Scala applicationsHow to keep maintainability of long life Scala applications
How to keep maintainability of long life Scala applicationstakezoe
 
頑張りすぎないScala
頑張りすぎないScala頑張りすぎないScala
頑張りすぎないScalatakezoe
 
GitBucket: Git Centric Software Development Platform by Scala
GitBucket:  Git Centric Software Development Platform by ScalaGitBucket:  Git Centric Software Development Platform by Scala
GitBucket: Git Centric Software Development Platform by Scalatakezoe
 
Non-Functional Programming in Scala
Non-Functional Programming in ScalaNon-Functional Programming in Scala
Non-Functional Programming in Scalatakezoe
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめtakezoe
 
Scala製機械学習サーバ「Apache PredictionIO」
Scala製機械学習サーバ「Apache PredictionIO」Scala製機械学習サーバ「Apache PredictionIO」
Scala製機械学習サーバ「Apache PredictionIO」takezoe
 
The best of AltJava is Xtend
The best of AltJava is XtendThe best of AltJava is Xtend
The best of AltJava is Xtendtakezoe
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jstakezoe
 
Tracing Microservices with Zipkin
Tracing Microservices with ZipkinTracing Microservices with Zipkin
Tracing Microservices with Zipkintakezoe
 
Type-safe front-end development with Scala
Type-safe front-end development with ScalaType-safe front-end development with Scala
Type-safe front-end development with Scalatakezoe
 
Scala Frameworks for Web Application 2016
Scala Frameworks for Web Application 2016Scala Frameworks for Web Application 2016
Scala Frameworks for Web Application 2016takezoe
 
Macro in Scala
Macro in ScalaMacro in Scala
Macro in Scalatakezoe
 
Java9 and Project Jigsaw
Java9 and Project JigsawJava9 and Project Jigsaw
Java9 and Project Jigsawtakezoe
 
Reactive database access with Slick3
Reactive database access with Slick3Reactive database access with Slick3
Reactive database access with Slick3takezoe
 
markedj: The best of markdown processor on JVM
markedj: The best of markdown processor on JVMmarkedj: The best of markdown processor on JVM
markedj: The best of markdown processor on JVMtakezoe
 
ネタじゃないScala.js
ネタじゃないScala.jsネタじゃないScala.js
ネタじゃないScala.jstakezoe
 

More from takezoe (20)

Journey of Migrating Millions of Queries on The Cloud
Journey of Migrating Millions of Queries on The CloudJourney of Migrating Millions of Queries on The Cloud
Journey of Migrating Millions of Queries on The Cloud
 
GitBucket: Open source self-hosting Git server built by Scala
GitBucket: Open source self-hosting Git server built by ScalaGitBucket: Open source self-hosting Git server built by Scala
GitBucket: Open source self-hosting Git server built by Scala
 
Testing Distributed Query Engine as a Service
Testing Distributed Query Engine as a ServiceTesting Distributed Query Engine as a Service
Testing Distributed Query Engine as a Service
 
Revisit Dependency Injection in scala
Revisit Dependency Injection in scalaRevisit Dependency Injection in scala
Revisit Dependency Injection in scala
 
How to keep maintainability of long life Scala applications
How to keep maintainability of long life Scala applicationsHow to keep maintainability of long life Scala applications
How to keep maintainability of long life Scala applications
 
頑張りすぎないScala
頑張りすぎないScala頑張りすぎないScala
頑張りすぎないScala
 
GitBucket: Git Centric Software Development Platform by Scala
GitBucket:  Git Centric Software Development Platform by ScalaGitBucket:  Git Centric Software Development Platform by Scala
GitBucket: Git Centric Software Development Platform by Scala
 
Non-Functional Programming in Scala
Non-Functional Programming in ScalaNon-Functional Programming in Scala
Non-Functional Programming in Scala
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめ
 
Scala製機械学習サーバ「Apache PredictionIO」
Scala製機械学習サーバ「Apache PredictionIO」Scala製機械学習サーバ「Apache PredictionIO」
Scala製機械学習サーバ「Apache PredictionIO」
 
The best of AltJava is Xtend
The best of AltJava is XtendThe best of AltJava is Xtend
The best of AltJava is Xtend
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
 
Tracing Microservices with Zipkin
Tracing Microservices with ZipkinTracing Microservices with Zipkin
Tracing Microservices with Zipkin
 
Type-safe front-end development with Scala
Type-safe front-end development with ScalaType-safe front-end development with Scala
Type-safe front-end development with Scala
 
Scala Frameworks for Web Application 2016
Scala Frameworks for Web Application 2016Scala Frameworks for Web Application 2016
Scala Frameworks for Web Application 2016
 
Macro in Scala
Macro in ScalaMacro in Scala
Macro in Scala
 
Java9 and Project Jigsaw
Java9 and Project JigsawJava9 and Project Jigsaw
Java9 and Project Jigsaw
 
Reactive database access with Slick3
Reactive database access with Slick3Reactive database access with Slick3
Reactive database access with Slick3
 
markedj: The best of markdown processor on JVM
markedj: The best of markdown processor on JVMmarkedj: The best of markdown processor on JVM
markedj: The best of markdown processor on JVM
 
ネタじゃないScala.js
ネタじゃないScala.jsネタじゃないScala.js
ネタじゃないScala.js
 

ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala