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