SlideShare a Scribd company logo
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
塩野 貴義, 橋本 尚亮
ヤフーの広告
レポートシステムを
Spring Cloud Stream化
するまで
2017年5月20日
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.2
塩野 貴義
■家族構成
妻、息子2人(9歳♂双子)
■趣味
車、バイク
■経歴
2011/08 ヤフーに転職
2013/10 レポートシステム
2017/04 集計システム
自己紹介
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.3
橋本 尚亮
■家族構成
独身
■趣味
音楽鑑賞
■経歴
2016/04 ヤフーに新卒入社
2016/09 レポートシステム
自己紹介
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
概要
4
第一世代 第二世代 第三世代
2013 2015 2017
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
5
1. 広告レポートシステムについて
2. 第一世代~PHP&Perl~
3. 第二世代~Spring Batch&Hive~
4. 第三世代~Spring Cloud Stream~
5. まとめ
6. tips
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
6
1. 広告レポートシステムについて
2. 第一世代~PHP&Perl~
3. 第二世代~Spring Batch&Hive~
4. 第三世代~Spring Cloud Stream~
5. まとめ
6. tips
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
広告レポートについて
7
 お客様(広告主)が入稿した広告の配
信実績を確認するためのレポート
 レポート出力する項目や集計単位は
指定可能
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
広告レポートのユースケース
8
 通常レポート
• API経由で作成リクエストを受け取る
• 常時稼働
• レポート作成は非同期で行う
Request
Job
登録
Report job
Report
作成
Job取得
API
Batch
API Batch
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
広告レポートのユースケース
9
 定期レポート
• 定期レポートとして登録されているレ
ポートのJobを一括登録する
• 毎朝1回
• レポート作成方法は通常レポートと同じ
Report job
Report
作成
Job取得
定期
レポート
Job
登録
Batch
Batch
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
広告レポートのユースケース
10
 通常レポート
• 常時稼働、約25万レポート/日
 定期レポート
• 毎朝1回、約5万レポート/日
Request
Job
登録
Report job
Report
作成
Job取得
定期
レポート
Job
登録
API
Batch
Batch
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
レポートのリクエスト数
11
80,000
150,000
300,000
第一世代(2014) 第二世代(2016) 第三世代(2017)
インターネット広告市場の拡大に伴い
レポート作成の
リクエスト数は年々増加
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
広告レポートシステム全体
12
Request
Job
登録
Report job
Report
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
配信ログ集計
API
Batch
Batch
Batch
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
13
1. 広告レポートシステムについて
2. 第一世代~PHP&Perl~
3. 第二世代~Spring Batch&Hive~
4. 第三世代~Spring Cloud Stream~
5. まとめ
6. tips
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代
14
Request
Job
登録
Report job
Report
作成
メール
送信
定期
レポート
Job
登録
配信ログ集計 ストレージ2次集計
日次夜間集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代
15
Request
Job
登録
Report job
Report
作成
メール
送信
定期
レポート
Job
登録
配信ログ集計 ストレージ2次集計
日次夜間集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代
16
Request
Job
登録
Report job
Report
作成
メール
送信
定期
レポート
Job
登録
配信ログ集計 ストレージ2次集計
日次夜間集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Report
作成
第一世代
17
Request
Job
登録
Report job
Job取得
メール
送信
定期
レポート
Job
登録
配信実績取得
配信ログ集計 ストレージ2次集計
日次夜間集計
Job取得
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代
18
Request
Job
登録
Report
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
ストレージ2次集計
Report job
配信ログ集計
日次夜間集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代
19
Request
Job
登録
Report job
Report
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
配信ログ集計 ストレージ2次集計
日次夜間集計
二次集計
処理時間:4時間以上
集計結果容量:1TB以上/日
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代の課題
20
 開発が複雑
• 全ての処理が依存しあっていて影響範囲が広い
• テストパターンが網羅しきれない
• 2000行以上の設定ファイルを共有
• Objectは全てArray
• 改修・拡張でコードが複雑化
• 動的型付けで想定外の挙動
• 開発サーバ上でVimによる開発
 運用コストが高い
• リカバリの再集計は複数人で半日以上
• ファイルの欠損等で月に数回リカバリ作業が発生
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代の課題
21
 開発が複雑
• 全ての処理が依存しあっていて影響範囲が広い
• テストパターンが網羅しきれない
• 2000行以上の設定ファイルを共有
• Objectは全てArray
• 改修・拡張でコードが複雑化
• 動的型付けで想定外の挙動
• 開発サーバ上でVimによる開発
 運用コストが高い
• リカバリの再集計は複数人で半日以上
• ファイルの欠損等で月に数回リカバリ作業が発生
- 品質を担保できない
- 開発に時間がかかりすぎてログ量の
増加や機能拡張に追いつけない
- ぐっすり眠れない
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
なんとかしたい
22
 開発スピードを上げたい
 運用をもっと楽にして開発に集中
