Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
2017年11月24日
ヤフー株式会社 鴨志田 智弥
Yahoo! JAPANのコンテンツプラットフォームを支える...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
自己紹介
• 鴨志田 智弥
• ヤフー株式会社 メディアグループ
メディアカンパニー プラットフォーム開発本部
•...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
• Yahoo! JAPANとコンテンツ
• コンテンツプラットフォームでのSpringの採用事例
•...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Res...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Yahoo! JAPANとコンテンツ
天気
試合情報
路線の
遅延情報
ニュース
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
提供コンテンツ
Yahoo! JAPAN
個人
提供社
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
提供コンテンツ
• ニュース記事、コラム
• 天気、地震情報
• 株価
• 試合情報、試合のスコア
• 動画
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Res...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
• Yahoo! JAPANとコンテンツ
• コンテンツプラットフォームでのSpringの採用事例
•...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
コンテンツプラットフォーム
• 提供コンテンツの入稿・配信のプラットフォーム
• 1stリリースは記事コンテンツが...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
旧システムの辛い所
• 巨大なモノリシックなアプリケーション
• 大きすぎてリファクタリングできない
• さらにテ...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
旧システムの辛い所2
• 実機&VMで動いている
• マスタ/スタンバイ構成で冗長性有り
• 簡単にスケールアウト...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
旧システムの辛い所3
• アーキテクチャが古いのでPaaSなどへの移行は難しい
• IPアドレスに依存していたり
...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
新システムの設計
• マイクロサービスアーキテクチャ
• システムを細分化して柔軟に対応できるようにしたい
• 同...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
新システムの設計2
• Java
• プラットフォームなのでなるべく不具合無くリリースしたい
• 静的型付け、コン...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
新システムの設計3
• PaaS
• 運用コストを下げたい
• リソースを有効活用したい
• 重大ニュースなどで負...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
新システムの設計4
• Spring Boot
• Javaでマイクロサービスするなら鉄板
• フルスタックで機能...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
• Yahoo! JAPANとコンテンツ
• コンテンツプラットフォームでのSpringの採用事例
•...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
システム構成
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
ストレージ
H...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
システム構成
入稿API
入稿データ
(MySQL)
入稿サービス
データ受付
確認
データ保存
非同期
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
システム構成
入稿データ
(MySQL)
解析処理
解析
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
システム構成
処理済みデータ
(Cassandra)
データ保存
参照サービス
データ保存
更新通知
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
システム構成
ストレージ
Hadoop
バッチ処理用
データ保存
ストレージに保存
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
システム構成
レガシーアダプタ旧PF
入稿API
フォーマット変換
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
システム構成補足
• 現在約20サービスほど
• オンプレ環境に構築したPivotal Cloud Foundry...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Pivotal Cloud Foundry
• Pivotal社製のCloud Foundry
• PaaS
• ...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Pivotal Cloud Foundry
Spring Boot Actuator連携
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Apache Pulsar
• Pub-Subメッセージングシステム
• Yahoo! Inc.製で今はApach...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Stream
• Springでメッセージングシステムを使うフレームワーク
• 公式では...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Source / Processor / Sink
Source Sink
binder
Processor
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Source / Processor / Sink
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
依存の追加
ext {
springCloudVersion = 'Dalston.SR4'
}
dependen...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
依存の追加
RabbitMQの場合
org.springframework.cloud:spring-cloud-...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sourceの実装
@SpringBootApplication
@RestController
public c...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sourceの実装
@SpringBootApplication
@RestController
@EnableB...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sourceの実装
@SpringBootApplication
@RestController
@EnableB...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sourceの実装
@SpringBootApplication
@RestController
@EnableB...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sourceの設定
spring.rabbitmq.addresses=localhost:5672
spring...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
broker固有の設定
spring.rabbitmq.addresses=localhost:5672
spri...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Source側のbinderの設定
送信先トピック
spring.cloud.stream.bindings.ou...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sinkの実装
@SpringBootApplication
public class SinkDemoAppli...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sinkの実装
@SpringBootApplication
@EnableBinding(Sink.class)...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sinkの実装
@SpringBootApplication
@EnableBinding(Sink.class)...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sinkの実装
@SpringBootApplication
@EnableBinding(Sink.class)...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sinkの設定
spring.rabbitmq.addresses=localhost:5672
spring.r...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Sink側のbinderの設定
受信トピック
spring.cloud.stream.bindings.input...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ConsumerGroup
設定しない場合はそれぞれに同じメッセージが届く
AAA
BBB
CCC
AAA
BBB...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ConsumerGroup
設定した場合はグループ内のどれか1つにだけメッセージが届く
AAA
BBB
CCC
A...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
メリット
• 抽象化されているのでロジックに集中できる
• 違うbrokerに乗り換える場合は設定の差し替え程度で...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Boot Actuator連携
接続先のbrokerのヘルスチェック
{
"status": "UP...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Streamのテスト
• テストツールが提供されている
• spring-cloud-s...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
実装後に出てきた課題
• 処理の流れがわかりにくい
• 想定よりスループットが出ない
• エラー時の処理
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
処理の流れがわかりにくい
• マイクロサービスの処理の流れはわかりにくい
• どこでエラーが起きたのか?
• どこ...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Sleuth
リクエストにトレース用のユニークなIDを付与する
ID発行 abc abc...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Spring Cloud Sleuth
• 自動で追跡用のIDが発行・付与
• 自動でログにも出力
• トラブル時...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
TraceIDを可視化するツール
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
ストレージ
H...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
ストレージ
H...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
①
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
ストレージ
H...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
①
②
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
ストレージ
H...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
①
②
③
続きがある
同期処理終了
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
ストレージ
H...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
①
②
③
④
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
ストレージ
H...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Zipkin
①
②
③
④
⑤
⑥
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
想定よりスループットが出ない
• 負荷テストしてみたら非同期部分が遅い
• Sinkの同時処理数が1だった・・・
...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
エラー時の処理
• 処理の途中でエラーになったメッセージが行方不明に
• Pulsarは再送までの時間を設定しない...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
• 非常災害時でもサービスを継続する必要がある
• 西日本と東日本のDCに分散構築
東日本...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
仮に片方のDCが停止しても問題ないように設計
MySQL
西日本
東日本
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
仮に片方のDCが停止しても問題ないように設計
GSLB
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
仮に片方のDCが停止しても問題ないように設計
MySQL
GSLB
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
仮に片方のDCが停止しても問題ないように設計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
仮に片方のDCが停止しても問題ないように設計
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
仮に片方のDCが停止しても問題ないように設計
MySQL
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
BCP(事業継続計画)
仮に片方のDCが停止しても問題ないように設計
MySQL
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
利用サービス例
• Yahoo! JAPANアプリ
• ニュースフィード部分などで利用
• Vespaでコンテンツ...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
• Yahoo! JAPANとコンテンツ
• コンテンツプラットフォームでのSpringの採用事例
•...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java/Springで良かったこと
• フルスタックで機能も豊富なのでロジックに集中できる
• マイクロサービス...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
非同期部分は機能拡張が簡単
購読を増やすだけなので既存システムへの影響は少ない
既存アプリケーション
追加アプリケ...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
非同期部分は機能拡張が簡単
レガシーアダプタ旧PF
入稿API
入稿データ
(MySQL)
解析処理入稿サービス
...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
1つの機能がシンプル
• 機能が小分けになっているので実装がシンプルに
• APIやメッセージを挟んでいるので疎結...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
1つの機能がシンプル
• 複数人での並行開発も容易
• コンフリクトも起こりにくい
コンフリクト地獄
☀️
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
新たな課題
• メモリの使用量が他の言語に比べ多め
• マイクロサービスの管理が大変
• 便利なソリューションも提...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
今後の展望
• Kotlinの検討
• マイクロサービス系のツールのさらなる導入
• 検証が追いつかず導入を見送っ...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Res...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
まとめ
• 既存システムの課題がSpringとマイクロサービスで大きく
改善できた
• マイクロサービスをやるなら...
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Res...
Upcoming SlideShare
Loading in …5
×

Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52

7,177 views

Published on

SpringFest2017の以下のセッションの資料です。
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ
http://springfest2017.springframework.jp/

Published in: Technology
  • Be the first to comment

Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52

  1. 1. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 2017年11月24日 ヤフー株式会社 鴨志田 智弥 Yahoo! JAPANのコンテンツプラットフォームを支える Spring Cloud Streamによるマイクロサービスアーキテクチャ
  2. 2. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 自己紹介 • 鴨志田 智弥 • ヤフー株式会社 メディアグループ メディアカンパニー プラットフォーム開発本部 • 経歴 • 2009年 新卒入社 • 2009年〜 Yahoo!ニュース • 2016年9月〜 コンテンツプラットフォーム
  3. 3. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ • Yahoo! JAPANとコンテンツ • コンテンツプラットフォームでのSpringの採用事例 • 既存システムの課題と新システムの設計 • システム概要と詳細 • 良かったこと、悪かったこと
  4. 4. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANとコンテンツ
  5. 5. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANとコンテンツ 天気 試合情報 路線の 遅延情報 ニュース
  6. 6. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 提供コンテンツ Yahoo! JAPAN 個人 提供社
  7. 7. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 提供コンテンツ • ニュース記事、コラム • 天気、地震情報 • 株価 • 試合情報、試合のスコア • 動画
  8. 8. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. コンテンツプラットフォームでの Springの採用事例の紹介
  9. 9. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ • Yahoo! JAPANとコンテンツ • コンテンツプラットフォームでのSpringの採用事例 • 既存システムの課題と新システムの設計 • システム概要と詳細 • 良かったこと、悪かったこと
  10. 10. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. コンテンツプラットフォーム • 提供コンテンツの入稿・配信のプラットフォーム • 1stリリースは記事コンテンツがターゲット • 開発に至った背景 • 旧記事入稿プラットフォームがレガシーなためリニューアル • 2009年から稼働 • PHP、Perl、C
  11. 11. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 旧システムの辛い所 • 巨大なモノリシックなアプリケーション • 大きすぎてリファクタリングできない • さらにテストコードが無い&書きづらい • その結果レガシーなコードのまま • 環境や依存のバージョンアップの時はひたすらエラーを潰す
  12. 12. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 旧システムの辛い所2 • 実機&VMで動いている • マスタ/スタンバイ構成で冗長性有り • 簡単にスケールアウトできないので常にリソースは確保している 常に確保
  13. 13. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 旧システムの辛い所3 • アーキテクチャが古いのでPaaSなどへの移行は難しい • IPアドレスに依存していたり • 処理自体はテキスト処理などで非常にシンプル
  14. 14. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 新システムの設計 • マイクロサービスアーキテクチャ • システムを細分化して柔軟に対応できるようにしたい • 同期的に処理しなくて良い部分は非同期で処理したい
  15. 15. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 新システムの設計2 • Java • プラットフォームなのでなるべく不具合無くリリースしたい • 静的型付け、コンパイラで検知 PHP Java インタープリタ型言語 動的型付け コンパイラ型言語 静的型付け
  16. 16. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 新システムの設計3 • PaaS • 運用コストを下げたい • リソースを有効活用したい • 重大ニュースなどで負荷が大きく上昇するため素早くスケールアウトした い PaaS
  17. 17. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 新システムの設計4 • Spring Boot • Javaでマイクロサービスするなら鉄板 • フルスタックで機能も豊富 • 社内PaaS環境のPivotal Cloud Foundryとの相性も良い
  18. 18. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ • Yahoo! JAPANとコンテンツ • コンテンツプラットフォームでのSpringの採用事例 • 既存システムの課題と新システムの設計 • システム概要と詳細 • 良かったこと、悪かったこと
  19. 19. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. システム構成 レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス
  20. 20. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. システム構成 入稿API 入稿データ (MySQL) 入稿サービス データ受付 確認 データ保存 非同期
  21. 21. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. システム構成 入稿データ (MySQL) 解析処理 解析
  22. 22. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. システム構成 処理済みデータ (Cassandra) データ保存 参照サービス データ保存 更新通知
  23. 23. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. システム構成 ストレージ Hadoop バッチ処理用 データ保存 ストレージに保存
  24. 24. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. システム構成 レガシーアダプタ旧PF 入稿API フォーマット変換
  25. 25. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. システム構成補足 • 現在約20サービスほど • オンプレ環境に構築したPivotal Cloud Foundry上で稼働 • Spring Bootと一部Node.js • 非同期部分はPulsarとSpring Cloud Stream • MySQL、Cassandra、内製のS3互換ストレージ
  26. 26. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Pivotal Cloud Foundry • Pivotal社製のCloud Foundry • PaaS • コマンド1つでアプリケーションが立ち上がる $ cf push -p build/libs/hoge-1.0.0.jar https://hoge.XXXX.yahoo.co.jp/ 数分後
  27. 27. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Pivotal Cloud Foundry Spring Boot Actuator連携
  28. 28. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Apache Pulsar • Pub-Subメッセージングシステム • Yahoo! Inc.製で今はApache Incubator • 特徴 • 高パフォーマンス、高スケーラビリティ • マルチテナント • 複数DC間でのレプリケーション
  29. 29. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Stream • Springでメッセージングシステムを使うフレームワーク • 公式ではRabbitMQとKafkaをサポート • Pulsarは公式ではサポートされていないので内製対応 Producer Consumer Message Broker
  30. 30. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Source / Processor / Sink Source Sink binder Processor
  31. 31. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Source / Processor / Sink レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス Source Processor Sink
  32. 32. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 依存の追加 ext { springCloudVersion = 'Dalston.SR4' } dependencies { compile('org.springframework.cloud:spring-cloud-starter-stream-rabbit') compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-actuator') testCompile('org.springframework.boot:spring-boot-starter-test') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } 使うbrokerのものを指定 その他はお好みで
  33. 33. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 依存の追加 RabbitMQの場合 org.springframework.cloud:spring-cloud-starter-stream-rabbit Kafkaの場合 org.springframework.cloud:spring-cloud-starter-stream-kafka Pulsarの場合(自作) com.example:spring-cloud-starter-stream-pulsar
  34. 34. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sourceの実装 @SpringBootApplication @RestController public class SourceDemoApplication { @PostMapping public void send(@RequestBody Map<String, String> message) { // ここに送信する処理を書く } public static void main(String[] args) { 〜略〜 } }
  35. 35. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sourceの実装 @SpringBootApplication @RestController @EnableBinding(Source.class) public class SourceDemoApplication { @PostMapping public void send(@RequestBody Map<String, String> message) { // ここに送信する処理を書く } public static void main(String[] args) { 〜略〜 } } アノテーションを追加
  36. 36. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sourceの実装 @SpringBootApplication @RestController @EnableBinding(Source.class) public class SourceDemoApplication { @Autowired private Source source; @PostMapping public void send(@RequestBody Map<String, String> message) { // ここに送信する処理を書く } public static void main(String[] args) { 〜略〜 } } インジェクション
  37. 37. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sourceの実装 @SpringBootApplication @RestController @EnableBinding(Source.class) public class SourceDemoApplication { @Autowired private Source source; @PostMapping public void send(@RequestBody Map<String, String> message) { source.output().send(MessageBuilder.withPayload(message).build()); } public static void main(String[] args) { 〜略〜 } } 送信処理
  38. 38. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sourceの設定 spring.rabbitmq.addresses=localhost:5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.cloud.stream.bindings.output.destination=foo_topic spring.cloud.stream.bindings.output.contentType=application/json broker固有の設定 binderの設定
  39. 39. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. broker固有の設定 spring.rabbitmq.addresses=localhost:5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.cloud.stream.kafka.binder.brokers=localhost spring.cloud.stream.kafka.binder.defaultBrokerPort=9092 spring.cloud.stream.kafka.binder.zkNodes=localhost spring.cloud.stream.kafka.binder.defaultZkPort=2181 spring.cloud.stream.pulsar.binder.clusterUrl=pulsar://localhost:6650 RabbitMQの例 Kafkaの例 Pulsarの例(イメージ)
  40. 40. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Source側のbinderの設定 送信先トピック spring.cloud.stream.bindings.output.destination=foo_topic メッセージのシリアライズ方法 spring.cloud.stream.bindings.output.contentType=application/json JSONがオススメ
  41. 41. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sinkの実装 @SpringBootApplication public class SinkDemoApplication { public void receive(Map<String, String> data) { // ここに受信したメッセージの処理を書く } public static void main(String[] args) { 〜略〜 } }
  42. 42. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sinkの実装 @SpringBootApplication @EnableBinding(Sink.class) public class SinkDemoApplication { public void receive(Map<String, String> data) { // ここに受信したメッセージの処理を書く } public static void main(String[] args) { 〜略〜 } } アノテーションを追加
  43. 43. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sinkの実装 @SpringBootApplication @EnableBinding(Sink.class) public class SinkDemoApplication { @StreamListener(Sink.INPUT) public void receive(Map<String, String> data) { // ここに受信したメッセージの処理を書く } public static void main(String[] args) { 〜略〜 } } アノテーションを追加
  44. 44. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sinkの実装 @SpringBootApplication @EnableBinding(Sink.class) public class SinkDemoApplication { @StreamListener(Sink.INPUT) public void receive(Map<String, String> data) { System.out.println("Received : " + data.toString()); } public static void main(String[] args) { 〜略〜 } } 処理を書く
  45. 45. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sinkの設定 spring.rabbitmq.addresses=localhost:5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.cloud.stream.bindings.input.destination=foo_topic spring.cloud.stream.bindings.input.group=bar_group broker固有の設定 binderの設定
  46. 46. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Sink側のbinderの設定 受信トピック spring.cloud.stream.bindings.input.destination=foo_topic ConsumerGroup名 spring.cloud.stream.bindings.input.group=bar_group
  47. 47. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ConsumerGroup 設定しない場合はそれぞれに同じメッセージが届く AAA BBB CCC AAA BBB CCC AAA BBB CCC AAA BBB CCC
  48. 48. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ConsumerGroup 設定した場合はグループ内のどれか1つにだけメッセージが届く AAA BBB CCC AAA BBB CCC
  49. 49. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. メリット • 抽象化されているのでロジックに集中できる • 違うbrokerに乗り換える場合は設定の差し替え程度で済む • Springの他の機能との連携
  50. 50. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Boot Actuator連携 接続先のbrokerのヘルスチェック { "status": "UP", 〜中略〜 "rabbit": { "status": "UP", "version": "3.6.12" }, "binders": { "status": "UP", "rabbit": { "status": "UP", "binderHealthIndicator": { "status": "UP", "version": "3.6.12" } } } }
  51. 51. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Streamのテスト • テストツールが提供されている • spring-cloud-stream-test-support Sourceテストコード Sinkテストコード assert assert モックモック
  52. 52. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 実装後に出てきた課題 • 処理の流れがわかりにくい • 想定よりスループットが出ない • エラー時の処理
  53. 53. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 処理の流れがわかりにくい • マイクロサービスの処理の流れはわかりにくい • どこでエラーが起きたのか? • どこがボトルネックになっているのか? エラー! ?
  54. 54. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Sleuth リクエストにトレース用のユニークなIDを付与する ID発行 abc abc abc X-B3-TraceId: abc
  55. 55. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Spring Cloud Sleuth • 自動で追跡用のIDが発行・付与 • 自動でログにも出力 • トラブル時はTraceIDで検索すればOK
  56. 56. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin TraceIDを可視化するツール
  57. 57. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス Zipkin
  58. 58. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin
  59. 59. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス ①
  60. 60. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin ①
  61. 61. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス ① ②
  62. 62. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin ① ②
  63. 63. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス ① ② ③
  64. 64. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin ① ② ③ 続きがある 同期処理終了
  65. 65. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス ① ② ③ ④
  66. 66. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin ① ② ③ ④
  67. 67. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス ① ② ③ ④ ⑤ ⑥
  68. 68. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Zipkin ① ② ③ ④ ⑤ ⑥
  69. 69. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 想定よりスループットが出ない • 負荷テストしてみたら非同期部分が遅い • Sinkの同時処理数が1だった・・・ spring.cloud.stream.bindings.input.consumer.concurrency=10 デフォルトは1 適度に増やす 必ず設定する
  70. 70. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. エラー時の処理 • 処理の途中でエラーになったメッセージが行方不明に • Pulsarは再送までの時間を設定しないと再送してくれな かった・・・ • brokerの仕様は把握しておくことが大事
  71. 71. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) • 非常災害時でもサービスを継続する必要がある • 西日本と東日本のDCに分散構築 東日本クラスタ西日本クラスタ GSLB
  72. 72. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) 仮に片方のDCが停止しても問題ないように設計 MySQL 西日本 東日本
  73. 73. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) 仮に片方のDCが停止しても問題ないように設計 GSLB
  74. 74. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) 仮に片方のDCが停止しても問題ないように設計 MySQL GSLB
  75. 75. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) 仮に片方のDCが停止しても問題ないように設計
  76. 76. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) 仮に片方のDCが停止しても問題ないように設計
  77. 77. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) 仮に片方のDCが停止しても問題ないように設計 MySQL
  78. 78. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. BCP(事業継続計画) 仮に片方のDCが停止しても問題ないように設計 MySQL
  79. 79. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 利用サービス例 • Yahoo! JAPANアプリ • ニュースフィード部分などで利用 • Vespaでコンテンツのレコメンデーション コンテンツ 更新処理 Index アプリBE 更新通知 更新検知& データ取得 インデックス 更新
  80. 80. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ • Yahoo! JAPANとコンテンツ • コンテンツプラットフォームでのSpringの採用事例 • 既存システムの課題と新システムの設計 • システム概要と詳細 • 良かったこと、悪かったこと
  81. 81. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Java/Springで良かったこと • フルスタックで機能も豊富なのでロジックに集中できる • マイクロサービスに必要なものが揃っている • テストコードが書きやすい • Mockito • MockRestServiceServer • REST Assured
  82. 82. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 非同期部分は機能拡張が簡単 購読を増やすだけなので既存システムへの影響は少ない 既存アプリケーション 追加アプリケーション この線を増やせばOK ・・・ ・・・ ・・・
  83. 83. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 非同期部分は機能拡張が簡単 レガシーアダプタ旧PF 入稿API 入稿データ (MySQL) 解析処理入稿サービス ストレージ Hadoop 処理済みデータ (Cassandra) バッチ処理用 データ保存 データ保存 参照サービス 実は後から追加
  84. 84. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 1つの機能がシンプル • 機能が小分けになっているので実装がシンプルに • APIやメッセージを挟んでいるので疎結合 • 修正やレビューは見る範囲が狭い方が良い 数万行🔥 数百〜数千行☀️
  85. 85. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 1つの機能がシンプル • 複数人での並行開発も容易 • コンフリクトも起こりにくい コンフリクト地獄 ☀️
  86. 86. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 新たな課題 • メモリの使用量が他の言語に比べ多め • マイクロサービスの管理が大変 • 便利なソリューションも提供されているが・・・ • 依存ライブラリのバージョンを上げるのも一苦労 • 開発メンバーが少ないのも要因の1つ
  87. 87. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 今後の展望 • Kotlinの検討 • マイクロサービス系のツールのさらなる導入 • 検証が追いつかず導入を見送ったものがいくつかある • 新しく増えたものも随時検討 • Spring Cloud Skipperなど
  88. 88. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まとめ
  89. 89. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まとめ • 既存システムの課題がSpringとマイクロサービスで大きく 改善できた • マイクロサービスをやるならSpring Cloud Streamが便利
  90. 90. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Javaエンジニア 積極採用中!! ヤフー 採用

×