---
title: Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
tags:  #jsug #sf_52  
author: [Yahoo!デベロッパーネットワーク](https://convert.docswell.com/user/ydnjp)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/LE3NQX64E5.jpg?width=480
description: SpringFest2017の以下のセッションの資料です。 Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ http://springfest2017.springframework.jp/
published: November 27, 17
canonical: https://convert.docswell.com/s/ydnjp/KJ1D1Z-2017-11-27-150042
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/LE3NQX64E5.jpg)

Yahoo! JAPANのコンテンツプラットフォームを支える
Spring Cloud Streamによるマイクロサービスアーキテクチャ
2017年11月24日
ヤフー株式会社
鴨志田 智弥
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 2

![Page Image](https://bcdn.docswell.com/page/8EDW92V57G.jpg)

自己紹介
•
鴨志田 智弥
•
ヤフー株式会社 メディアグループ
メディアカンパニー プラットフォーム開発本部
•
経歴
•
2009年 新卒入社
•
2009年〜 Yahoo!ニュース
•
2016年9月〜 コンテンツプラットフォーム
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 3

![Page Image](https://bcdn.docswell.com/page/V7P9Z1VDJ8.jpg)

アジェンダ
•
Yahoo! JAPANとコンテンツ
•
コンテンツプラットフォームでのSpringの採用事例
•
既存システムの課題と新システムの設計
•
システム概要と詳細
•
良かったこと、悪かったこと
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 4

![Page Image](https://bcdn.docswell.com/page/2JVMWYZGJQ.jpg)

Yahoo! JAPANとコンテンツ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 5

![Page Image](https://bcdn.docswell.com/page/5EGGD9MDEL.jpg)

Yahoo! JAPANとコンテンツ
天気
路線の
遅延情報
試合情報
ニュース
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 6

![Page Image](https://bcdn.docswell.com/page/4JQX1WRXEP.jpg)

提供コンテンツ
提供社
Yahoo! JAPAN
個人
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 7

![Page Image](https://bcdn.docswell.com/page/K746RK82E1.jpg)

提供コンテンツ
• ニュース記事、コラム
• 天気、地震情報
• 株価
• 試合情報、試合のスコア
• 動画
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 8

![Page Image](https://bcdn.docswell.com/page/LJ1VQX2KEG.jpg)

コンテンツプラットフォームでの
Springの採用事例の紹介
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 9

![Page Image](https://bcdn.docswell.com/page/GJWLMNRPE2.jpg)

アジェンダ
•
Yahoo! JAPANとコンテンツ
•
コンテンツプラットフォームでのSpringの採用事例
•
既存システムの課題と新システムの設計
•
システム概要と詳細
•
良かったこと、悪かったこと
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 10

![Page Image](https://bcdn.docswell.com/page/4EZMQ3R6J3.jpg)

コンテンツプラットフォーム
• 提供コンテンツの入稿・配信のプラットフォーム
•
1stリリースは記事コンテンツがターゲット
• 開発に至った背景
•
旧記事入稿プラットフォームがレガシーなためリニューアル
•
2009年から稼働
•
PHP、Perl、C
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 11

![Page Image](https://bcdn.docswell.com/page/Y76N6XRL7V.jpg)

旧システムの辛い所
• 巨大なモノリシックなアプリケーション
• 大きすぎてリファクタリングできない
•
さらにテストコードが無い&amp;書きづらい
• その結果レガシーなコードのまま
•
環境や依存のバージョンアップの時はひたすらエラーを潰す
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 12

![Page Image](https://bcdn.docswell.com/page/G7556X8M74.jpg)

旧システムの辛い所2
• 実機&amp;VMで動いている
•
マスタ/スタンバイ構成で冗長性有り
•
簡単にスケールアウトできないので常にリソースは確保している
常に確保
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 13

![Page Image](https://bcdn.docswell.com/page/9J2NMXKRER.jpg)

旧システムの辛い所3
• アーキテクチャが古いのでPaaSなどへの移行は難しい
•
IPアドレスに依存していたり
•
処理自体はテキスト処理などで非常にシンプル
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 14

![Page Image](https://bcdn.docswell.com/page/DEYPX8N5EM.jpg)

新システムの設計
• マイクロサービスアーキテクチャ
•
システムを細分化して柔軟に対応できるようにしたい
•
同期的に処理しなくて良い部分は非同期で処理したい
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 15

![Page Image](https://bcdn.docswell.com/page/VJN51QX478.jpg)

新システムの設計2
• Java
•
プラットフォームなのでなるべく不具合無くリリースしたい
•
静的型付け、コンパイラで検知
インタープリタ型言語
動的型付け
PHP
コンパイラ型言語
静的型付け
Java
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 16

![Page Image](https://bcdn.docswell.com/page/YE9Y5D84J3.jpg)

新システムの設計3
• PaaS
•
運用コストを下げたい
•
リソースを有効活用したい
•
重大ニュースなどで負荷が大きく上昇するため素早くスケールアウ
トしたい
PaaS
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 17

![Page Image](https://bcdn.docswell.com/page/GE86Y38V7D.jpg)

新システムの設計4
• Spring Boot
•
Javaでマイクロサービスするなら鉄板
•
フルスタックで機能も豊富
•
社内PaaS環境のPivotal Cloud Foundryとの相性も良い
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 18

![Page Image](https://bcdn.docswell.com/page/LEL94VRRJR.jpg)

アジェンダ
•
Yahoo! JAPANとコンテンツ
•
コンテンツプラットフォームでのSpringの採用事例
•
既存システムの課題と新システムの設計
•
システム概要と詳細
•
良かったこと、悪かったこと
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 19

![Page Image](https://bcdn.docswell.com/page/4JMZKGRPEW.jpg)

システム構成
入稿サービス
解析処理
入稿API
データ保存
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
旧PF
レガシーアダプタ
参照サービス
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 20

![Page Image](https://bcdn.docswell.com/page/PJR6XZRY79.jpg)

システム構成
入稿サービス
入稿API
非同期
データ受付
確認
データ保存
入稿データ
（MySQL）
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 21

![Page Image](https://bcdn.docswell.com/page/PEXM69R47X.jpg)

システム構成
解析処理
解析
入稿データ
（MySQL）
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 22

![Page Image](https://bcdn.docswell.com/page/3EKG1PRPJD.jpg)

システム構成
データ保存
データ保存
更新通知
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
参照サービス
処理済みデータ
（Cassandra）


# Page. 23

![Page Image](https://bcdn.docswell.com/page/L73NQX8475.jpg)

システム構成
ストレージに保存
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 24

![Page Image](https://bcdn.docswell.com/page/87DW92M5JG.jpg)

システム構成
入稿API
フォーマット変換
旧PF
レガシーアダプタ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 25

![Page Image](https://bcdn.docswell.com/page/VJP9Z1RDE8.jpg)

システム構成補足
• 現在約20サービスほど
• オンプレ環境に構築したPivotal Cloud Foundry上で稼働
• Spring Bootと一部Node.js
• 非同期部分はPulsarとSpring Cloud Stream
• MySQL、Cassandra、内製のS3互換ストレージ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 26

![Page Image](https://bcdn.docswell.com/page/2EVMWYRGEQ.jpg)

Pivotal Cloud Foundry
• Pivotal社製のCloud Foundry
• PaaS
• コマンド1つでアプリケーションが立ち上がる
$ cf push -p build/libs/hoge-1.0.0.jar
数分後
https://hoge.XXXX.yahoo.co.jp/
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 27

![Page Image](https://bcdn.docswell.com/page/57GGD96D7L.jpg)

Pivotal Cloud Foundry
Spring Boot Actuator連携
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 28

![Page Image](https://bcdn.docswell.com/page/4EQX1W4X7P.jpg)

Apache Pulsar
• Pub-Subメッセージングシステム
• Yahoo! Inc.製で今はApache Incubator
• 特徴
•
高パフォーマンス、高スケーラビリティ
•
マルチテナント
•
複数DC間でのレプリケーション
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 29

![Page Image](https://bcdn.docswell.com/page/KJ46RKQ271.jpg)

Spring Cloud Stream
• Springでメッセージングシステムを使うフレームワーク
• 公式ではRabbitMQとKafkaをサポート
•
Pulsarは公式ではサポートされていないので内製対応
Producer
Message Broker
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Consumer


# Page. 30

![Page Image](https://bcdn.docswell.com/page/LE1VQXPK7G.jpg)

Source / Processor / Sink
Processor
Source
binder
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Sink


# Page. 31

![Page Image](https://bcdn.docswell.com/page/GEWLMN2P72.jpg)

Source / Processor / Sink
入稿サービス
解析処理
入稿API
データ保存
Processor
Source
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
旧PF
レガシーアダプタ
参照サービス
Sink
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 32

![Page Image](https://bcdn.docswell.com/page/47ZMQ3D6E3.jpg)

依存の追加
ext {
springCloudVersion = &#039;Dalston.SR4&#039;
使うbrokerのものを指定
}
dependencies {
compile(&#039;org.springframework.cloud:spring-cloud-starter-stream-rabbit&#039;)
compile(&#039;org.springframework.boot:spring-boot-starter-web&#039;)
compile(&#039;org.springframework.boot:spring-boot-starter-actuator&#039;)
testCompile(&#039;org.springframework.boot:spring-boot-starter-test&#039;)
}
dependencyManagement {
その他はお好みで
imports {
mavenBom &quot;org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}&quot;
}
}
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 33

![Page Image](https://bcdn.docswell.com/page/YJ6N6X1LJV.jpg)

依存の追加
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
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 34

![Page Image](https://bcdn.docswell.com/page/GJ556X4MJ4.jpg)

Sourceの実装
@SpringBootApplication
@RestController
public class SourceDemoApplication {
@PostMapping
public void send(@RequestBody Map&lt;String, String&gt; message) {
// ここに送信する処理を書く
}
}
public static void main(String[] args) { 〜略〜 }
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 35

![Page Image](https://bcdn.docswell.com/page/LE3NQXG9E5.jpg)

Sourceの実装
@SpringBootApplication
@RestController
@EnableBinding(Source.class)
public class SourceDemoApplication {
@PostMapping
public void send(@RequestBody Map&lt;String, String&gt; message) {
// ここに送信する処理を書く アノテーションを追加
}
}
public static void main(String[] args) { 〜略〜 }
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 36

![Page Image](https://bcdn.docswell.com/page/8EDW92187G.jpg)

Sourceの実装
@SpringBootApplication
@RestController
@EnableBinding(Source.class)
public class SourceDemoApplication {
@Autowired
private Source source;
@PostMapping
public void send(@RequestBody Map&lt;String, String&gt; message) {
// ここに送信する処理を書く
インジェクション
}
}
public static void main(String[] args) { 〜略〜 }
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 37

![Page Image](https://bcdn.docswell.com/page/V7P9Z1QWJ8.jpg)

Sourceの実装
@SpringBootApplication
@RestController
@EnableBinding(Source.class)
public class SourceDemoApplication {
@Autowired
private Source source;
送信処理
@PostMapping
public void send(@RequestBody Map&lt;String, String&gt; message) {
source.output().send(MessageBuilder.withPayload(message).build());
}
}
public static void main(String[] args) { 〜略〜 }
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 38

![Page Image](https://bcdn.docswell.com/page/2JVMWY59JQ.jpg)

Sourceの設定
spring.rabbitmq.addresses=localhost:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
broker固有の設定
spring.cloud.stream.bindings.output.destination=foo_topic
spring.cloud.stream.bindings.output.contentType=application/json
binderの設定
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 39

![Page Image](https://bcdn.docswell.com/page/5EGGD964EL.jpg)

broker固有の設定
spring.rabbitmq.addresses=localhost:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
RabbitMQの例
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
Kafkaの例
spring.cloud.stream.pulsar.binder.clusterUrl=pulsar://localhost:6650
Pulsarの例(イメージ)
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 40

![Page Image](https://bcdn.docswell.com/page/4JQX1W4REP.jpg)

Source側のbinderの設定
送信先トピック
spring.cloud.stream.bindings.output.destination=foo_topic
メッセージのシリアライズ方法
spring.cloud.stream.bindings.output.contentType=application/json
JSONがオススメ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 41

![Page Image](https://bcdn.docswell.com/page/K746RKQQE1.jpg)

Sinkの実装
@SpringBootApplication
public class SinkDemoApplication {
public void receive(Map&lt;String, String&gt; data) {
// ここに受信したメッセージの処理を書く
}
}
public static void main(String[] args) { 〜略〜 }
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 42

![Page Image](https://bcdn.docswell.com/page/LJ1VQXPLEG.jpg)

Sinkの実装
@SpringBootApplication
@EnableBinding(Sink.class)
public class SinkDemoApplication {
public void receive(Map&lt;String, String&gt; data) {
// ここに受信したメッセージの処理を書く
アノテーションを追加
}
}
public static void main(String[] args) { 〜略〜 }
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 43

![Page Image](https://bcdn.docswell.com/page/GJWLMN2QE2.jpg)

Sinkの実装
@SpringBootApplication
@EnableBinding(Sink.class)
public class SinkDemoApplication {
@StreamListener(Sink.INPUT)
public void receive(Map&lt;String, String&gt; data) {
// ここに受信したメッセージの処理を書く
}
}
public static void main(String[]アノテーションを追加
args) { 〜略〜 }
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 44

![Page Image](https://bcdn.docswell.com/page/4EZMQ3D3J3.jpg)

Sinkの実装
@SpringBootApplication
@EnableBinding(Sink.class)
public class SinkDemoApplication {
@StreamListener(Sink.INPUT)
public void receive(Map&lt;String, String&gt; data) {
System.out.println(&quot;Received : &quot; + data.toString());
}
}
public static void main(String[] args) { 〜略〜 }
処理を書く
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 45

![Page Image](https://bcdn.docswell.com/page/Y76N6X1Z7V.jpg)

Sinkの設定
spring.rabbitmq.addresses=localhost:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
broker固有の設定
spring.cloud.stream.bindings.input.destination=foo_topic
spring.cloud.stream.bindings.input.group=bar_group
binderの設定
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 46

![Page Image](https://bcdn.docswell.com/page/G7556X4974.jpg)

Sink側のbinderの設定
受信トピック
spring.cloud.stream.bindings.input.destination=foo_topic
ConsumerGroup名
spring.cloud.stream.bindings.input.group=bar_group
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 47

![Page Image](https://bcdn.docswell.com/page/9J2NMXV5ER.jpg)

ConsumerGroup
設定しない場合はそれぞれに同じメッセージが届く
AAA
BBB
CCC
AAA
BBB
CCC
AAA
BBB
CCC
AAA
BBB
CCC
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 48

![Page Image](https://bcdn.docswell.com/page/DEYPX836EM.jpg)

ConsumerGroup
設定した場合はグループ内のどれか1つにだけメッセージが届く
AAA
BBB
CCC
AAA
BBB
CCC
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 49

![Page Image](https://bcdn.docswell.com/page/VJN51QK178.jpg)

メリット
• 抽象化されているのでロジックに集中できる
•
違うbrokerに乗り換える場合は設定の差し替え程度で済む
• Springの他の機能との連携
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 50

![Page Image](https://bcdn.docswell.com/page/YE9Y5DVYJ3.jpg)

Spring Boot Actuator連携
接続先のbrokerのヘルスチェック
{
&quot;status&quot;: &quot;UP&quot;,
〜中略〜
&quot;rabbit&quot;: {
&quot;status&quot;: &quot;UP&quot;,
&quot;version&quot;: &quot;3.6.12&quot;
},
&quot;binders&quot;: {
&quot;status&quot;: &quot;UP&quot;,
&quot;rabbit&quot;: {
&quot;status&quot;: &quot;UP&quot;,
&quot;binderHealthIndicator&quot;: {
&quot;status&quot;: &quot;UP&quot;,
&quot;version&quot;: &quot;3.6.12&quot;
}
}
}
}
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 51

![Page Image](https://bcdn.docswell.com/page/GE86Y3PK7D.jpg)

Spring Cloud Streamのテスト
• テストツールが提供されている
• spring-cloud-stream-test-support
Sourceテストコード
assert
Sinkテストコード
モック
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
assert


# Page. 52

![Page Image](https://bcdn.docswell.com/page/LEL94V1PJR.jpg)

実装後に出てきた課題
• 処理の流れがわかりにくい
• 想定よりスループットが出ない
• エラー時の処理
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 53

![Page Image](https://bcdn.docswell.com/page/4JMZKGW2EW.jpg)

処理の流れがわかりにくい
• マイクロサービスの処理の流れはわかりにくい
• どこでエラーが起きたのか？
• どこがボトルネックになっているのか？
？
エラー！
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 54

![Page Image](https://bcdn.docswell.com/page/PJR6XZY579.jpg)

Spring Cloud Sleuth
リクエストにトレース用のユニークなIDを付与する
ID発行 abc
abc
X-B3-TraceId: abc
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
abc


# Page. 55

![Page Image](https://bcdn.docswell.com/page/PEXM69GX7X.jpg)

Spring Cloud Sleuth
• 自動で追跡用のIDが発行・付与
• 自動でログにも出力
• トラブル時はTraceIDで検索すればOK
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 56

![Page Image](https://bcdn.docswell.com/page/3EKG1P49JD.jpg)

Zipkin
TraceIDを可視化するツール
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 57

![Page Image](https://bcdn.docswell.com/page/L73NQXL975.jpg)

Zipkin
入稿サービス
解析処理
入稿API
データ保存
参照サービス
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
Zipkin
旧PF
レガシーアダプタ
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 58

![Page Image](https://bcdn.docswell.com/page/87DW92N8JG.jpg)

Zipkin
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 59

![Page Image](https://bcdn.docswell.com/page/VJP9Z15WE8.jpg)

Zipkin
入稿サービス
解析処理
入稿API
データ保存
参照サービス
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
①
旧PF
レガシーアダプタ
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 60

![Page Image](https://bcdn.docswell.com/page/2EVMWYP9EQ.jpg)

Zipkin
①
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 61

![Page Image](https://bcdn.docswell.com/page/57GGD9P47L.jpg)

Zipkin
入稿サービス
解析処理
入稿API
データ保存
参照サービス
②
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
①
旧PF
レガシーアダプタ
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 62

![Page Image](https://bcdn.docswell.com/page/4EQX1W2R7P.jpg)

Zipkin
①
②
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 63

![Page Image](https://bcdn.docswell.com/page/KJ46RKLQ71.jpg)

Zipkin
入稿サービス
②
解析処理
入稿API
データ保存
参照サービス
③
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
①
旧PF
レガシーアダプタ
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 64

![Page Image](https://bcdn.docswell.com/page/LE1VQXLL7G.jpg)

Zipkin
①
②
同期処理終了
③
続きがある
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 65

![Page Image](https://bcdn.docswell.com/page/GEWLMNVQ72.jpg)

Zipkin
入稿サービス
②
解析処理
入稿API
データ保存
参照サービス
④
③
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
①
旧PF
レガシーアダプタ
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 66

![Page Image](https://bcdn.docswell.com/page/47ZMQ343E3.jpg)

Zipkin
①
②
③
④
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 67

![Page Image](https://bcdn.docswell.com/page/YJ6N6X3ZJV.jpg)

Zipkin
入稿サービス
②
解析処理
入稿API
データ保存
④
③
入稿データ
（MySQL）
参照サービス
⑤
⑥
処理済みデータ
（Cassandra）
①
旧PF
レガシーアダプタ
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 68

![Page Image](https://bcdn.docswell.com/page/GJ556XL9J4.jpg)

Zipkin
①
②
③
④
⑤
⑥
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 69

![Page Image](https://bcdn.docswell.com/page/9E2NMXL57R.jpg)

想定よりスループットが出ない
• 負荷テストしてみたら非同期部分が遅い
• Sinkの同時処理数が1だった・・・
必ず設定する
spring.cloud.stream.bindings.input.consumer.concurrency=10
デフォルトは1
適度に増やす
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 70

![Page Image](https://bcdn.docswell.com/page/D7YPX8Q67M.jpg)

エラー時の処理
• 処理の途中でエラーになったメッセージが行方不明に
• Pulsarは再送までの時間を設定しないと再送してく
れなかった・・・
• brokerの仕様は把握しておくことが大事
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 71

![Page Image](https://bcdn.docswell.com/page/VEN51Q21J8.jpg)

BCP（事業継続計画）
• 非常災害時でもサービスを継続する必要がある
• 西日本と東日本のDCに分散構築
西日本クラスタ
東日本クラスタ
GSLB
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 72

![Page Image](https://bcdn.docswell.com/page/Y79Y5D1YE3.jpg)

BCP（事業継続計画）
仮に片方のDCが停止しても問題ないように設計
西日本
MySQL
東日本
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 73

![Page Image](https://bcdn.docswell.com/page/G786Y34KJD.jpg)

BCP（事業継続計画）
仮に片方のDCが停止しても問題ないように設計
GSLB
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 74

![Page Image](https://bcdn.docswell.com/page/L7L94V6PER.jpg)

BCP（事業継続計画）
仮に片方のDCが停止しても問題ないように設計
MySQL
GSLB
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 75

![Page Image](https://bcdn.docswell.com/page/4EMZKG527W.jpg)

BCP（事業継続計画）
仮に片方のDCが停止しても問題ないように設計
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 76

![Page Image](https://bcdn.docswell.com/page/PER6XZ35J9.jpg)

BCP（事業継続計画）
仮に片方のDCが停止しても問題ないように設計
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 77

![Page Image](https://bcdn.docswell.com/page/P7XM694XJX.jpg)

BCP（事業継続計画）
仮に片方のDCが停止しても問題ないように設計
MySQL
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 78

![Page Image](https://bcdn.docswell.com/page/37KG1PZ9ED.jpg)

BCP（事業継続計画）
仮に片方のDCが停止しても問題ないように設計
MySQL
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 79

![Page Image](https://bcdn.docswell.com/page/LJ3NQXD9J5.jpg)

利用サービス例
• Yahoo! JAPANアプリ
•
ニュースフィード部分などで利用
•
Vespaでコンテンツのレコメンデーション
更新検知&amp;
データ取得
インデックス
更新
更新通知
更新処理
Index
アプリBE
コンテンツ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 80

![Page Image](https://bcdn.docswell.com/page/8JDW92P8EG.jpg)

アジェンダ
•
Yahoo! JAPANとコンテンツ
•
コンテンツプラットフォームでのSpringの採用事例
•
既存システムの課題と新システムの設計
•
システム概要と詳細
•
良かったこと、悪かったこと
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 81

![Page Image](https://bcdn.docswell.com/page/VEP9Z1NW78.jpg)

Java/Springで良かったこと
• フルスタックで機能も豊富なのでロジックに集中できる
• マイクロサービスに必要なものが揃っている
• テストコードが書きやすい
•
Mockito
•
MockRestServiceServer
•
REST Assured
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 82

![Page Image](https://bcdn.docswell.com/page/27VMWYK97Q.jpg)

非同期部分は機能拡張が簡単
購読を増やすだけなので既存システムへの影響は少ない
・・・
・・・
既存アプリケーション
・・・
この線を増やせばOK
追加アプリケーション
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 83

![Page Image](https://bcdn.docswell.com/page/5JGGD9Q4JL.jpg)

非同期部分は機能拡張が簡単
入稿サービス
解析処理
入稿API
データ保存
参照サービス
処理済みデータ
（Cassandra）
入稿データ
（MySQL）
実は後から追加
旧PF
レガシーアダプタ
バッチ処理用
データ保存
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
ストレージ
Hadoop


# Page. 84

![Page Image](https://bcdn.docswell.com/page/47QX1WKRJP.jpg)

1つの機能がシンプル
• 機能が小分けになっているので実装がシンプルに
•
APIやメッセージを挟んでいるので疎結合
•
修正やレビューは見る範囲が狭い方が良い
🔥
数万行
☀
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
数百〜数千行


# Page. 85

![Page Image](https://bcdn.docswell.com/page/KE46RKPQJ1.jpg)

1つの機能がシンプル
• 複数人での並行開発も容易
• コンフリクトも起こりにくい
コンフリクト地獄
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
☀


# Page. 86

![Page Image](https://bcdn.docswell.com/page/L71VQX9LJG.jpg)

新たな課題
• メモリの使用量が他の言語に比べ多め
• マイクロサービスの管理が大変
• 便利なソリューションも提供されているが・・・
• 依存ライブラリのバージョンを上げるのも一苦労
• 開発メンバーが少ないのも要因の1つ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 87

![Page Image](https://bcdn.docswell.com/page/G7WLMNQQJ2.jpg)

今後の展望
• Kotlinの検討
• マイクロサービス系のツールのさらなる導入
• 検証が追いつかず導入を見送ったものがいくつかある
• 新しく増えたものも随時検討
•
Spring Cloud Skipperなど
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 88

![Page Image](https://bcdn.docswell.com/page/4JZMQ3W373.jpg)

まとめ
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 89

![Page Image](https://bcdn.docswell.com/page/YE6N6XGZEV.jpg)

まとめ
• 既存システムの課題がSpringとマイクロサービスで
大きく改善できた
• マイクロサービスをやるならSpring Cloud Stream
が便利
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


# Page. 90

![Page Image](https://bcdn.docswell.com/page/GE556XV9E4.jpg)

Javaエンジニア
積極採⽤中！！
ヤフー 採用
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.