したい
 ぐっすり寝たい
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
23
1. 広告レポートシステムについて
2. 第一世代~PHP&Perl~
3. 第二世代~Spring Batch&Hive~
4. 第三世代~Spring Cloud Stream~
5. まとめ
6. tips
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代(2014)
24
Request
Job
登録
Report job
レポート
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
配信ログ集計 ストレージ2次集計
日次夜間集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第二世代(2016)
25
Request
Job
登録
Report job
レポート
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
配信ログ集計 ストレージ2次集計
日次夜間集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第二世代(2016)
26
Request
Job
登録
Report job
レポート
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
配信ログ集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代から第二世代へ
27
 Java / Spring Batch
• DIコンテナによる疎結合とテストの充実
• 静的型付けで安心
• ライブラリが充実
• IDE
 Hive on Tez
• 二次集計が不要
• 保守するコード量が激減
• 自由度高く実績取得可能
 運用
• ぐっすり眠れるようになった
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代から第二世代へ
28
詳しくはこちら
JJUG CCC 2016 Spring
広告システム刷新の舞台裏
PHPからJavaに変えてみました
https://www.slideshare.net/techblogyahoo/jjugccc-cccf1-phpjava
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第二世代(2016)
29
Request
Job
登録
Report job
レポート
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
配信ログ集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
問題発生
30
Request
Job
登録
Report job
レポート
作成
Job取得
メール
送信
定期
レポート
Job
登録
Job取得
配信実績取得
配信ログ集計
二次集計をなくしたことで配信実績
取得にかかる時間が増加
全体のスループットの低下
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
31
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
32
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
33
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
これで解決?
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
34
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
35
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
36
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
37
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
38
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
レポート
作成
レポート
作成
レポート
作成
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
39
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
レポート
作成
レポート
作成
レポート
作成
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
40
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
解決策
41
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第二世代の課題
レポート作成Batchをスケールアウト
RDBへのポーリングのアクセス数が増大
RDBが高負荷
他のシステムにも影響
42
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
43
1. 広告レポートシステムについて
2. 第一世代~PHP&Perl~
3. 第二世代~Spring Batch&Hive~
4. 第三世代~Spring Cloud Stream~
5. まとめ
6. tips
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第二世代(2016)
44
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
Report job
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第三世代(2017)
45
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
MQ?
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第三世代(2017)
46
Request
Job
登録
レポート
作成
Job取得
定期
レポート
Job
登録
配信実績取得
配信ログ集計
レポート
作成
・・・
レポート
作成
レポート
作成
・・・
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
レポート
作成
MQ?
レポート作成を
イベントドリブンに行いたい
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Stream
47
 message-driven microservices
 Spring Boot
 consumer groups
 binder abstraction
http://cloud.spring.io/spring-cloud-stream/
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Stream
48
Source Sink
output
input
定期
レポート
API
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第三世代(2017)
49
レポート
作成
Request Job登録
Job登録
定期
レポート
・・・
・・・
レポート
作成
レポート
作成
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
 共通のdestinationを設定するだけで簡単にアプ
リケーション間が接続される
第三世代(2017)
50
レポート
作成
Request Job登録
Job登録
定期
レポート
・・・
・・・
レポート
作成
spring.cloud.stream.
bindings.output.destination
=reporting
spring.cloud.stream.
bindings.input.destination
=reporting
reporting
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
レポート
作成
Request Job登録
Job登録
定期
レポート
・・・
・・・
レポート
作成
レポート
作成
reporting
第三世代(2017)
51
{jobId:1002}{jobId:1002}{jobId:1002} {jobId:1002}
{jobId:1002}
{jobId:1002}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
 設定1つで簡単にconsumer groupが作れるためス
ケールアウトが容易
spring.cloud.stream.bindings
.input.group=ydnrep
レポート
作成
Request Job登録
Job登録
定期
レポート
・・・
・・・
レポート
作成
レポート
作成
第三世代(2017)
52
reporting
.ydnrep
{jobId:1002}
ydnrep
{jobId:1002}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
リリース
53
第二世代から第三世代へのリリースを
ダウンタイム0で行いたい
0. 旧システム稼働中
1. 新システムデプロイ
2. 新シスステムサービスイン
3. 旧シスステムAPIサービスアウト
4. 旧シスステムBatchサービスアウト
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
・・・
リリース
54
0.旧システム稼働中
Request
Job
登録
Report job
レポート作成
・・・
Job取得
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
・・・
リリース
55
1.新システムデプロイ
Request
Job
登録
Report job
レポート作成
・・・
Job取得
reporting
.ydnrep
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
・・・
リリース
56
2.新システムサービスイン
Request
Job
登録
Report job
レポート作成
・・・
Request
Job
登録
Job取得
レポート作成
reporting
.ydnrep
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
・・・
リリース
57
3.旧システムAPIサービスアウト
Report job
レポート作成
・・・
Request
Job
登録
Job取得
レポート作成
reporting
.ydnrep
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
・・・
リリース
58
4.旧システムBatchサービスアウト
Report job
・・・
Request
Job
登録 レポート作成
reporting
.ydnrep
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
・・・
リリース
59
4.旧システムBatchサービスアウト
Report job
・・・
Request
Job
登録 レポート作成
ダウンタイム0でリリース完了!
reporting
.ydnrep
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
性能比較
60
 リリースして動作確認
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
性能比較
61
 RabbitMQの管理画面
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
性能比較
62
 RabbitMQの管理画面
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
性能比較
63
 RabbitMQの管理画面
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
性能評価
 レポート作成プロセス数:558
 ポーリング時のSQL発行数/h
