Submit Search
Upload
Scala@SmartNews_20150221
•
15 likes
•
14,917 views
Shigekazu Takei
Follow
Use case of Scala Finagle in SmartNews, Inc.
Read less
Read more
Technology
Report
Share
Report
Share
1 of 29
Download Now
Download to read offline
Recommended
Scala@SmartNews AdFrontend を Scala で書いた話
Scala@SmartNews AdFrontend を Scala で書いた話
Keiji Muraishi
Developers.IO MeetUp 01 Massive Messaging Platform Deployment in a Week.
Developers.IO MeetUp 01 Massive Messaging Platform Deployment in a Week.
satoshi
20181108 kashiwa chamberofcommerce
20181108 kashiwa chamberofcommerce
桂一 中山
AWS Summit Tokyo 2015 - JAWS-UG 東京 LT大会 JAWS-UG 初心者支部について
AWS Summit Tokyo 2015 - JAWS-UG 東京 LT大会 JAWS-UG 初心者支部について
Nobuhiro Nakayama
JAWS-UG CLI #37 AWS CodeCommit入門
JAWS-UG CLI #37 AWS CodeCommit入門
Nobuhiro Nakayama
[MW02] 進化する Edge! ~Windows 10 Creators Update 版の新機能から既存機能まで一挙紹介~
[MW02] 進化する Edge! ~Windows 10 Creators Update 版の新機能から既存機能まで一挙紹介~
de:code 2017
Media Assembly Kitの紹介
Media Assembly Kitの紹介
horike37
JAWS-UG CLI専門支部 #76 Amazon AppStream 2.0 入門
JAWS-UG CLI専門支部 #76 Amazon AppStream 2.0 入門
Nobuhiro Nakayama
More Related Content
What's hot
JAWS-UG 情シス支部 #3
JAWS-UG 情シス支部 #3
Nobuhiro Nakayama
JAWS-UG アーキテクチャ専門支部(ハイブリッド分科会) #9 EC2 Run Commnadのいいところ
JAWS-UG アーキテクチャ専門支部(ハイブリッド分科会) #9 EC2 Run Commnadのいいところ
Nobuhiro Nakayama
JAWS-UG CLI専門支部 #49 Redshift入門
JAWS-UG CLI専門支部 #49 Redshift入門
Nobuhiro Nakayama
JAWS-UG Hybrid #1 Code Commitに光をあててみた
JAWS-UG Hybrid #1 Code Commitに光をあててみた
Nobuhiro Nakayama
IoT(Bluetooth mesh) × サーバーレス
IoT(Bluetooth mesh) × サーバーレス
Masahiro NAKAYAMA
JAWS-UG CLI専門支部 #74 Amazon Kinesis Firehose 入門
JAWS-UG CLI専門支部 #74 Amazon Kinesis Firehose 入門
Nobuhiro Nakayama
AADのお話第一回
AADのお話第一回
Tsubasa Yoshino
20131210 classmethod re:Growth session04
20131210 classmethod re:Growth session04
Kazuki Ueki
JAZUG TOKYO NIGHT 2019-01 AADでユーザ管理しよう
JAZUG TOKYO NIGHT 2019-01 AADでユーザ管理しよう
Tsubasa Yoshino
サーバレス × AWS SAM × DRにおけるTIPS
サーバレス × AWS SAM × DRにおけるTIPS
桂一 中山
Microservices serverless jawsug
Microservices serverless jawsug
ひろき こにし
雑談会議 Azure AD B2C 第一回
雑談会議 Azure AD B2C 第一回
Tsubasa Yoshino
イマドキのサイト構築で成功につながるヒント
イマドキのサイト構築で成功につながるヒント
Taketoshi Yagishita
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Kazumi IWANAGA
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築
ryosuke matsumura
Ignite 2021秋 recap - 開発者向け新機能紹介
Ignite 2021秋 recap - 開発者向け新機能紹介
Kazushi Kamegawa
Power Automate with kintone
Power Automate with kintone
Tsukasa Kato
JAWS-UG CLI専門支部 #81 EC2 Systems Manager 入門
JAWS-UG CLI専門支部 #81 EC2 Systems Manager 入門
Nobuhiro Nakayama
【IVS CTO Night & Day】DevOps on AWS 2017
【IVS CTO Night & Day】DevOps on AWS 2017
Amazon Web Services Japan
詳説 Data api mtddc 拡張版 v3対応
詳説 Data api mtddc 拡張版 v3対応
Yuji Takayama
What's hot
(20)
JAWS-UG 情シス支部 #3
JAWS-UG 情シス支部 #3
JAWS-UG アーキテクチャ専門支部(ハイブリッド分科会) #9 EC2 Run Commnadのいいところ
JAWS-UG アーキテクチャ専門支部(ハイブリッド分科会) #9 EC2 Run Commnadのいいところ
JAWS-UG CLI専門支部 #49 Redshift入門
JAWS-UG CLI専門支部 #49 Redshift入門
JAWS-UG Hybrid #1 Code Commitに光をあててみた
JAWS-UG Hybrid #1 Code Commitに光をあててみた
IoT(Bluetooth mesh) × サーバーレス
IoT(Bluetooth mesh) × サーバーレス
JAWS-UG CLI専門支部 #74 Amazon Kinesis Firehose 入門
JAWS-UG CLI専門支部 #74 Amazon Kinesis Firehose 入門
AADのお話第一回
AADのお話第一回
20131210 classmethod re:Growth session04
20131210 classmethod re:Growth session04
JAZUG TOKYO NIGHT 2019-01 AADでユーザ管理しよう
JAZUG TOKYO NIGHT 2019-01 AADでユーザ管理しよう
サーバレス × AWS SAM × DRにおけるTIPS
サーバレス × AWS SAM × DRにおけるTIPS
Microservices serverless jawsug
Microservices serverless jawsug
雑談会議 Azure AD B2C 第一回
雑談会議 Azure AD B2C 第一回
イマドキのサイト構築で成功につながるヒント
イマドキのサイト構築で成功につながるヒント
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築
Ignite 2021秋 recap - 開発者向け新機能紹介
Ignite 2021秋 recap - 開発者向け新機能紹介
Power Automate with kintone
Power Automate with kintone
JAWS-UG CLI専門支部 #81 EC2 Systems Manager 入門
JAWS-UG CLI専門支部 #81 EC2 Systems Manager 入門
【IVS CTO Night & Day】DevOps on AWS 2017
【IVS CTO Night & Day】DevOps on AWS 2017
詳説 Data api mtddc 拡張版 v3対応
詳説 Data api mtddc 拡張版 v3対応
Similar to Scala@SmartNews_20150221
Ad Tech on AWS - IVS CTO Night and Day Spring 2016
Ad Tech on AWS - IVS CTO Night and Day Spring 2016
Eiji Shinohara
Tim casestudy 2013 01
Tim casestudy 2013 01
Arai Ran
Google for Mobile: Google スケールで構築する! ゲームインフラと分析環境 - 橋口 剛
Google for Mobile: Google スケールで構築する! ゲームインフラと分析環境 - 橋口 剛
Google Cloud Platform - Japan
面白いは正義
面白いは正義
Yasuhiro Horiuchi
SmartNews TechNight Vol.5 : SmartNews Ads の配信最適化の仕組みはどうなってるの? (エンジニア / SmartN...
SmartNews TechNight Vol.5 : SmartNews Ads の配信最適化の仕組みはどうなってるの? (エンジニア / SmartN...
SmartNews, Inc.
20151212 わかやまITカーニバル
20151212 わかやまITカーニバル
Toshiyuki Konparu
Aws seminar-tokyo dan-jp-final-publish
Aws seminar-tokyo dan-jp-final-publish
awsadovantageseminar
Aws dan jp-final-publish
Aws dan jp-final-publish
awsadvantageseminar
SmartNews Ads System - AWS Summit Tokyo 2015
SmartNews Ads System - AWS Summit Tokyo 2015
SmartNews, Inc.
【16E2】New Relic を使ったDevOps 時代のパフォーマンス監視と障害分析入門
【16E2】New Relic を使ったDevOps 時代のパフォーマンス監視と障害分析入門
Developers Summit
【HinemosWorld2014】B1-4_NTTデータ先端技術のOpenStack Hinemosソリューション
【HinemosWorld2014】B1-4_NTTデータ先端技術のOpenStack Hinemosソリューション
Hinemos
7.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn0827
7.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn0827
Shotaro Suzuki
「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来
Yoshihito Kuranuki
情報爆発シンポジウム infoplosion
情報爆発シンポジウム infoplosion
Rakuten Group, Inc.
Building modernapplicationwithelasiccloud
Building modernapplicationwithelasiccloud
Shotaro Suzuki
データベースマーケティングサービス概要
データベースマーケティングサービス概要
株式会社ヴィクシア
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
Shotaro Suzuki
サーバーレス時代の システム設計ワークショップ
サーバーレス時代の システム設計ワークショップ
Masahiro NAKAYAMA
概説 Data API v3
概説 Data API v3
Yuji Takayama
IoTデザインパターン 2015 JAWS沖縄
IoTデザインパターン 2015 JAWS沖縄
Toshiaki Enami
Similar to Scala@SmartNews_20150221
(20)
Ad Tech on AWS - IVS CTO Night and Day Spring 2016
Ad Tech on AWS - IVS CTO Night and Day Spring 2016
Tim casestudy 2013 01
Tim casestudy 2013 01
Google for Mobile: Google スケールで構築する! ゲームインフラと分析環境 - 橋口 剛
Google for Mobile: Google スケールで構築する! ゲームインフラと分析環境 - 橋口 剛
面白いは正義
面白いは正義
SmartNews TechNight Vol.5 : SmartNews Ads の配信最適化の仕組みはどうなってるの? (エンジニア / SmartN...
SmartNews TechNight Vol.5 : SmartNews Ads の配信最適化の仕組みはどうなってるの? (エンジニア / SmartN...
20151212 わかやまITカーニバル
20151212 わかやまITカーニバル
Aws seminar-tokyo dan-jp-final-publish
Aws seminar-tokyo dan-jp-final-publish
Aws dan jp-final-publish
Aws dan jp-final-publish
SmartNews Ads System - AWS Summit Tokyo 2015
SmartNews Ads System - AWS Summit Tokyo 2015
【16E2】New Relic を使ったDevOps 時代のパフォーマンス監視と障害分析入門
【16E2】New Relic を使ったDevOps 時代のパフォーマンス監視と障害分析入門
【HinemosWorld2014】B1-4_NTTデータ先端技術のOpenStack Hinemosソリューション
【HinemosWorld2014】B1-4_NTTデータ先端技術のOpenStack Hinemosソリューション
7.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn0827
7.9 elasticstackandcloudtechnicalenablement excitingnewfeatures-jpn0827
「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来
情報爆発シンポジウム infoplosion
情報爆発シンポジウム infoplosion
Building modernapplicationwithelasiccloud
Building modernapplicationwithelasiccloud
データベースマーケティングサービス概要
データベースマーケティングサービス概要
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_...
サーバーレス時代の システム設計ワークショップ
サーバーレス時代の システム設計ワークショップ
概説 Data API v3
概説 Data API v3
IoTデザインパターン 2015 JAWS沖縄
IoTデザインパターン 2015 JAWS沖縄
More from Shigekazu Takei
Scala(finagle)@SmartNews_English
Scala(finagle)@SmartNews_English
Shigekazu Takei
Startprintf_2013May18
Startprintf_2013May18
Shigekazu Takei
Pfds 9 2_2
Pfds 9 2_2
Shigekazu Takei
Pfds 5 2+6_4_2
Pfds 5 2+6_4_2
Shigekazu Takei
Ids ips
Ids ips
Shigekazu Takei
Stanford ml neuralnetwork
Stanford ml neuralnetwork
Shigekazu Takei
Pfds ex3 9
Pfds ex3 9
Shigekazu Takei
More from Shigekazu Takei
(7)
Scala(finagle)@SmartNews_English
Scala(finagle)@SmartNews_English
Startprintf_2013May18
Startprintf_2013May18
Pfds 9 2_2
Pfds 9 2_2
Pfds 5 2+6_4_2
Pfds 5 2+6_4_2
Ids ips
Ids ips
Stanford ml neuralnetwork
Stanford ml neuralnetwork
Pfds ex3 9
Pfds ex3 9
Recently uploaded
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
ssuser539845
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
Sadao Tokuyama
2024 03 CTEA
2024 03 CTEA
arts yokohama
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
ssuser370dd7
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
arts yokohama
2024 04 minnanoito
2024 04 minnanoito
arts yokohama
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
Shumpei Kishi
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
Matsushita Laboratory
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
Tetsuya Nihonmatsu
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
arts yokohama
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
Ayachika Kitazaki
Recently uploaded
(12)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
2024 03 CTEA
2024 03 CTEA
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
2024 04 minnanoito
2024 04 minnanoito
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
Scala@SmartNews_20150221
1.
SCALA @ SMARTNEWS 高パフォーマンス広告システムを3ヶ月で作った話 @taketon_
2.
自己紹介 • @taketon_ • 脳科学の研究していました •
型安全とビールが好きです
3.
SmartNews • ニュースアプリ • 最近1000万DL達成
4.
地球くん
6.
広告はじめました • 2014年12月より広告配信開始 • コンテンツとしての広告
を目指しております
7.
2014年8月 • 12月のローンチに向けて、チーム召集
8.
必要だったもの • 速いアドサーバー • 最適化機能を持ったオークションシステム •
代理店からの入稿を助ける管理画面 • 様々な画像サイズに対応するクライアント
9.
動画広告サーバー • 大体2ヶ月位
11.
Finagle • 動画広告の配信サーバーに使用 • 現在
最高2000qpsに対して avg. 20ms
12.
Finagle • Twitter社製OSS-RPCフレームワーク • Akkaと並ぶScala製Future系ライブラリ •
Nettyをラップ • "Server as a function"
13.
選んだ理由 • サーバーが簡単に作れる • Nettyベースでパフォーマンス言うことなし •
Futureによる非同期処理ハンドリング • thriftによるIDLでモデル定義 • twitter-server, Tracerによる監視 • 自分が慣れてた(爆
14.
Negative Points • 更新が遅い •
先日ようやく2.11対応された • (finagle-redisはまだ…) • twitter.util.Futureとscala.concurrent.Futureは挙動が違う • ドキュメント少なめ • NewRelicの値がとれない(代わりにTracerを使用する)
15.
処理の流れ • 型はドキュメント • IO処理が走る部分をFutureとして返す •
基本的には • Request -> JSON parse -> Data load -> Campaign Filtering -> Response
16.
Server as a
function • ServerはReq受け取ってRepを返すfunction ! class Service[-Req, +Rep] extends (Req => Future[Rep])
17.
Ad Service • Nettyが立ち上がり`:port`でListeningServerが待 機 ! class
AdService extends Service[Request, Response] { override def apply(request: Request): Future[Response] = { // hogehoge } } val server = Http.serve(":port", new AdService()) Await.result(server) * 上記コードはnettyToFinagleフィルタを入れる必要あり
18.
JSON Parse • Jackson
Streaming APIを使用 • AdRequestは.thriftファイルに定義 • case classにしなくてもあまり困らない ! trait JsonParser { def read(request: Request):Option[AdRequest] }
19.
Data Load • IO発生で重い処理が走る可能性があることを Futureで示している •
CampaignContextはvar ! trait ContextLoader { def load(): Future[CampaignContext] }
20.
Data Load • キャンペーンマスター情報はMySQLから非同期でロード •
その他実績値と合わせてConcurrentHashMapに格納 • ConcurrentHashMapのAtomicReferenceをCacheとし てobjectに保持 ! trait ContextLoader { def load(): Future[CampaignContext] }
21.
Campaign Filtering • Contextが保持するcampaignからrequest情報に 従ってフィルタリング ! trait
CampaignFilter { def filter( request: AdRequest, ctx: CampaignContext ): Option[AdResponse] }
22.
Future Chain • FutureとFutureを逐次的につなげる •
コールバックを登録することに相当 • 前の処理の結果を受け取り、新しいFutureを生成 ! def flatMap[B](f: A => Future[B]): Future[B]
23.
Future Chain ! def apply(request:
Request): Future[Response] = { val adReqOpt: Option[AdRequest] = JSONParser.read(request) val fAdResOpt: Future[Option[AdResponse]] = adReqOpt.map { adReq => val fCtx: Future[CampaignContext] = ContextLoader.load() fCtx.map { ctx => CampaignFilter.filter(adReq, ctx) } }.getOrElse { Future.value(None) } !
24.
Future Chain ! fAdResOpt.flatMap {
adResOpt => adResOpt.map { adRes => val fSessionKeyOpt = RedisService.getKey() fSessionKeyOpt.flatMap { sessionKeyOpt => sessionKeyOpt.map { sessionKey => Future.value(mkResponse(adRes, sessionKey)) }.getOrElse { Future.value(Response(NO_CONTENT)) } } }.getOrElse { Future.value(Response(NO_CONTENT)) } } }
25.
Filter • filterでビジネスロジックと切り離した形でServer の振る舞いを書く class HttpTimeoutFilter
( val timeOutMs: Int ) extends TimeoutFilter[Request, Response]( timeOutMs.milliseconds, new GlobalRequestTimeoutException(timeOutMs.milliseconds), DefaultTimer.twitter){ } ! Http.serve(":port", new HttpTimeoutFilter(100) andThen AdService) !
26.
Routing val muxer =
new HttpMuxer() .withHandler("/ad", new AdService()) ! val server = Http.server(":port", muxer) Await.result(server)
27.
パフォーマンスTips • キャンペーンの数が多くなければ、 CPU-boundにはならない • IO-boundな処理をFutureで包む
28.
パフォーマンスTips • 基本的なFutureやOptionのインスタンス生成コス トは気にならない • Listで引き回さず、Iteratorで処理を書き、最後に toList •
mutable.ArrayBufferで組み立ててtoList • Scalaにおける細かい最適化のプラクティス
29.
まとめ • Future使うと楽 • 重そうなところはmutable •
でも、過度にチューニングする必要はない • (́-`).。oO(Finagle、流行るといいな)
Download Now