Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Spring で実現する SmartNews のニュース配信基盤
Search
kainoque
November 18, 2016
Programming
9
21k
Spring で実現する SmartNews のニュース配信基盤
Spring Day 2016 での登壇資料です。
"Spring で実現する SmartNews のニュース配信基盤" by 井口 貝 (いのくち かい) @ SmartNews, Inc.
kainoque
November 18, 2016
Tweet
Share
More Decks by kainoque
See All by kainoque
SpringOne Platform 2016 報告会 (A Lite Rx API for the JVM)
kainoque
4
520
Other Decks in Programming
See All in Programming
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
Jakarta EE meets AI
ivargrimstad
0
600
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
890
受け取る人から提供する人になるということ
little_rubyist
0
230
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
880
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
610
Tauriでネイティブアプリを作りたい
tsucchinoko
0
370
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
190
Click-free releases & the making of a CLI app
oheyadam
2
110
みんなでプロポーザルを書いてみた
yuriko1211
0
260
どうして僕の作ったクラスが手続き型と言われなきゃいけないんですか
akikogoto
1
120
Featured
See All Featured
What's new in Ruby 2.0
geeforr
343
31k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
Designing Experiences People Love
moore
138
23k
Intergalactic Javascript Robots from Outer Space
tanoku
269
27k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
For a Future-Friendly Web
brad_frost
175
9.4k
Adopting Sorbet at Scale
ufuk
73
9.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Transcript
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 http://about.smartnews.com/ja/team/ 8
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 9
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 10
SmartNews のニュース配信基盤 11
ユーザにニュース記事を配信するための基盤 - 毎日、250 万人以上のユーザへ 5 万件以上の記事を配信 一日 4 回 (朝、昼、夕、夜)
の定時 Push 通知 - Push 通知を許可していただいた全てのユーザに 通知を送信 - 重要なニュースがある場合は号外 Push 通知を送 信 SmartNews のニュース配信基盤 12
SmartNews のニュース配信基盤 監視 分析 収集 検索 配信 13
- バックエンド - 収集 各種クローラーお よび記事 inventory / index 生成 -
分析 記事分析 - オンライン - 検索 記事の検索エンジ ンおよびランキングシステ ム - 配信 自動スケールする フロントエンド向け API 分析 収集 検索 配信 SmartNews のニュース配信基盤 14
- SmartNews のニュース配信基盤のご紹介 - 収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 15
Crawler - 各ニュースソース (Web, SNS, SmartFormat endpoint) から記事を収集 - SmartFormat:
SmartNews が策定している、RSS を拡張した、ニュース配信のための仕様 SmartNews のニュース配信基盤: 収集 16
Crawler - 収集した記事に加え、 Web/SNS 上のシグナルを用いて以下の情報を分析する - ポピュラリティ (注目度) 分析 -
SNS のソーシャルグラフ、公開情報に基づいた 国籍 / 言語判定 - 一部の Crawler では Google Vision API を利用したクエリが可能 SmartNews のニュース配信基盤: 収集 17
Indexer - Crawler から受け取った記事から記事リスト (inventory) を生成 - 分散 KVS へ書き込み
- 記事分析エンジンに Kinesis 経由で分析を依頼し、分析結果を各種メタ情報と merge して inventory に付与する SmartNews のニュース配信基盤: 収集 18
Importer - Indexer から受け取った記事および meta 情報を transform / filter し
index 情報を生成 - index 情報を検索エンジン (CloudSearch) へ書き込み - 200,000 articles / day を処理 SmartNews のニュース配信基盤: 収集 19
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 20
Analyzer - Indexer から受け取った記事を分析 - 機械学習による記事の カテゴリ判定 - スポーツ、エンタメ、政治、など -
固有表現抽出 - 人名、地名、組織名、日付、時間など - その他にも、画像の主題抽出、品質判定を行うサービスが別途存在 SmartNews のニュース配信基盤: 分析 21
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 22
Search - CloudSearch をベースとした検索エンジン - 配信側のリクエスト (チャンネルの指定) を、CloudSearch のクエリに変換し記事を検索する SmartNews
のニュース配信基盤:検索 23
Search - ユーザの行動情報や記事の注目度をベースにしたアルゴリズムからランキングを生成 - スコアのもととなる情報は、ニア・リアルタイムで集計している SmartNews のニュース配信基盤:検索 24
SmartNews のニュース配信基盤:検索 Recommend - ある記事の内容に類似する他の記事を CloudSearch から検索する検索エンジン - 記事分析結果から得た meta
情報を用いてオンラインで類似度を判定する 25
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 26
Frontend - ユーザからのリクエストに対して、購読チャンネルごとに記事リストを配信する - チャンネルの記事リストを検索エンジンに問い合わせる - 分散キャッシュを用いた検索エンジンの負荷低減 SmartNews のニュース配信基盤: 配信
27
SmartNews のニュース配信基盤: 配信 Frontend - リクエスト状況によって台数をスケール - ピークタイムでスケール - 号外ニュースを配信前に検知し事前にスケール
- ピークタイムでは、平時の 2 から 4 倍近くのアクセスがある 28
SmartNews のニュース配信基盤: 配信 Push - Push 配信候補の選定 - アルゴリズムにより決定 -
ユーザごとに、記事購読状況により - 編成を自動的に変更 - Push 配信対象ユーザの選定 - Push 送信 - 定時で全てのユーザにほぼ遅延なく送信 - 定時通知, 号外通知時によるスケール 29
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 30
- Datadog - 各種 metrics の監視、可視化 - NewRelic - 各種
performance を監視する APM - Runscope - 各種 API の外形監視 / E2E - PagerDuty - Datadog / Runscope と連携した Alert 用 SaaS SmartNews のニュース配信基盤:監視 31
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 により、システムの状態を監視している
42
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 43
ニュース配信基盤における Spring の活用 44
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 45
ニュース配信基盤の前身として Seasar2 による旧基盤が存在 Frontend Indexer Analyzer Search Crawler サービスの分割と Spring
の導入 46
旧基盤の役割 - 記事の収集基盤 - 各種 Cralwer - 記事の分析基盤 - Crawler
が収集した記事を分析 - オンメモリの記事データベース - 分散ノードごとに、記事とそのメタ情報をオンメモリで保持 - RMI によるノード間の協調動作 - 記事検索エンジン API - オンメモリのデータベースから記事を検索 現在のニュース配信基盤の各サービスが、 一つのサービスとして 開発・運用されていた サービスの分割と Spring の導入 47
旧基盤の問題点 - 機能追加、修正が非常に行いづらい - index を一つ追加するのにも一苦労 - 柔軟な検索が実現できない - 多様なユーザ体験を実現できない
- トラブルシューティングが職人芸化 - スケールさせずらい - 開発者がビジネスロジックのみに集中できない - 非サーバサイドエンジニアの開発効率が向上しない ユーザに価値を届け続けるため、これらを解決する必要があった 徐々に分割は進んでいったが、根本的な基盤はモノリシックなままだった サービスの分割と Spring の導入 48
サービスの分割と Spring (Spring Boot) の導入 (2015/05 ~) - サービスを分割することで、個々に集中が出来る -
Spring Boot を導入することで以下が実現できると考えた - 高い開発効率 - シンプルなインフラ・ミドルウェア構成 - 高度な周辺エコシステムの恩恵 開発者が本質的な開発作業に集中でき、結果としてサービスの価値をより高めることが できるという判断で導入 サービスの分割と Spring の導入 49
高い開発効率 - Spring Boot による Java-based Configuration で XML 地獄からの脱却
- Spring MVC で RESTFul API endpoint を手軽に作成可能 - SpringFox/Swagger による API 仕様の周知、可視化 サービスの分割と Spring の導入 50
シンプルなインフラ・ミドルウェア構成 - executable fat jar によるサービス起動 - war とは異なり、別途サーブレットコンテナを用意する必要が無い -
リバースプロキシと Java プロセスのみのシンプルな構成が実現可能 - コンテナ化とも相性が良い サービスの分割と Spring の導入 51
高度な周辺エコシステム - 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
サービスの分割と Spring の導入 Frontend Indexer Analyzer Search Crawler 53
サービスの分割と Spring の導入 Analyzer Crawler Search Frontend Indexer Importer 54
- サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視
- デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 55
サービス間の連携 - オンラインのサービスは Spring MVC による RESTful API を利用して通信 -
バックエンドのサービスは基本的に Kinesis を介して連携するが、管理用に Web API が存在 - spring-boot-starter-web を依存に追加することで Annotation ベースで簡単に API を追加可能 56
Swagger による仕様の可視化 - API 仕様を自動的に読み込み、可視化・構造化するツール群 - Spring-Boot では、SpringFox とともに利用する -
springfox-swagger2 - springfox-swagger-ui - これらを用いると、Swagger に対応したサービス以下が有効になる - 自動生成された API 一覧 - それらのパラメタおよびレスポンス形式の可視化 - その場でリクエスト・レスポンスを試せる UI サービス間の連携 ref: Swagger http://swagger.io/ 57
サービス間の連携 58
- Swagger の API 仕様から、それらのサービスの Client Library の自動生成を実 現 -
各サービス間でクライアントを自作する必要がない - 現行仕様に正しく追従するクライアントライブラリ - swagger-codegen を fork し、自動生成プログラムを利用 サービス間の連携 ref: swagger-codegen https://github.com/swagger-api/swagger-cod egen 59
- サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視
- デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 60
バッチ処理 Push や Crawler の一部にも Spring Boot を利用 - 定時起動やタスク間の依存関係などを解決するため
@Scheduled / Spring Batch を利用 - Web API と同一フレームワークなので開発効率が良い - バッチプログラムの管理画面も、Spring Boot で手軽に作成している 61
- サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視
- デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 62
監視 Spring Boot Admin を利用したお手軽な Service Discovery - 紐付いた Spring
Boot サービスの一 覧、メトリクスの確認、設定変更が可 能 - オンラインで設定変更 (KV の注入、ログ レベルの変更) などができる - spring-boot-admin-starter-client を依存に追加し、application.yml で Admin の endpoint を設定 63
Spring Boot Admin の metrics 出力例 監視 64
監視 - spring-boot-actuator の充実した機能を利用し、Datadog と連携 - システム状態、VM 状態、API endpoint 毎のリクエスト数、データコネクションなどの監視
- カスタムな metrics の生成が可能 - - JMX での metrics も存在しているが、Spring の機能を利用して、自動・汎用的な 監視が実現 65
- spring-boot-actuator の metrics 出力例 監視 66
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 67
デプロイ / プロビジョニング - executable fat jar 構成を採用し java -jar
でサービスを起動 - シンプルなプロビジョニング - nginx + java -jar (with supervisord) - シンプルなデプロイ - Deploy は CI でビルドした jar をダウンロードして起動 - GitHub で push 後に CircleCI/Jenkins + CodeDeploy で自動テスト、自動デプロイ 68
- SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -
配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 69
生産性向上 Controller レイヤの単体テスト - Runscope での E2E テスト / 外形監視に加えて、一部の
endpoint では MockMvc による 単体テストを行っている 70
71
共通処理の intercepter (AOP) - 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor - org.aopalliance.intercept.MethodInterceptor を継承したクラスで
invoke を実装 生産性向上 72
73
共通処理の intercepter (AOP) - 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor - Spring の
Bean 生成時に、Interceptor を織り込んだ、キャッシュ対象のサービスの Proxy を生成して返 す - これらがすべてコードで書ける 生産性向上 74
生産性向上 Spring の DI コンテナを活用した柔軟なクエリ設定変更 - Spring Framework 上に、薄い検索 Framework
を構築 - Search における CloudSearch への各種問い合わせロジックを DI コンテナに登録 - 外部からのパラメタで振る舞いを変更可能 - A/B テストやアドホックな記事取得に利用 75
Spring Boot with Kotlin - Crawler 一部のなどは Java でなく Kotlin
で書かれている - 近年注目を集めている JetBrains 社が開発する JVM 言語 - Android での利用が注目されているが SmartNews では一部 Spring Boot アプリの開発で Kotlin を使っている - kotlin-stdlib を依存に追加 生産性向上 76
77
おわりに 78
SmartNews におけるニュース配信基盤をご紹介しました - 250 万人以上のユーザへ 5 万件以上の記事を配信 - 記事の収集、分析、検索、配信を実現 -
バックエンド、オンラインの構成で、各処理がサービスに分かれている サービスが進化する過程でニュース配信基盤の大部分が Spring (Spring Boot) に移 行していきました - サービス間の連携やバッチ処理に役立っています - 運用・監視にも恩恵がありました - 生産性、開発速度が向上し、ユーザにより価値を届けられるようになりました - 技術的な挑戦もしやすい環境を整えられました おわりに 79
http://about.smartnews.com/ja/careers/ We’re hiring!! Web Application / iOS / Android /
SRE / Ad-tech / Machine-learning / NLP