• 第二世代: 16,928
• 第三世代: 0
 レポート作成数/h
• 第二世代: 44,121
• 第三世代: 63,934
64
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第三世代(2017)
 イベントドリブンにレポート作成
Jobを取得できるようになりRDB
の負荷が減った
 1時間あたりの処理数も増えた
65
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第三世代(2017)
 イベントドリブンにレポート作成
Jobを取得できるようになりRDB
の負荷が減った
 1時間あたりの処理数も増えた
めでたしめでたし、、、
66
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
問題発生
 イベントドリブンにレポート作成
Jobを取得できるようになりRDB
の負荷が減った
 1時間あたりの処理数も増えた
めでたしめでたし、、、
67
SQL [INSERT into
BATCH_JOB_EXECUTION_PARAMS(JOB_EXECUTION_ID, KEY_NAME,
TYPE_CD, STRING_VAL, DATE_VAL, LONG_VAL, DOUBLE_VAL,
IDENTIFYING) values (?, ?, ?, ?, ?, ?, ?, ?)];
ORA-08177: can't serialize access for this transaction
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
原因
68
レポート
作成
定期
レポート
・・・
・・・
{jobId:1002,
・・・
jobId:51002}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
原因
69
レポート
作成
定期
レポート
・・・
・・・
{jobId:1002,
・・・
jobId:51002}
{jobId:1002}
{jobId:1003}
{jobId:1503}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
原因
70
レポート
作成
定期
レポート
・・・
・・・
Spring Batchの
Job管理テーブルに
同時に大量のINSERT
・・・
{jobId:1002,
・・・
jobId:51002}
{jobId:1002}
{jobId:1003}
{jobId:1503}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
原因
71
レポート
作成
定期
レポート
・・・
・・・
Spring Batchの
Job管理テーブルに
同時に大量のINSERT
・・・
{jobId:1002,
・・・
jobId:51002}
{jobId:1003}
{jobId:1503}
3回失敗すると
メッセージは消失
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
対策(1/2)
72
レポート
作成
reporting
.ydnrep
・・・
・・・
ydnrep
レポート
作成
定期
レポート
 maxAttemptの上限を上げる
spring.cloud.stream.bindings.
input.consumer.maxAttempts=5
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
対策(2/2)
73
レポート
作成
reporting
.ydnrep
・・・
・・・
ydnrep
レポート
作成
reporting
.ydnrep.dlq
定期
レポート
 Dead Letter Queue を用意
spring.cloud.stream.rabbit.bind
ings.input.consumer.autoBindDlq
=true
{jobId:1002}
エラー処理
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
対策(2/2)
74
レポート
作成
reporting
.ydnrep
・・・
・・・
ydnrep
レポート
作成
reporting
.ydnrep.dlq
定期
レポート
 Dead Letter Queue を用意
{jobId:1002}
メッセージを
送信し直す
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
対策(2/2)
75
レポート
作成
reporting
.ydnrep
・・・
・・・
ydnrep
レポート
作成
reporting
.ydnrep.dlq
定期
レポート
 Dead Letter Queue を用意
{jobId:1002}
メッセージを
送信し直す
根本的な解決になっていない
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
対策(2/2)
76
レポート
作成
reporting
.ydnrep
・・・
・・・
ydnrep
レポート
作成
reporting
.ydnrep.dlq
定期
レポート
 Dead Letter Queue を用意
{jobId:1002}
メッセージを
送信し直す
Job RepositoryがDBアクセスしない方法を調査中
*常駐バッチのためJob Repositoryを
インメモリ化できない
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
77
1. 広告レポートシステムについて
2. 第一世代~PHP&Perl~
3. 第二世代~Spring Batch&Hive~
4. 第三世代~Spring Cloud Stream~
5. まとめ
6. tips
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代(2014) 第二世代(2016) 第三世代(2017)
まとめ
78
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
第一世代(2014) 第二世代(2016) 第三世代(2017)
まとめ
79
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
まとめ
80
 刷新をする度に課題がバックエンドに移動
 ポーリング型からイベントドリブンに変更するこ
とでスループット向上
 大規模システムはリリースしてからが勝負
 Spring歴1年未満の私でもmicroservicesが簡単
に作れました
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから
・・・レポート
作成
API
メール
送信
定期
レポート
 他サービスのSpring Cloud Stream化
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから
・・・レポート
作成
API
メール
送信
定期
レポート
 ミドルウェアの比較・検討
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから
・・・レポート
作成
API
メール
送信
定期
レポート
 Cloud Foundryへの移行
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから
・・・レポート
作成
API
メール
送信
定期
レポート
 興味がある方は是非!
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
これから
 他サービスのSpring Cloud Stream化
 ミドルウェアの比較・検討
 Cloud Foundryへの移行
 興味がある方は是非!
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
86
1. 広告レポートシステムについて
2. 第一世代~PHP&Perl~
3. 第二世代~Spring Batch&Hive~
4. 第三世代~Spring Cloud Stream~
5. まとめ
6. tips
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Streamの実装
87
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Streamの実装
88
 API, BatchのSpring Boot化
 Source/Sinkの追加
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Boot
89
 Application起動クラスの追加
 application.properties で設定を
