Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for kainoque kainoque
November 18, 2016

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

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

Avatar for kainoque

kainoque

November 18, 2016
Tweet

More Decks by kainoque

Other Decks in Programming

Transcript

  1. 6

  2. 自己紹介 名前 井口 貝 (いのくち かい) @kainoque 担当   サーバサイドエンジニア @

    SmartNews, Inc. ニュース配信基盤および管理コンソールの開発を担当 ref: SmartNews, Inc. | Team http://about.smartnews.com/ja/team/ 8
  3. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 9
  4. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 10
  5. ユーザにニュース記事を配信するための基盤 - 毎日、250 万人以上のユーザへ 5 万件以上の記事を配信 一日 4 回 (朝、昼、夕、夜)

    の定時 Push 通知 - Push 通知を許可していただいた全てのユーザに 通知を送信 - 重要なニュースがある場合は号外 Push 通知を送 信 SmartNews のニュース配信基盤 12
  6. - バックエンド - 収集 各種クローラーお よび記事 inventory / index 生成 -

    分析 記事分析 - オンライン - 検索 記事の検索エンジ ンおよびランキングシステ ム - 配信 自動スケールする フロントエンド向け API 分析 収集 検索 配信 SmartNews のニュース配信基盤 14
  7. - SmartNews のニュース配信基盤のご紹介 - 収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 15
  8. Crawler - 各ニュースソース (Web, SNS, SmartFormat endpoint) から記事を収集 - SmartFormat:

    SmartNews が策定している、RSS を拡張した、ニュース配信のための仕様 SmartNews のニュース配信基盤: 収集 16
  9. Crawler - 収集した記事に加え、 Web/SNS 上のシグナルを用いて以下の情報を分析する - ポピュラリティ (注目度) 分析 -

    SNS のソーシャルグラフ、公開情報に基づいた 国籍 / 言語判定 - 一部の Crawler では Google Vision API を利用したクエリが可能 SmartNews のニュース配信基盤: 収集 17
  10. Indexer - Crawler から受け取った記事から記事リスト (inventory) を生成 - 分散 KVS へ書き込み

    - 記事分析エンジンに Kinesis 経由で分析を依頼し、分析結果を各種メタ情報と merge して inventory に付与する SmartNews のニュース配信基盤: 収集 18
  11. Importer - Indexer から受け取った記事および meta 情報を transform / filter し

    index 情報を生成 - index 情報を検索エンジン (CloudSearch) へ書き込み - 200,000 articles / day を処理 SmartNews のニュース配信基盤: 収集 19
  12. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 20
  13. Analyzer - Indexer から受け取った記事を分析 - 機械学習による記事の カテゴリ判定 - スポーツ、エンタメ、政治、など -

    固有表現抽出 - 人名、地名、組織名、日付、時間など - その他にも、画像の主題抽出、品質判定を行うサービスが別途存在 SmartNews のニュース配信基盤: 分析 21
  14. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 22
  15. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 26
  16. SmartNews のニュース配信基盤: 配信 Push - Push 配信候補の選定 - アルゴリズムにより決定 -

    ユーザごとに、記事購読状況により - 編成を自動的に変更 - Push 配信対象ユーザの選定 - Push 送信 - 定時で全てのユーザにほぼ遅延なく送信 - 定時通知, 号外通知時によるスケール 29
  17. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 30
  18. - Datadog - 各種 metrics の監視、可視化 - NewRelic - 各種

    performance を監視する APM - Runscope - 各種 API の外形監視 / E2E - PagerDuty - Datadog / Runscope と連携した Alert 用 SaaS SmartNews のニュース配信基盤:監視 31
  19. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 43
  20. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 45
  21. 旧基盤の役割 - 記事の収集基盤 - 各種 Cralwer - 記事の分析基盤 - Crawler

    が収集した記事を分析 - オンメモリの記事データベース - 分散ノードごとに、記事とそのメタ情報をオンメモリで保持 - RMI によるノード間の協調動作 - 記事検索エンジン API - オンメモリのデータベースから記事を検索 現在のニュース配信基盤の各サービスが、 一つのサービスとして 開発・運用されていた サービスの分割と Spring の導入 47
  22. 旧基盤の問題点 - 機能追加、修正が非常に行いづらい - index を一つ追加するのにも一苦労 - 柔軟な検索が実現できない - 多様なユーザ体験を実現できない

    - トラブルシューティングが職人芸化 - スケールさせずらい - 開発者がビジネスロジックのみに集中できない - 非サーバサイドエンジニアの開発効率が向上しない ユーザに価値を届け続けるため、これらを解決する必要があった 徐々に分割は進んでいったが、根本的な基盤はモノリシックなままだった サービスの分割と Spring の導入 48
  23. サービスの分割と Spring (Spring Boot) の導入 (2015/05 ~) - サービスを分割することで、個々に集中が出来る -

    Spring Boot を導入することで以下が実現できると考えた - 高い開発効率 - シンプルなインフラ・ミドルウェア構成 - 高度な周辺エコシステムの恩恵 開発者が本質的な開発作業に集中でき、結果としてサービスの価値をより高めることが できるという判断で導入 サービスの分割と Spring の導入 49
  24. 高い開発効率 - Spring Boot による Java-based Configuration で XML 地獄からの脱却

    - Spring MVC で RESTFul API endpoint を手軽に作成可能 - SpringFox/Swagger による API 仕様の周知、可視化 サービスの分割と Spring の導入 50
  25. シンプルなインフラ・ミドルウェア構成 - executable fat jar によるサービス起動 - war とは異なり、別途サーブレットコンテナを用意する必要が無い -

    リバースプロキシと Java プロセスのみのシンプルな構成が実現可能 - コンテナ化とも相性が良い サービスの分割と Spring の導入 51
  26. 高度な周辺エコシステム - 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
  27. - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視

    - デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 55
  28. サービス間の連携 - オンラインのサービスは Spring MVC による RESTful API を利用して通信 -

    バックエンドのサービスは基本的に Kinesis を介して連携するが、管理用に Web API が存在 - spring-boot-starter-web を依存に追加することで Annotation ベースで簡単に API を追加可能 56
  29. Swagger による仕様の可視化 - API 仕様を自動的に読み込み、可視化・構造化するツール群 - Spring-Boot では、SpringFox とともに利用する -

    springfox-swagger2 - springfox-swagger-ui - これらを用いると、Swagger に対応したサービス以下が有効になる - 自動生成された API 一覧 - それらのパラメタおよびレスポンス形式の可視化 - その場でリクエスト・レスポンスを試せる UI サービス間の連携 ref: Swagger http://swagger.io/ 57
  30. - Swagger の API 仕様から、それらのサービスの Client Library の自動生成を実 現 -

    各サービス間でクライアントを自作する必要がない - 現行仕様に正しく追従するクライアントライブラリ - swagger-codegen を fork し、自動生成プログラムを利用 サービス間の連携 ref: swagger-codegen https://github.com/swagger-api/swagger-cod egen 59
  31. - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視

    - デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 60
  32. バッチ処理 Push や Crawler の一部にも Spring Boot を利用 - 定時起動やタスク間の依存関係などを解決するため

    @Scheduled / Spring Batch を利用 - Web API と同一フレームワークなので開発効率が良い - バッチプログラムの管理画面も、Spring Boot で手軽に作成している 61
  33. - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視

    - デプロイ / プロビジョニング ニュース配信基盤における Spring の活用 62
  34. 監視 Spring Boot Admin を利用したお手軽な Service Discovery - 紐付いた Spring

    Boot サービスの一 覧、メトリクスの確認、設定変更が可 能 - オンラインで設定変更 (KV の注入、ログ レベルの変更) などができる - spring-boot-admin-starter-client を依存に追加し、application.yml で Admin の endpoint を設定 63
  35. 監視 - spring-boot-actuator の充実した機能を利用し、Datadog と連携 - システム状態、VM 状態、API endpoint 毎のリクエスト数、データコネクションなどの監視

    - カスタムな metrics の生成が可能 - - JMX での metrics も存在しているが、Spring の機能を利用して、自動・汎用的な 監視が実現 65
  36. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 67
  37. デプロイ / プロビジョニング - executable fat jar 構成を採用し java -jar

    でサービスを起動 - シンプルなプロビジョニング - nginx + java -jar (with supervisord) - シンプルなデプロイ - Deploy は CI でビルドした jar をダウンロードして起動 - GitHub で push 後に CircleCI/Jenkins + CodeDeploy で自動テスト、自動デプロイ 68
  38. - SmartNews のニュース配信基盤のご紹介 - 記事収集 - 分析 - 検索 -

    配信 - 監視 - ニュース配信基盤における Spring の活用 - サービスの分割と Spring の導入 - サービス間の連携 - バッチ処理 - 監視 - デプロイ / プロビジョニング - 生産性向上 アジェンダ 69
  39. 71

  40. 73

  41. 共通処理の intercepter (AOP) - 例: あるサービスのメソッドを引数単位でキャッシュする Interceptor - Spring の

    Bean 生成時に、Interceptor を織り込んだ、キャッシュ対象のサービスの Proxy を生成して返 す - これらがすべてコードで書ける 生産性向上 74
  42. 生産性向上 Spring の DI コンテナを活用した柔軟なクエリ設定変更 - Spring Framework 上に、薄い検索 Framework

    を構築 - Search における CloudSearch への各種問い合わせロジックを DI コンテナに登録 - 外部からのパラメタで振る舞いを変更可能 - A/B テストやアドホックな記事取得に利用 75
  43. Spring Boot with Kotlin - Crawler 一部のなどは Java でなく Kotlin

    で書かれている - 近年注目を集めている JetBrains 社が開発する JVM 言語 - Android での利用が注目されているが SmartNews では一部 Spring Boot アプリの開発で Kotlin を使っている - kotlin-stdlib を依存に追加 生産性向上 76
  44. 77

  45. SmartNews におけるニュース配信基盤をご紹介しました - 250 万人以上のユーザへ 5 万件以上の記事を配信 - 記事の収集、分析、検索、配信を実現 -

    バックエンド、オンラインの構成で、各処理がサービスに分かれている サービスが進化する過程でニュース配信基盤の大部分が Spring (Spring Boot) に移 行していきました - サービス間の連携やバッチ処理に役立っています - 運用・監視にも恩恵がありました - 生産性、開発速度が向上し、ユーザにより価値を届けられるようになりました - 技術的な挑戦もしやすい環境を整えられました おわりに 79