Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Spring で実現する
SmartNews のニュース配信基盤
井口 貝 (@kainoque)
SmartNews, Inc.
Spring Day 2016
はじめに
2
SmartNews におけるニュース配信基盤の紹介と、そこで利用されている Spring の技
術について紹介します。
セッションを通じて、Spring のメリットや知見などが共有できれば幸いです。
はじめに
3
SmartNews とは
4
SmartNews のご紹介
5
6
自己紹介
7
自己紹介
名前
井口 貝 (いのくち かい)
@kainoque
担当
  サーバサイドエンジニア @ SmartNews, Inc.
ニュース配信基盤および管理コンソールの開発を担当
ref: SmartNews, Inc. | Team
h...
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
SmartNews のニュース配信基盤
11
ユーザにニュース記事を配信するための基盤
- 毎日、250 万人以上のユーザへ
5 万件以上の記事を配信
一日 4 回 (朝、昼、夕、夜) の定時 Push 通知
- Push 通知を許可していただいた全てのユーザに
通知を送信
- 重要なニュ...
SmartNews のニュース配信基盤
監視 分析
収集検索配信
13
- バックエンド
- 収集 各種クローラーお
よび記事 inventory /
index 生成
- 分析 記事分析
- オンライン
- 検索 記事の検索エンジ
ンおよびランキングシステ
ム
- 配信 自動スケールする
フロントエンド向け AP...
- SmartNews のニュース配信基盤のご紹介
- 収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視...
Crawler
- 各ニュースソース (Web, SNS, SmartFormat endpoint) から記事を収集
- SmartFormat: SmartNews が策定している、RSS を拡張した、ニュース配信のための仕様
SmartN...
Crawler
- 収集した記事に加え、 Web/SNS 上のシグナルを用いて以下の情報を分析する
- ポピュラリティ (注目度) 分析
- SNS のソーシャルグラフ、公開情報に基づいた 国籍 / 言語判定
- 一部の Crawler では ...
Indexer
- Crawler から受け取った記事から記事リスト (inventory) を生成
- 分散 KVS へ書き込み
- 記事分析エンジンに Kinesis 経由で分析を依頼し、分析結果を各種メタ情報と merge して
inve...
Importer
- Indexer から受け取った記事および meta 情報を transform / filter し index 情報を生成
- index 情報を検索エンジン (CloudSearch) へ書き込み
- 200,000 ...
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
Analyzer
- Indexer から受け取った記事を分析
- 機械学習による記事の カテゴリ判定
- スポーツ、エンタメ、政治、など
- 固有表現抽出
- 人名、地名、組織名、日付、時間など
- その他にも、画像の主題抽出、品質判定を行う...
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
Search
- CloudSearch をベースとした検索エンジン
- 配信側のリクエスト (チャンネルの指定) を、CloudSearch のクエリに変換し記事を検索する
SmartNews のニュース配信基盤:検索
23
Search
- ユーザの行動情報や記事の注目度をベースにしたアルゴリズムからランキングを生成
- スコアのもととなる情報は、ニア・リアルタイムで集計している
SmartNews のニュース配信基盤:検索
24
SmartNews のニュース配信基盤:検索
Recommend
- ある記事の内容に類似する他の記事を CloudSearch から検索する検索エンジン
- 記事分析結果から得た meta 情報を用いてオンラインで類似度を判定する
25
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
Frontend
- ユーザからのリクエストに対して、購読チャンネルごとに記事リストを配信する
- チャンネルの記事リストを検索エンジンに問い合わせる
- 分散キャッシュを用いた検索エンジンの負荷低減
SmartNews のニュース配信基盤: ...
SmartNews のニュース配信基盤: 配信
Frontend
- リクエスト状況によって台数をスケール
- ピークタイムでスケール
- 号外ニュースを配信前に検知し事前にスケール
- ピークタイムでは、平時の 2 から 4 倍近くのアクセス...
SmartNews のニュース配信基盤: 配信
Push
- Push 配信候補の選定
- アルゴリズムにより決定
- ユーザごとに、記事購読状況により
- 編成を自動的に変更
- Push 配信対象ユーザの選定
- Push 送信
- 定時で...
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
- Datadog
- 各種 metrics の監視、可視化
- NewRelic
- 各種 performance を監視する APM
- Runscope
- 各種 API の外形監視 / E2E
- PagerDuty
- Datadog...
Datadog
SmartNews のニュース配信基盤:監視
32
Datadog
SmartNews のニュース配信基盤:監視
33
Datadog
SmartNews のニュース配信基盤:監視
34
Datadog
SmartNews のニュース配信基盤:監視
35
Datadog
SmartNews のニュース配信基盤:監視
36
NewRelic
フロントエンドの Web サーバだけでなく
engine 側のオフラインバッチ処理も
Non-Web transaction として trace する
SmartNews のニュース配信基盤:監視
37
Runscope
SmartNews のニュース配信基盤:監視
38
Runscope
SmartNews のニュース配信基盤:監視
39
PagerDuty
SmartNews のニュース配信基盤:監視
40
PagerDuty
SmartNews のニュース配信基盤:監視
41
SmartNews のニュース配信基盤
- バックエンドによる記事収集、分析と、オンラインによる検索・配信を担う
- ユーザからのリクエストによりスケールし、安定した記事配信を実現する
- 各種監視 SaaS により、システムの状態を監視してい...
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
ニュース配信基盤における Spring の活用
44
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
ニュース配信基盤の前身として Seasar2 による旧基盤が存在
Frontend
Indexer
Analyzer
Search
Crawler
サービスの分割と Spring の導入
46
旧基盤の役割
- 記事の収集基盤
- 各種 Cralwer
- 記事の分析基盤
- Crawler が収集した記事を分析
- オンメモリの記事データベース
- 分散ノードごとに、記事とそのメタ情報をオンメモリで保持
- RMI によるノード間の...
旧基盤の問題点
- 機能追加、修正が非常に行いづらい
- index を一つ追加するのにも一苦労
- 柔軟な検索が実現できない
- 多様なユーザ体験を実現できない
- トラブルシューティングが職人芸化
- スケールさせずらい
- 開発者がビジネ...
サービスの分割と Spring (Spring Boot) の導入 (2015/05 ~)
- サービスを分割することで、個々に集中が出来る
- Spring Boot を導入することで以下が実現できると考えた
- 高い開発効率
- シンプルな...
高い開発効率
- Spring Boot による Java-based Configuration で XML 地獄からの脱却
- Spring MVC で RESTFul API endpoint を手軽に作成可能
- SpringFox/S...
シンプルなインフラ・ミドルウェア構成
- executable fat jar によるサービス起動
- war とは異なり、別途サーブレットコンテナを用意する必要が無い
- リバースプロキシと Java プロセスのみのシンプルな構成が実現可能
...
高度な周辺エコシステム
- Spring Cloud Config
- Spring Cloud Consul
- Reactor (Spring 5)
サービスの分割と Spring の導入
ref: SpringOne Platform 2...
サービスの分割と Spring の導入
Frontend
Indexer
Analyzer
Search
Crawler
53
サービスの分割と Spring の導入
Analyzer
Crawler
SearchFrontend
IndexerImporter
54
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
ニュース配信基盤における Spring の活用
55
サービス間の連携
- オンラインのサービスは Spring MVC による RESTful API を利用して通信
- バックエンドのサービスは基本的に Kinesis を介して連携するが、管理用に Web
API が存在
- spring-b...
Swagger による仕様の可視化
- API 仕様を自動的に読み込み、可視化・構造化するツール群
- Spring-Boot では、SpringFox とともに利用する
- springfox-swagger2
- springfox-swa...
サービス間の連携
58
- Swagger の API 仕様から、それらのサービスの Client Library の自動生成を実
現
- 各サービス間でクライアントを自作する必要がない
- 現行仕様に正しく追従するクライアントライブラリ
- swagger-code...
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
ニュース配信基盤における Spring の活用
60
バッチ処理
Push や Crawler の一部にも Spring Boot を利用
- 定時起動やタスク間の依存関係などを解決するため @Scheduled / Spring
Batch を利用
- Web API と同一フレームワークなので...
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
ニュース配信基盤における Spring の活用
62
監視
Spring Boot Admin を利用したお手軽な
Service Discovery
- 紐付いた Spring Boot サービスの一
覧、メトリクスの確認、設定変更が可
能
- オンラインで設定変更 (KV の注入、ログ
レベル...
Spring Boot Admin の
metrics 出力例
監視
64
監視
- spring-boot-actuator の充実した機能を利用し、Datadog と連携
- システム状態、VM 状態、API endpoint 毎のリクエスト数、データコネクションなどの監視
- カスタムな metrics の生成が...
- spring-boot-actuator の
metrics 出力例
監視
66
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
デプロイ / プロビジョニング
- executable fat jar 構成を採用し java -jar でサービスを起動
- シンプルなプロビジョニング
- nginx + java -jar (with supervisord)
- シン...
- SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- ...
生産性向上
Controller レイヤの単体テスト
- Runscope での E2E テスト / 外形監視に加えて、一部の endpoint では
MockMvc による 単体テストを行っている
70
71
共通処理の intercepter (AOP)
- 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor
- org.aopalliance.intercept.MethodInterceptor を継承したクラスで ...
73
共通処理の intercepter (AOP)
- 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor
- Spring の Bean 生成時に、Interceptor を織り込んだ、キャッシュ対象のサービスの Pr...
生産性向上
Spring の DI コンテナを活用した柔軟なクエリ設定変更
- Spring Framework 上に、薄い検索 Framework を構築
- Search における CloudSearch への各種問い合わせロジックを DI...
Spring Boot with Kotlin
- Crawler 一部のなどは Java でなく Kotlin で書かれている
- 近年注目を集めている JetBrains 社が開発する JVM 言語
- Android での利用が注目されて...
77
おわりに
78
SmartNews におけるニュース配信基盤をご紹介しました
- 250 万人以上のユーザへ 5 万件以上の記事を配信
- 記事の収集、分析、検索、配信を実現
- バックエンド、オンラインの構成で、各処理がサービスに分かれている
サービスが進化...
http://about.smartnews.com/ja/careers/
We’re hiring!!
Web Application / iOS / Android / SRE / Ad-tech / Machine-learning /...
Prochain SlideShare
Chargement dans…5
×

Spring で実現する SmartNews のニュース配信基盤

2 481 vues

Publié le

Spring Day 2016 での登壇資料です。
"Spring で実現する SmartNews のニュース配信基盤" by 井口 貝 (いのくち かい) @ SmartNews, Inc.

Publié dans : Technologie
  • Soyez le premier à commenter

Spring で実現する SmartNews のニュース配信基盤

  1. 1. Spring で実現する SmartNews のニュース配信基盤 井口 貝 (@kainoque) SmartNews, Inc. Spring Day 2016
  2. 2. はじめに 2
  3. 3. SmartNews におけるニュース配信基盤の紹介と、そこで利用されている Spring の技 術について紹介します。 セッションを通じて、Spring のメリットや知見などが共有できれば幸いです。 はじめに 3
  4. 4. SmartNews とは 4
  5. 5. SmartNews のご紹介 5
  6. 6. 6
  7. 7. 自己紹介 7
  8. 8. 自己紹介 名前 井口 貝 (いのくち かい) @kainoque 担当   サーバサイドエンジニア @ SmartNews, Inc. ニュース配信基盤および管理コンソールの開発を担当 ref: SmartNews, Inc. | Team http://about.smartnews.com/ja/team/ 8
  9. 9. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 9
  10. 10. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 10
  11. 11. SmartNews のニュース配信基盤 11
  12. 12. ユーザにニュース記事を配信するための基盤 - 毎日、250 万人以上のユーザへ 5 万件以上の記事を配信 一日 4 回 (朝、昼、夕、夜) の定時 Push 通知 - Push 通知を許可していただいた全てのユーザに 通知を送信 - 重要なニュースがある場合は号外 Push 通知を送 信 SmartNews のニュース配信基盤 12
  13. 13. SmartNews のニュース配信基盤 監視 分析 収集検索配信 13
  14. 14. - バックエンド - 収集 各種クローラーお よび記事 inventory / index 生成 - 分析 記事分析 - オンライン - 検索 記事の検索エンジ ンおよびランキングシステ ム - 配信 自動スケールする フロントエンド向け API 分析 収集検索 配信 SmartNews のニュース配信基盤 14
  15. 15. - SmartNews のニュース配信基盤のご紹介 - 収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 15
  16. 16. Crawler - 各ニュースソース (Web, SNS, SmartFormat endpoint) から記事を収集 - SmartFormat: SmartNews が策定している、RSS を拡張した、ニュース配信のための仕様 SmartNews のニュース配信基盤: 収集 16
  17. 17. Crawler - 収集した記事に加え、 Web/SNS 上のシグナルを用いて以下の情報を分析する - ポピュラリティ (注目度) 分析 - SNS のソーシャルグラフ、公開情報に基づいた 国籍 / 言語判定 - 一部の Crawler では Google Vision API を利用したクエリが可能 SmartNews のニュース配信基盤: 収集 17
  18. 18. Indexer - Crawler から受け取った記事から記事リスト (inventory) を生成 - 分散 KVS へ書き込み - 記事分析エンジンに Kinesis 経由で分析を依頼し、分析結果を各種メタ情報と merge して inventory に付与する SmartNews のニュース配信基盤: 収集 18
  19. 19. Importer - Indexer から受け取った記事および meta 情報を transform / filter し index 情報を生成 - index 情報を検索エンジン (CloudSearch) へ書き込み - 200,000 articles / day を処理 SmartNews のニュース配信基盤: 収集 19
  20. 20. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 20
  21. 21. Analyzer - Indexer から受け取った記事を分析 - 機械学習による記事の カテゴリ判定 - スポーツ、エンタメ、政治、など - 固有表現抽出 - 人名、地名、組織名、日付、時間など - その他にも、画像の主題抽出、品質判定を行うサービスが別途存在 SmartNews のニュース配信基盤: 分析 21
  22. 22. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 22
  23. 23. Search - CloudSearch をベースとした検索エンジン - 配信側のリクエスト (チャンネルの指定) を、CloudSearch のクエリに変換し記事を検索する SmartNews のニュース配信基盤:検索 23
  24. 24. Search - ユーザの行動情報や記事の注目度をベースにしたアルゴリズムからランキングを生成 - スコアのもととなる情報は、ニア・リアルタイムで集計している SmartNews のニュース配信基盤:検索 24
  25. 25. SmartNews のニュース配信基盤:検索 Recommend - ある記事の内容に類似する他の記事を CloudSearch から検索する検索エンジン - 記事分析結果から得た meta 情報を用いてオンラインで類似度を判定する 25
  26. 26. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 26
  27. 27. Frontend - ユーザからのリクエストに対して、購読チャンネルごとに記事リストを配信する - チャンネルの記事リストを検索エンジンに問い合わせる - 分散キャッシュを用いた検索エンジンの負荷低減 SmartNews のニュース配信基盤: 配信 27
  28. 28. SmartNews のニュース配信基盤: 配信 Frontend - リクエスト状況によって台数をスケール - ピークタイムでスケール - 号外ニュースを配信前に検知し事前にスケール - ピークタイムでは、平時の 2 から 4 倍近くのアクセスがある 28
  29. 29. SmartNews のニュース配信基盤: 配信 Push - Push 配信候補の選定 - アルゴリズムにより決定 - ユーザごとに、記事購読状況により - 編成を自動的に変更 - Push 配信対象ユーザの選定 - Push 送信 - 定時で全てのユーザにほぼ遅延なく送信 - 定時通知, 号外通知時によるスケール 29
  30. 30. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 30
  31. 31. - Datadog - 各種 metrics の監視、可視化 - NewRelic - 各種 performance を監視する APM - Runscope - 各種 API の外形監視 / E2E - PagerDuty - Datadog / Runscope と連携した Alert 用 SaaS SmartNews のニュース配信基盤:監視 31
  32. 32. Datadog SmartNews のニュース配信基盤:監視 32
  33. 33. Datadog SmartNews のニュース配信基盤:監視 33
  34. 34. Datadog SmartNews のニュース配信基盤:監視 34
  35. 35. Datadog SmartNews のニュース配信基盤:監視 35
  36. 36. Datadog SmartNews のニュース配信基盤:監視 36
  37. 37. NewRelic フロントエンドの Web サーバだけでなく engine 側のオフラインバッチ処理も Non-Web transaction として trace する SmartNews のニュース配信基盤:監視 37
  38. 38. Runscope SmartNews のニュース配信基盤:監視 38
  39. 39. Runscope SmartNews のニュース配信基盤:監視 39
  40. 40. PagerDuty SmartNews のニュース配信基盤:監視 40
  41. 41. PagerDuty SmartNews のニュース配信基盤:監視 41
  42. 42. SmartNews のニュース配信基盤 - バックエンドによる記事収集、分析と、オンラインによる検索・配信を担う - ユーザからのリクエストによりスケールし、安定した記事配信を実現する - 各種監視 SaaS により、システムの状態を監視している 42
  43. 43. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 43
  44. 44. ニュース配信基盤における Spring の活用 44
  45. 45. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 45
  46. 46. ニュース配信基盤の前身として Seasar2 による旧基盤が存在 Frontend Indexer Analyzer Search Crawler サービスの分割と Spring の導入 46
  47. 47. 旧基盤の役割 - 記事の収集基盤 - 各種 Cralwer - 記事の分析基盤 - Crawler が収集した記事を分析 - オンメモリの記事データベース - 分散ノードごとに、記事とそのメタ情報をオンメモリで保持 - RMI によるノード間の協調動作 - 記事検索エンジン API - オンメモリのデータベースから記事を検索 現在のニュース配信基盤の各サービスが、 一つのサービスとして 開発・運用されていた サービスの分割と Spring の導入 47
  48. 48. 旧基盤の問題点 - 機能追加、修正が非常に行いづらい - index を一つ追加するのにも一苦労 - 柔軟な検索が実現できない - 多様なユーザ体験を実現できない - トラブルシューティングが職人芸化 - スケールさせずらい - 開発者がビジネスロジックのみに集中できない - 非サーバサイドエンジニアの開発効率が向上しない ユーザに価値を届け続けるため、これらを解決する必要があった 徐々に分割は進んでいったが、根本的な基盤はモノリシックなままだった サービスの分割と Spring の導入 48
  49. 49. サービスの分割と Spring (Spring Boot) の導入 (2015/05 ~) - サービスを分割することで、個々に集中が出来る - Spring Boot を導入することで以下が実現できると考えた - 高い開発効率 - シンプルなインフラ・ミドルウェア構成 - 高度な周辺エコシステムの恩恵 開発者が本質的な開発作業に集中でき、結果としてサービスの価値をより高めることが できるという判断で導入 サービスの分割と Spring の導入 49
  50. 50. 高い開発効率 - Spring Boot による Java-based Configuration で XML 地獄からの脱却 - Spring MVC で RESTFul API endpoint を手軽に作成可能 - SpringFox/Swagger による API 仕様の周知、可視化 サービスの分割と Spring の導入 50
  51. 51. シンプルなインフラ・ミドルウェア構成 - executable fat jar によるサービス起動 - war とは異なり、別途サーブレットコンテナを用意する必要が無い - リバースプロキシと Java プロセスのみのシンプルな構成が実現可能 - コンテナ化とも相性が良い サービスの分割と Spring の導入 51
  52. 52. 高度な周辺エコシステム - Spring Cloud Config - Spring Cloud Consul - Reactor (Spring 5) サービスの分割と Spring の導入 ref: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 http://www.slideshare.net/smartnews/springone-platform-2016-a-lite-rx-api-for-t he-jvm-smartnews-inc 52
  53. 53. サービスの分割と Spring の導入 Frontend Indexer Analyzer Search Crawler 53
  54. 54. サービスの分割と Spring の導入 Analyzer Crawler SearchFrontend IndexerImporter 54
  55. 55. - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 55
  56. 56. サービス間の連携 - オンラインのサービスは Spring MVC による RESTful API を利用して通信 - バックエンドのサービスは基本的に Kinesis を介して連携するが、管理用に Web API が存在 - spring-boot-starter-web を依存に追加することで Annotation ベースで簡単に API を追加可能 56
  57. 57. Swagger による仕様の可視化 - API 仕様を自動的に読み込み、可視化・構造化するツール群 - Spring-Boot では、SpringFox とともに利用する - springfox-swagger2 - springfox-swagger-ui - これらを用いると、Swagger に対応したサービス以下が有効になる - 自動生成された API 一覧 - それらのパラメタおよびレスポンス形式の可視化 - その場でリクエスト・レスポンスを試せる UI サービス間の連携 ref: Swagger http://swagger.io/ 57
  58. 58. サービス間の連携 58
  59. 59. - Swagger の API 仕様から、それらのサービスの Client Library の自動生成を実 現 - 各サービス間でクライアントを自作する必要がない - 現行仕様に正しく追従するクライアントライブラリ - swagger-codegen を fork し、自動生成プログラムを利用 サービス間の連携 ref: swagger-codegen https://github.com/swagger-api/swagger-cod egen 59
  60. 60. - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 60
  61. 61. バッチ処理 Push や Crawler の一部にも Spring Boot を利用 - 定時起動やタスク間の依存関係などを解決するため @Scheduled / Spring Batch を利用 - Web API と同一フレームワークなので開発効率が良い - バッチプログラムの管理画面も、Spring Boot で手軽に作成している 61
  62. 62. - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 62
  63. 63. 監視 Spring Boot Admin を利用したお手軽な Service Discovery - 紐付いた Spring Boot サービスの一 覧、メトリクスの確認、設定変更が可 能 - オンラインで設定変更 (KV の注入、ログ レベルの変更) などができる - spring-boot-admin-starter-client を依存に追加し、application.yml で Admin の endpoint を設定 63
  64. 64. Spring Boot Admin の metrics 出力例 監視 64
  65. 65. 監視 - spring-boot-actuator の充実した機能を利用し、Datadog と連携 - システム状態、VM 状態、API endpoint 毎のリクエスト数、データコネクションなどの監視 - カスタムな metrics の生成が可能 - - JMX での metrics も存在しているが、Spring の機能を利用して、自動・汎用的な 監視が実現 65
  66. 66. - spring-boot-actuator の metrics 出力例 監視 66
  67. 67. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 67
  68. 68. デプロイ / プロビジョニング - executable fat jar 構成を採用し java -jar でサービスを起動 - シンプルなプロビジョニング - nginx + java -jar (with supervisord) - シンプルなデプロイ - Deploy は CI でビルドした jar をダウンロードして起動 - GitHub で push 後に CircleCI/Jenkins + CodeDeploy で自動テスト、自動デプロイ 68
  69. 69. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 - 配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 69
  70. 70. 生産性向上 Controller レイヤの単体テスト - Runscope での E2E テスト / 外形監視に加えて、一部の endpoint では MockMvc による 単体テストを行っている 70
  71. 71. 71
  72. 72. 共通処理の intercepter (AOP) - 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor - org.aopalliance.intercept.MethodInterceptor を継承したクラスで invoke を実装 生産性向上 72
  73. 73. 73
  74. 74. 共通処理の intercepter (AOP) - 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor - Spring の Bean 生成時に、Interceptor を織り込んだ、キャッシュ対象のサービスの Proxy を生成して返 す - これらがすべてコードで書ける 生産性向上 74
  75. 75. 生産性向上 Spring の DI コンテナを活用した柔軟なクエリ設定変更 - Spring Framework 上に、薄い検索 Framework を構築 - Search における CloudSearch への各種問い合わせロジックを DI コンテナに登録 - 外部からのパラメタで振る舞いを変更可能 - A/B テストやアドホックな記事取得に利用 75
  76. 76. Spring Boot with Kotlin - Crawler 一部のなどは Java でなく Kotlin で書かれている - 近年注目を集めている JetBrains 社が開発する JVM 言語 - Android での利用が注目されているが SmartNews では一部 Spring Boot アプリの開発で Kotlin を使っている - kotlin-stdlib を依存に追加 生産性向上 76
  77. 77. 77
  78. 78. おわりに 78
  79. 79. SmartNews におけるニュース配信基盤をご紹介しました - 250 万人以上のユーザへ 5 万件以上の記事を配信 - 記事の収集、分析、検索、配信を実現 - バックエンド、オンラインの構成で、各処理がサービスに分かれている サービスが進化する過程でニュース配信基盤の大部分が Spring (Spring Boot) に移 行していきました - サービス間の連携やバッチ処理に役立っています - 運用・監視にも恩恵がありました - 生産性、開発速度が向上し、ユーザにより価値を届けられるようになりました - 技術的な挑戦もしやすい環境を整えられました おわりに 79
  80. 80. http://about.smartnews.com/ja/careers/ We’re hiring!! Web Application / iOS / Android / SRE / Ad-tech / Machine-learning / NLP

×