管理
 API : war->jar (embedded jetty)
 Batch:苦戦
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Boot
90
 第二世代Batch :
• 1つのjarに複数の機能
• 実行時にjobIdを指定
 第三世代Batch :
• 1application/jar
• 単発batch(定期レポート)
• 常駐batch(レポート作成, メール送信)
spring.batch.job.enabled=true
spring.batch.job.enabled=false
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Boot
91
 1サーバに複数プロセス
• Web appとして起動するさせてしまうと
portの管理が必要
•
*Spring Boot 2.0では非推奨.代わりにWebApplicationType
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-
Notes
spring.main.web-environment=false
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Boot
92
 Datasourceを2つ指定するときは
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
</bean>
<bean id="dataSourceHive" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.apache.hive.jdbc.HiveDriver"/>
</bean>
<bean class="org.springframework.batch.core
.configuration.annotation.DefaultBatchConfigurer">
<constructor-arg ref="dataSource" />
</bean>
java.lang.IllegalStateException: To use the default BatchConfigurer the context
must contain no more thanone DataSource, found 2
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Source/Sinkの追加
93
API
定期レポート
@EnableBinding(Source.class)
public class ReportJobSender {
@Autowired
Source source;
public void send(ReportJobMessage reportJobMessage) throws
MessageHandlingException{
Message<ReportJobMessage> message =
MessageBuilder.withPayload(reportJobMessage).build();
source.output().send(message);
}
}
@EnableBinding(Sink.class)
public class JobRequestListener {
//..
@StreamListener(Sink.INPUT)
public void handleRequest(ReportJobQueueMessage reportJobQueueMessage) {
Long reportJobId = reportJobQueueMessage.getBody().getJobId();
JobParameters jobParameters = new JobParametersBuilder()
.addLong("reportJobId", reportJobId)
.addDate("currentDate", currentDate).toJobParameters();
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
}
}
レポート作成

More Related Content

PDF
Rest ful api設計入門
PPTX
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PDF
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
PDF
BuildKitの概要と最近の機能
PDF
ストリーム処理を支えるキューイングシステムの選び方
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
PDF
マイクロにしすぎた結果がこれだよ!
Rest ful api設計入門
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
BuildKitの概要と最近の機能
ストリーム処理を支えるキューイングシステムの選び方
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
マイクロにしすぎた結果がこれだよ!

What's hot (20)

PDF
Building the Game Server both API and Realtime via c#
PPTX
Ceph アーキテクチャ概説
PDF
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
PDF
DockerとKubernetesをかけめぐる
PPTX
HLSについて知っていることを話します
PDF
Presto on YARNの導入・運用
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
PPTX
Docker Tokyo
PDF
日本語テストメソッドについて
PDF
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
PDF
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
PPTX
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
PDF
WebSocketのキホン
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PDF
Monitoring - 入門監視
PDF
アプリを成長させるためのログ取りとログ解析に必要なこと
PDF
噛み砕いてKafka Streams #kafkajp
Building the Game Server both API and Realtime via c#
Ceph アーキテクチャ概説
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
DockerとKubernetesをかけめぐる
HLSについて知っていることを話します
Presto on YARNの導入・運用
コンテナ未経験新人が学ぶコンテナ技術入門
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
Docker Tokyo
日本語テストメソッドについて
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
WebSocketのキホン
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
インフラエンジニアの綺麗で優しい手順書の書き方
Monitoring - 入門監視
アプリを成長させるためのログ取りとログ解析に必要なこと
噛み砕いてKafka Streams #kafkajp
Ad

Viewers also liked (20)

PDF
Polyglot on the JVM with Graal (English)
PPTX
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
PPTX
Jjug ccc
PDF
Jjugccc2017spring-postgres-ccc_m1
PPTX
Kotlin is charming; The reasons Java engineers should start Kotlin.
PDF
VMの歩む道。 Dalvik、ART、そしてJava VM
PDF
Java libraries you can't afford to miss
PDF
Arachne Unweaved (JP)
PPTX
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
PDF
2017spring jjug ccc_f2
PDF
Introduction of Project Jigsaw
PDF
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
PDF
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
PPTX
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
PDF
日本Javaグループ2017年定期総会 #jjug
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
PDF
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
PPTX
グラフデータベース入門
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
Polyglot on the JVM with Graal (English)
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
Jjug ccc
Jjugccc2017spring-postgres-ccc_m1
Kotlin is charming; The reasons Java engineers should start Kotlin.
VMの歩む道。 Dalvik、ART、そしてJava VM
Java libraries you can't afford to miss
Arachne Unweaved (JP)
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
2017spring jjug ccc_f2
Introduction of Project Jigsaw
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
新卒2年目から始めるOSSのススメ~明日からできるコミットデビュー~
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
日本Javaグループ2017年定期総会 #jjug
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
グラフデータベース入門
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
Ad

Similar to ヤフーの広告レポートシステムをSpring Cloud Stream化するまで #jjug_ccc #ccc_a4 (20)

