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