More Related Content Similar to Spring で実現する SmartNews のニュース配信基盤 (20) More from SmartNews, Inc. (16) Spring で実現する SmartNews のニュース配信基盤8. 自己紹介
名前
井口 貝 (いのくち かい)
@kainoque
担当
サーバサイドエンジニア @ SmartNews, Inc.
ニュース配信基盤および管理コンソールの開発を担当
ref: SmartNews, Inc. | Team
http://about.smartnews.com/ja/team/
8
9. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
9
10. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
10
14. - バックエンド
- 収集 各種クローラーお
よび記事 inventory /
index 生成
- 分析 記事分析
- オンライン
- 検索 記事の検索エンジ
ンおよびランキングシステ
ム
- 配信 自動スケールする
フロントエンド向け API
分析
収集検索
配信
SmartNews のニュース配信基盤
14
15. - SmartNews のニュース配信基盤のご紹介
- 収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
15
16. Crawler
- 各ニュースソース (Web, SNS, SmartFormat endpoint) から記事を収集
- SmartFormat: SmartNews が策定している、RSS を拡張した、ニュース配信のための仕様
SmartNews のニュース配信基盤: 収集
16
17. Crawler
- 収集した記事に加え、 Web/SNS 上のシグナルを用いて以下の情報を分析する
- ポピュラリティ (注目度) 分析
- SNS のソーシャルグラフ、公開情報に基づいた 国籍 / 言語判定
- 一部の Crawler では Google Vision API を利用したクエリが可能
SmartNews のニュース配信基盤: 収集
17
19. Importer
- Indexer から受け取った記事および meta 情報を transform / filter し index 情報を生成
- index 情報を検索エンジン (CloudSearch) へ書き込み
- 200,000 articles / day を処理
SmartNews のニュース配信基盤: 収集
19
20. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
20
22. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
22
26. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
26
29. SmartNews のニュース配信基盤: 配信
Push
- Push 配信候補の選定
- アルゴリズムにより決定
- ユーザごとに、記事購読状況により
- 編成を自動的に変更
- Push 配信対象ユーザの選定
- Push 送信
- 定時で全てのユーザにほぼ遅延なく送信
- 定時通知, 号外通知時によるスケール
29
30. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
30
31. - Datadog
- 各種 metrics の監視、可視化
- NewRelic
- 各種 performance を監視する APM
- Runscope
- 各種 API の外形監視 / E2E
- PagerDuty
- Datadog / Runscope と連携した Alert 用 SaaS
SmartNews のニュース配信基盤:監視
31
43. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
43
45. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
45
47. 旧基盤の役割
- 記事の収集基盤
- 各種 Cralwer
- 記事の分析基盤
- Crawler が収集した記事を分析
- オンメモリの記事データベース
- 分散ノードごとに、記事とそのメタ情報をオンメモリで保持
- RMI によるノード間の協調動作
- 記事検索エンジン API
- オンメモリのデータベースから記事を検索
現在のニュース配信基盤の各サービスが、 一つのサービスとして 開発・運用されていた
サービスの分割と Spring の導入
47
48. 旧基盤の問題点
- 機能追加、修正が非常に行いづらい
- index を一つ追加するのにも一苦労
- 柔軟な検索が実現できない
- 多様なユーザ体験を実現できない
- トラブルシューティングが職人芸化
- スケールさせずらい
- 開発者がビジネスロジックのみに集中できない
- 非サーバサイドエンジニアの開発効率が向上しない
ユーザに価値を届け続けるため、これらを解決する必要があった
徐々に分割は進んでいったが、根本的な基盤はモノリシックなままだった
サービスの分割と Spring の導入
48
49. サービスの分割と Spring (Spring Boot) の導入 (2015/05 ~)
- サービスを分割することで、個々に集中が出来る
- Spring Boot を導入することで以下が実現できると考えた
- 高い開発効率
- シンプルなインフラ・ミドルウェア構成
- 高度な周辺エコシステムの恩恵
開発者が本質的な開発作業に集中でき、結果としてサービスの価値をより高めることが
できるという判断で導入
サービスの分割と Spring の導入
49
50. 高い開発効率
- Spring Boot による Java-based Configuration で XML 地獄からの脱却
- Spring MVC で RESTFul API endpoint を手軽に作成可能
- SpringFox/Swagger による API 仕様の周知、可視化
サービスの分割と Spring の導入
50
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
55. - サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
ニュース配信基盤における Spring の活用
55
56. サービス間の連携
- オンラインのサービスは Spring MVC による RESTful API を利用して通信
- バックエンドのサービスは基本的に Kinesis を介して連携するが、管理用に Web
API が存在
- spring-boot-starter-web を依存に追加することで Annotation ベースで簡単に
API を追加可能
56
57. Swagger による仕様の可視化
- API 仕様を自動的に読み込み、可視化・構造化するツール群
- Spring-Boot では、SpringFox とともに利用する
- springfox-swagger2
- springfox-swagger-ui
- これらを用いると、Swagger に対応したサービス以下が有効になる
- 自動生成された API 一覧
- それらのパラメタおよびレスポンス形式の可視化
- その場でリクエスト・レスポンスを試せる UI
サービス間の連携
ref: Swagger
http://swagger.io/
57
59. - Swagger の API 仕様から、それらのサービスの Client Library の自動生成を実
現
- 各サービス間でクライアントを自作する必要がない
- 現行仕様に正しく追従するクライアントライブラリ
- swagger-codegen を fork し、自動生成プログラムを利用
サービス間の連携
ref: swagger-codegen
https://github.com/swagger-api/swagger-cod
egen
59
60. - サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
ニュース配信基盤における Spring の活用
60
61. バッチ処理
Push や Crawler の一部にも Spring Boot を利用
- 定時起動やタスク間の依存関係などを解決するため @Scheduled / Spring
Batch を利用
- Web API と同一フレームワークなので開発効率が良い
- バッチプログラムの管理画面も、Spring Boot で手軽に作成している
61
62. - サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
ニュース配信基盤における Spring の活用
62
63. 監視
Spring Boot Admin を利用したお手軽な
Service Discovery
- 紐付いた Spring Boot サービスの一
覧、メトリクスの確認、設定変更が可
能
- オンラインで設定変更 (KV の注入、ログ
レベルの変更) などができる
- spring-boot-admin-starter-client
を依存に追加し、application.yml で
Admin の endpoint を設定
63
67. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
67
68. デプロイ / プロビジョニング
- executable fat jar 構成を採用し java -jar でサービスを起動
- シンプルなプロビジョニング
- nginx + java -jar (with supervisord)
- シンプルなデプロイ
- Deploy は CI でビルドした jar をダウンロードして起動
- GitHub で push 後に CircleCI/Jenkins + CodeDeploy で自動テスト、自動デプロイ
68
69. - SmartNews のニュース配信基盤のご紹介
- 記事収集
- 分析
- 検索
- 配信
- 監視
- ニュース配信基盤における Spring の活用
- サービスの分割と Spring の導入
- サービス間の連携
- バッチ処理
- 監視
- デプロイ / プロビジョニング
- 生産性向上
アジェンダ
69
72. 共通処理の intercepter (AOP)
- 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor
- org.aopalliance.intercept.MethodInterceptor を継承したクラスで invoke を実装
生産性向上
72
74. 共通処理の intercepter (AOP)
- 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor
- Spring の Bean 生成時に、Interceptor を織り込んだ、キャッシュ対象のサービスの Proxy を生成して返
す
- これらがすべてコードで書ける
生産性向上
74
75. 生産性向上
Spring の DI コンテナを活用した柔軟なクエリ設定変更
- Spring Framework 上に、薄い検索 Framework を構築
- Search における CloudSearch への各種問い合わせロジックを DI コンテナに登録
- 外部からのパラメタで振る舞いを変更可能
- A/B テストやアドホックな記事取得に利用
75
76. Spring Boot with Kotlin
- Crawler 一部のなどは Java でなく Kotlin で書かれている
- 近年注目を集めている JetBrains 社が開発する JVM 言語
- Android での利用が注目されているが SmartNews では一部 Spring Boot アプリの開発で Kotlin
を使っている
- kotlin-stdlib を依存に追加
生産性向上
76
79. SmartNews におけるニュース配信基盤をご紹介しました
- 250 万人以上のユーザへ 5 万件以上の記事を配信
- 記事の収集、分析、検索、配信を実現
- バックエンド、オンラインの構成で、各処理がサービスに分かれている
サービスが進化する過程でニュース配信基盤の大部分が Spring (Spring Boot) に移
行していきました
- サービス間の連携やバッチ処理に役立っています
- 運用・監視にも恩恵がありました
- 生産性、開発速度が向上し、ユーザにより価値を届けられるようになりました
- 技術的な挑戦もしやすい環境を整えられました
おわりに
79