PDF
行列ができるECサイトの悩み~ショッピングや決済の技術的問題と処方箋
PDF
市場で勝ち続けるための品質とテストの技術①
PDF
Prestoクエリログの保存/分析機能の構築 #yjdsnight
PDF
Yahoo!ニュースにおける開発手法の取り組み
PDF
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
PPTX
大規模インフラで考える インフラチームの未来
PPTX
ディップ株式会社_kintonehive
PDF
Design pattern in presto source code
PDF
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
PDF
Storm の新機能について @HSCR #hadoopreading
PDF
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
PDF
Hive on Tezのベストプラクティス
PDF
Yahoo!プロモーション広告のビックデータ基盤を支える技術と今後の展望
PPTX
最若手メンバーこそチャンス!チーム改善に取り組んでわかったこと
PPTX
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
PDF
Yahoo!ブラウザーにおける市場環境の分析と戦略化
PDF
Presto in Yahoo! JAPAN #yjdsnight
PPTX
全社デザインシステムとサービスの付き合い方
PDF
決済金融から始めるデータドリブンカンパニー #yjmu
PDF
Netadashi Meetup #6 20170629
行列ができるECサイトの悩み~ショッピングや決済の技術的問題と処方箋
市場で勝ち続けるための品質とテストの技術①
Prestoクエリログの保存/分析機能の構築 #yjdsnight
Yahoo!ニュースにおける開発手法の取り組み
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
大規模インフラで考える インフラチームの未来
ディップ株式会社_kintonehive
Design pattern in presto source code
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
Storm の新機能について @HSCR #hadoopreading
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
Hive on Tezのベストプラクティス
Yahoo!プロモーション広告のビックデータ基盤を支える技術と今後の展望
最若手メンバーこそチャンス!チーム改善に取り組んでわかったこと
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
Yahoo!ブラウザーにおける市場環境の分析と戦略化
Presto in Yahoo! JAPAN #yjdsnight
全社デザインシステムとサービスの付き合い方
決済金融から始めるデータドリブンカンパニー #yjmu
Netadashi Meetup #6 20170629

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
PDF
オンプレML基盤on Kubernetes パネルディスカッション
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
PDF
Persistent-memory-native Database High-availability Feature
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PDF
ビッグデータから人々のムードを捉える #yjtc
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ゼロから始める転移学習
継続的なモデルモニタリングを実現するKubernetes Operator
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Persistent-memory-native Database High-availability Feature
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
eコマースと実店舗の相互利益を目指したデザイン #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
ビッグデータから人々のムードを捉える #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc

ヤフーの広告レポートシステムをSpring Cloud Stream化するまで #jjug_ccc #ccc_a4

  • 1. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 塩野 貴義, 橋本 尚亮 ヤフーの広告 レポートシステムを Spring Cloud Stream化 するまで 2017年5月20日
  • 2. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.2 塩野 貴義 ■家族構成 妻、息子2人(9歳♂双子) ■趣味 車、バイク ■経歴 2011/08 ヤフーに転職 2013/10 レポートシステム 2017/04 集計システム 自己紹介
  • 3. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.3 橋本 尚亮 ■家族構成 独身 ■趣味 音楽鑑賞 ■経歴 2016/04 ヤフーに新卒入社 2016/09 レポートシステム 自己紹介
  • 4. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 概要 4 第一世代 第二世代 第三世代 2013 2015 2017
  • 5. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 5 1. 広告レポートシステムについて 2. 第一世代~PHP&Perl~ 3. 第二世代~Spring Batch&Hive~ 4. 第三世代~Spring Cloud Stream~ 5. まとめ 6. tips
  • 6. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 6 1. 広告レポートシステムについて 2. 第一世代~PHP&Perl~ 3. 第二世代~Spring Batch&Hive~ 4. 第三世代~Spring Cloud Stream~ 5. まとめ 6. tips
  • 7. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 広告レポートについて 7  お客様(広告主)が入稿した広告の配 信実績を確認するためのレポート  レポート出力する項目や集計単位は 指定可能
  • 8. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 広告レポートのユースケース 8  通常レポート • API経由で作成リクエストを受け取る • 常時稼働 • レポート作成は非同期で行う Request Job 登録 Report job Report 作成 Job取得 API Batch API Batch
  • 9. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 広告レポートのユースケース 9  定期レポート • 定期レポートとして登録されているレ ポートのJobを一括登録する • 毎朝1回 • レポート作成方法は通常レポートと同じ Report job Report 作成 Job取得 定期 レポート Job 登録 Batch Batch
  • 10. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 広告レポートのユースケース 10  通常レポート • 常時稼働、約25万レポート/日  定期レポート • 毎朝1回、約5万レポート/日 Request Job 登録 Report job Report 作成 Job取得 定期 レポート Job 登録 API Batch Batch
  • 11. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. レポートのリクエスト数 11 80,000 150,000 300,000 第一世代(2014) 第二世代(2016) 第三世代(2017) インターネット広告市場の拡大に伴い レポート作成の リクエスト数は年々増加
  • 12. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 広告レポートシステム全体 12 Request Job 登録 Report job Report 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 配信ログ集計 API Batch Batch Batch
  • 13. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 13 1. 広告レポートシステムについて 2. 第一世代~PHP&Perl~ 3. 第二世代~Spring Batch&Hive~ 4. 第三世代~Spring Cloud Stream~ 5. まとめ 6. tips
  • 14. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代 14 Request Job 登録 Report job Report 作成 メール 送信 定期 レポート Job 登録 配信ログ集計 ストレージ2次集計 日次夜間集計
  • 15. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代 15 Request Job 登録 Report job Report 作成 メール 送信 定期 レポート Job 登録 配信ログ集計 ストレージ2次集計 日次夜間集計
  • 16. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代 16 Request Job 登録 Report job Report 作成 メール 送信 定期 レポート Job 登録 配信ログ集計 ストレージ2次集計 日次夜間集計
  • 17. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Report 作成 第一世代 17 Request Job 登録 Report job Job取得 メール 送信 定期 レポート Job 登録 配信実績取得 配信ログ集計 ストレージ2次集計 日次夜間集計 Job取得
  • 18. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代 18 Request Job 登録 Report 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 ストレージ2次集計 Report job 配信ログ集計 日次夜間集計
  • 19. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代 19 Request Job 登録 Report job Report 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 配信ログ集計 ストレージ2次集計 日次夜間集計 二次集計 処理時間:4時間以上 集計結果容量:1TB以上/日
  • 20. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代の課題 20  開発が複雑 • 全ての処理が依存しあっていて影響範囲が広い • テストパターンが網羅しきれない • 2000行以上の設定ファイルを共有 • Objectは全てArray • 改修・拡張でコードが複雑化 • 動的型付けで想定外の挙動 • 開発サーバ上でVimによる開発  運用コストが高い • リカバリの再集計は複数人で半日以上 • ファイルの欠損等で月に数回リカバリ作業が発生
  • 21. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代の課題 21  開発が複雑 • 全ての処理が依存しあっていて影響範囲が広い • テストパターンが網羅しきれない • 2000行以上の設定ファイルを共有 • Objectは全てArray • 改修・拡張でコードが複雑化 • 動的型付けで想定外の挙動 • 開発サーバ上でVimによる開発  運用コストが高い • リカバリの再集計は複数人で半日以上 • ファイルの欠損等で月に数回リカバリ作業が発生 - 品質を担保できない - 開発に時間がかかりすぎてログ量の 増加や機能拡張に追いつけない - ぐっすり眠れない
  • 22. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. なんとかしたい 22  開発スピードを上げたい  運用をもっと楽にして開発に集中 したい  ぐっすり寝たい
  • 23. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 23 1. 広告レポートシステムについて 2. 第一世代~PHP&Perl~ 3. 第二世代~Spring Batch&Hive~ 4. 第三世代~Spring Cloud Stream~ 5. まとめ 6. tips
  • 24. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代(2014) 24 Request Job 登録 Report job レポート 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 配信ログ集計 ストレージ2次集計 日次夜間集計
  • 25. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第二世代(2016) 25 Request Job 登録 Report job レポート 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 配信ログ集計 ストレージ2次集計 日次夜間集計
  • 26. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第二世代(2016) 26 Request Job 登録 Report job レポート 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 配信ログ集計
  • 27. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代から第二世代へ 27  Java / Spring Batch • DIコンテナによる疎結合とテストの充実 • 静的型付けで安心 • ライブラリが充実 • IDE  Hive on Tez • 二次集計が不要 • 保守するコード量が激減 • 自由度高く実績取得可能  運用 • ぐっすり眠れるようになった
  • 28. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代から第二世代へ 28 詳しくはこちら JJUG CCC 2016 Spring 広告システム刷新の舞台裏 PHPからJavaに変えてみました https://www.slideshare.net/techblogyahoo/jjugccc-cccf1-phpjava
  • 29. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第二世代(2016) 29 Request Job 登録 Report job レポート 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 配信ログ集計
  • 30. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 問題発生 30 Request Job 登録 Report job レポート 作成 Job取得 メール 送信 定期 レポート Job 登録 Job取得 配信実績取得 配信ログ集計 二次集計をなくしたことで配信実績 取得にかかる時間が増加 全体のスループットの低下
  • 31. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 31 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計
  • 32. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 32 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成
  • 33. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 33 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 これで解決?
  • 34. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 34 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成
  • 35. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 35 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・
  • 36. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 36 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成
  • 37. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 37 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・
  • 38. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 38 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・ レポート 作成 レポート 作成 レポート 作成 レポート 作成
  • 39. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 39 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・ レポート 作成 レポート 作成 レポート 作成 レポート 作成
  • 40. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 40 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・ レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成
  • 41. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 解決策 41 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・ レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成
  • 42. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第二世代の課題 レポート作成Batchをスケールアウト RDBへのポーリングのアクセス数が増大 RDBが高負荷 他のシステムにも影響 42
  • 43. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 43 1. 広告レポートシステムについて 2. 第一世代~PHP&Perl~ 3. 第二世代~Spring Batch&Hive~ 4. 第三世代~Spring Cloud Stream~ 5. まとめ 6. tips
  • 44. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第二世代(2016) 44 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 Report job 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・ レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成
  • 45. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第三世代(2017) 45 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・ レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成 MQ?
  • 46. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第三世代(2017) 46 Request Job 登録 レポート 作成 Job取得 定期 レポート Job 登録 配信実績取得 配信ログ集計 レポート 作成 ・・・ レポート 作成 レポート 作成 ・・・ レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成 レポート 作成 MQ? レポート作成を イベントドリブンに行いたい
  • 47. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Stream 47  message-driven microservices  Spring Boot  consumer groups  binder abstraction http://cloud.spring.io/spring-cloud-stream/
  • 48. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Stream 48 Source Sink output input 定期 レポート API レポート 作成
  • 49. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第三世代(2017) 49 レポート 作成 Request Job登録 Job登録 定期 レポート ・・・ ・・・ レポート 作成 レポート 作成
  • 50. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.  共通のdestinationを設定するだけで簡単にアプ リケーション間が接続される 第三世代(2017) 50 レポート 作成 Request Job登録 Job登録 定期 レポート ・・・ ・・・ レポート 作成 spring.cloud.stream. bindings.output.destination =reporting spring.cloud.stream. bindings.input.destination =reporting reporting
  • 51. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. レポート 作成 Request Job登録 Job登録 定期 レポート ・・・ ・・・ レポート 作成 レポート 作成 reporting 第三世代(2017) 51 {jobId:1002}{jobId:1002}{jobId:1002} {jobId:1002} {jobId:1002} {jobId:1002}
  • 52. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.  設定1つで簡単にconsumer groupが作れるためス ケールアウトが容易 spring.cloud.stream.bindings .input.group=ydnrep レポート 作成 Request Job登録 Job登録 定期 レポート ・・・ ・・・ レポート 作成 レポート 作成 第三世代(2017) 52 reporting .ydnrep {jobId:1002} ydnrep {jobId:1002}
  • 53. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. リリース 53 第二世代から第三世代へのリリースを ダウンタイム0で行いたい 0. 旧システム稼働中 1. 新システムデプロイ 2. 新シスステムサービスイン 3. 旧シスステムAPIサービスアウト 4. 旧シスステムBatchサービスアウト
  • 54. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ・・・ リリース 54 0.旧システム稼働中 Request Job 登録 Report job レポート作成 ・・・ Job取得
  • 55. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ・・・ リリース 55 1.新システムデプロイ Request Job 登録 Report job レポート作成 ・・・ Job取得 reporting .ydnrep
  • 56. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ・・・ リリース 56 2.新システムサービスイン Request Job 登録 Report job レポート作成 ・・・ Request Job 登録 Job取得 レポート作成 reporting .ydnrep
  • 57. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ・・・ リリース 57 3.旧システムAPIサービスアウト Report job レポート作成 ・・・ Request Job 登録 Job取得 レポート作成 reporting .ydnrep
  • 58. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ・・・ リリース 58 4.旧システムBatchサービスアウト Report job ・・・ Request Job 登録 レポート作成 reporting .ydnrep
  • 59. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ・・・ リリース 59 4.旧システムBatchサービスアウト Report job ・・・ Request Job 登録 レポート作成 ダウンタイム0でリリース完了! reporting .ydnrep
  • 60. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 性能比較 60  リリースして動作確認
  • 61. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 性能比較 61  RabbitMQの管理画面
  • 62. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 性能比較 62  RabbitMQの管理画面
  • 63. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 性能比較 63  RabbitMQの管理画面
  • 64. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 性能評価  レポート作成プロセス数:558  ポーリング時のSQL発行数/h • 第二世代: 16,928 • 第三世代: 0  レポート作成数/h • 第二世代: 44,121 • 第三世代: 63,934 64
  • 65. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第三世代(2017)  イベントドリブンにレポート作成 Jobを取得できるようになりRDB の負荷が減った  1時間あたりの処理数も増えた 65
  • 66. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第三世代(2017)  イベントドリブンにレポート作成 Jobを取得できるようになりRDB の負荷が減った  1時間あたりの処理数も増えた めでたしめでたし、、、 66
  • 67. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 問題発生  イベントドリブンにレポート作成 Jobを取得できるようになりRDB の負荷が減った  1時間あたりの処理数も増えた めでたしめでたし、、、 67 SQL [INSERT into BATCH_JOB_EXECUTION_PARAMS(JOB_EXECUTION_ID, KEY_NAME, TYPE_CD, STRING_VAL, DATE_VAL, LONG_VAL, DOUBLE_VAL, IDENTIFYING) values (?, ?, ?, ?, ?, ?, ?, ?)]; ORA-08177: can't serialize access for this transaction
  • 68. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 原因 68 レポート 作成 定期 レポート ・・・ ・・・ {jobId:1002, ・・・ jobId:51002}
  • 69. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 原因 69 レポート 作成 定期 レポート ・・・ ・・・ {jobId:1002, ・・・ jobId:51002} {jobId:1002} {jobId:1003} {jobId:1503}
  • 70. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 原因 70 レポート 作成 定期 レポート ・・・ ・・・ Spring Batchの Job管理テーブルに 同時に大量のINSERT ・・・ {jobId:1002, ・・・ jobId:51002} {jobId:1002} {jobId:1003} {jobId:1503}
  • 71. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 原因 71 レポート 作成 定期 レポート ・・・ ・・・ Spring Batchの Job管理テーブルに 同時に大量のINSERT ・・・ {jobId:1002, ・・・ jobId:51002} {jobId:1003} {jobId:1503} 3回失敗すると メッセージは消失
  • 72. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 対策(1/2) 72 レポート 作成 reporting .ydnrep ・・・ ・・・ ydnrep レポート 作成 定期 レポート  maxAttemptの上限を上げる spring.cloud.stream.bindings. input.consumer.maxAttempts=5
  • 73. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 対策(2/2) 73 レポート 作成 reporting .ydnrep ・・・ ・・・ ydnrep レポート 作成 reporting .ydnrep.dlq 定期 レポート  Dead Letter Queue を用意 spring.cloud.stream.rabbit.bind ings.input.consumer.autoBindDlq =true {jobId:1002} エラー処理
  • 74. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 対策(2/2) 74 レポート 作成 reporting .ydnrep ・・・ ・・・ ydnrep レポート 作成 reporting .ydnrep.dlq 定期 レポート  Dead Letter Queue を用意 {jobId:1002} メッセージを 送信し直す
  • 75. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 対策(2/2) 75 レポート 作成 reporting .ydnrep ・・・ ・・・ ydnrep レポート 作成 reporting .ydnrep.dlq 定期 レポート  Dead Letter Queue を用意 {jobId:1002} メッセージを 送信し直す 根本的な解決になっていない
  • 76. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 対策(2/2) 76 レポート 作成 reporting .ydnrep ・・・ ・・・ ydnrep レポート 作成 reporting .ydnrep.dlq 定期 レポート  Dead Letter Queue を用意 {jobId:1002} メッセージを 送信し直す Job RepositoryがDBアクセスしない方法を調査中 *常駐バッチのためJob Repositoryを インメモリ化できない
  • 77. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 77 1. 広告レポートシステムについて 2. 第一世代~PHP&Perl~ 3. 第二世代~Spring Batch&Hive~ 4. 第三世代~Spring Cloud Stream~ 5. まとめ 6. tips
  • 78. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代(2014) 第二世代(2016) 第三世代(2017) まとめ 78
  • 79. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 第一世代(2014) 第二世代(2016) 第三世代(2017) まとめ 79
  • 80. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まとめ 80  刷新をする度に課題がバックエンドに移動  ポーリング型からイベントドリブンに変更するこ とでスループット向上  大規模システムはリリースしてからが勝負  Spring歴1年未満の私でもmicroservicesが簡単 に作れました
  • 81. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. これから ・・・レポート 作成 API メール 送信 定期 レポート  他サービスのSpring Cloud Stream化
  • 82. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. これから ・・・レポート 作成 API メール 送信 定期 レポート  ミドルウェアの比較・検討
  • 83. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. これから ・・・レポート 作成 API メール 送信 定期 レポート  Cloud Foundryへの移行
  • 84. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. これから ・・・レポート 作成 API メール 送信 定期 レポート  興味がある方は是非!
  • 85. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. これから  他サービスのSpring Cloud Stream化  ミドルウェアの比較・検討  Cloud Foundryへの移行  興味がある方は是非!
  • 86. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 86 1. 広告レポートシステムについて 2. 第一世代~PHP&Perl~ 3. 第二世代~Spring Batch&Hive~ 4. 第三世代~Spring Cloud Stream~ 5. まとめ 6. tips
  • 87. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Streamの実装 87
  • 88. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Streamの実装 88  API, BatchのSpring Boot化  Source/Sinkの追加
  • 89. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Boot 89  Application起動クラスの追加  application.properties で設定を 管理  API : war->jar (embedded jetty)  Batch:苦戦
  • 90. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Boot 90  第二世代Batch : • 1つのjarに複数の機能 • 実行時にjobIdを指定  第三世代Batch : • 1application/jar • 単発batch(定期レポート) • 常駐batch(レポート作成, メール送信) spring.batch.job.enabled=true spring.batch.job.enabled=false
  • 91. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Boot 91  1サーバに複数プロセス • Web appとして起動するさせてしまうと portの管理が必要 • *Spring Boot 2.0では非推奨.代わりにWebApplicationType https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release- Notes spring.main.web-environment=false
  • 92. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Boot 92  Datasourceを2つ指定するときは <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> </bean> <bean id="dataSourceHive" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.apache.hive.jdbc.HiveDriver"/> </bean> <bean class="org.springframework.batch.core .configuration.annotation.DefaultBatchConfigurer"> <constructor-arg ref="dataSource" /> </bean> java.lang.IllegalStateException: To use the default BatchConfigurer the context must contain no more thanone DataSource, found 2
  • 93. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Source/Sinkの追加 93 API 定期レポート @EnableBinding(Source.class) public class ReportJobSender { @Autowired Source source; public void send(ReportJobMessage reportJobMessage) throws MessageHandlingException{ Message<ReportJobMessage> message = MessageBuilder.withPayload(reportJobMessage).build(); source.output().send(message); } } @EnableBinding(Sink.class) public class JobRequestListener { //.. @StreamListener(Sink.INPUT) public void handleRequest(ReportJobQueueMessage reportJobQueueMessage) { Long reportJobId = reportJobQueueMessage.getBody().getJobId(); JobParameters jobParameters = new JobParametersBuilder() .addLong("reportJobId", reportJobId) .addDate("currentDate", currentDate).toJobParameters(); JobExecution jobExecution = jobLauncher.run(job, jobParameters); } } レポート作成