[developers summit 2015 講演資料] リクルートテクノロジーズ...
TRANSCRIPT
株式会社リクルートテクノロジーズ ITマネジメント統括部
ITマネジメント1部 スマートデバイスグループ
樋口 勝彦
14,000件/秒の配信を実現した リクルートのモバイルアプリを支える プッシュ通知基盤 ~AWS上での開発・運用の中で見えてきた課題と解~
2015/2/20
2
ひぐち かつひこ 樋口 勝彦
株式会社リクルートテクノロジーズ ITマネジメント統括部 ITマネジメント1部 スマートデバイスグループ
自己紹介
3年間SIer 2年間決済系 システム開発
リクルート 2013/5~
Tizen アプリ開発
Pusna開発 (プッシュ通知基盤)
FirefoxOS アプリ開発
幻の
(C) Recruit Technologies Co.,Ltd. All rights reserved.
R-Tech スマートデバイスGは リクルートグループのネイティブアプリ領域における
開発/ビジネスを牽引する横断組織
プラットフォーマーとの密な リレーション構築・情報収集
アプリ戦略の 実現
3 (C) Recruit Technologies Co.,Ltd. All rights reserved.
リクルートテクノロジーズのアプリ開発
R-tech スマートデバイスG
4 (C) Recruit Technologies Co.,Ltd. All rights reserved.
話すこと
ここ3年半の モバイル領域の急激な変化と
共に歩んできた あるプッシュ通知基盤システム
の変化/進化について
5 (C) Recruit Technologies Co.,Ltd. All rights reserved.
目次
リクルートとプッシュ通知との歩み
第1章 旧システムの限界に直面
第2章 スケーラビリティを求めての再構築
第3章 運用を通して顕在化した課題
第4章 まとめ
6 (C) Recruit Technologies Co.,Ltd. All rights reserved.
目次
リクルートとプッシュ通知との歩み
第1章 旧システムの限界に直面
第2章 スケーラビリティを求めての再構築
第3章 運用を通して顕在化した課題
第4章 まとめ
8 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Push!
APNs Apple Push Notification Service
スマートデバイスの待ち受け画面に送る通知 (アプリ起動しなくても表示される)
プッシュ通知とは?
Push!
GCM Google Cloud Messaging
アプリチーム
9 (C) Recruit Technologies Co.,Ltd. All rights reserved.
メルマガに比べて開封率が高く、リアルタイム性があり 効果的な販促ツールとして認知されている
プッシュ通知の特徴
ユーザのアクティブ率向上に効果的:
• リアルタイム性を考慮した情報推薦
• 休眠ユーザの再起
アプリでの利用例:
新鮮度がある/話題になるニュースをお届け!
登録条件に合致する 新着物件をお知らせ!
自分に 好意を持った人をお知らせ!
11
プッシュ通知対応の工数削減を目的に プッシュ通知基盤を
フィジビリ・サービスとして 各アプリに展開
(C) Recruit Technologies Co.,Ltd. All rights reserved.
27
デバイス登録数の遷移
X0,000,000
11年6月 13年7月
樋口 Pusna のチームリーダーに。
2013.07
(システム構成図)
デバイス登録
APNs
Pusna
GCM
プッシュ依頼
28
デバイス登録数の遷移
X0,000,000
11年6月 12年8月 13年5月 13年7月
2013.07 樋口 チームリーダー 抜擢
デバイス数 急増
APNs
Pusna
GCM
プッシュ依頼
デバイス登録
29
デバイス登録数の遷移
X0,000,000
11年6月 12年8月 13年5月 13年7月
2013.07 樋口 チームリーダー 抜擢
デバイス数 急増
APNs
Pusna
GCM
プッシュ依頼
デバイス登録
30
デバイス登録数の遷移
X0,000,000
11年6月 12年8月 13年5月 13年7月
2013.07 樋口 チームリーダー 抜擢
デバイス数 急増
APNs
Pusna
GCM
プッシュ依頼
デバイス登録
31 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「配信スピードが遅く、
届けたいタイミングでメッセージが送れない。」
└1000万件の配信に1週間を要した。
問題2:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
└各アプリ担当者のプッシュ時間を調整する必要あった。
32 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「配信スピードが遅く、
届けたいタイミングでメッセージが送れない。」
└1000万件の配信に1週間を要した。
問題2:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
└各アプリ担当者のプッシュ時間を調整する必要あった。
33 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「配信スピードが遅く、
届けたいタイミングでメッセージが送れない。」
└1000万件の配信に1週間を要した。
問題2:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
└各アプリ担当者のプッシュ時間を調整する必要あった。
配信
処理開始
配信
処理終了
問題1 特定時間帯を狙った訴求ができない (例: 昼休み)
昼休み
終了
効果的 効果が期待できない
34 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「配信スピードが遅く、
届けたいタイミングでメッセージが送れない。」
└1000万件の配信に1週間を要した。
問題2:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
└各アプリ担当者のプッシュ時間を調整する必要あった。
35 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「配信スピードが遅く、
届けたいタイミングでメッセージが送れない。」
└1000万件の配信に1週間を要した。
問題2:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
└各アプリ担当者のプッシュ時間を調整する必要あった。
当時、樋口の仕事
問題2 好きな時間にプッシュ依頼ができない。
36 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
システム担当者
今日のプッシュスケジュール 教えてください
37 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
Aアプリ担当
12時からプッシュする予定です。
システム担当者
今日のプッシュスケジュール 教えてください
38 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
Aアプリ担当
12時からプッシュする予定です。
システム担当者
今日のプッシュスケジュール 教えてください
Bアプリ担当
12時からプッシュする予定です。
39 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
Aアプリ担当
12時からプッシュする予定です。
システム担当者
今日のプッシュスケジュール 教えてください
Bアプリ担当
12時からプッシュする予定です。
Cアプリ担当
12時からプッシュしたいです。
40 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
Aアプリ担当
12時からプッシュする予定です。
Bアプリ担当
12時からプッシュする予定です。
Cアプリ担当
12時からプッシュしたいです。
システム担当者の頭の中
3アプリ同時は無理。。 Aアプリの規模は大きいから時間かかるし、Bはニュースアプリだから後回しできない。
Cは…(略)。 B->A->Cで調整してみよう。
41 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
Bアプリ担当
12時からプッシュする予定です。
Cアプリ担当
12時からプッシュしたいです。
システム担当者
>Aさん プッシュ依頼時刻ですが、14時からに 変更できないでしょうか?? >Cさん お昼はシステムが混み合っておりまして、 夕方頃プッシュが可能になる見込みです。 追って、ご案内させてください。 大変申し訳ございません。
42 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
システム担当者
>Aさん プッシュ依頼時刻ですが、14時からに 変更できないでしょうか?? >Cさん お昼はシステムが混み合っておりまして、 夕方頃プッシュが可能になる見込みです。 追って、ご案内させてください。 大変申し訳ございません。
Cアプリ担当
43 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
システム担当者 樋口
>Aさん プッシュ依頼時刻ですが、14時からに 変更できないでしょうか?? >Cさん お昼はシステムが混み合っておりまして、 夕方頃プッシュが可能になる見込みです。 追って、ご案内させてください。 大変申し訳ございません。
Cアプリ担当
システム担当者
本当に申し訳ございません。。
44 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
各アプリ担当者のプッシュ時間を調整する必要あった。
問題2:
「配信スピードが遅く、
カスタマーに届けたいメッセージが送れない。」
1000万件の配信に1週間を要した。
当時、樋口の仕事
システム担当者 樋口
>Aさん プッシュ依頼時刻ですが、14時からに 変更できないでしょうか?? >Cさん お昼はシステムが混み合っておりまして、 夕方頃プッシュが可能になる見込みです。 追って、ご案内させてください。 大変申し訳ございません。
Cアプリ担当
システム担当者
本当に申し訳ございません。。
当時、樋口の仕事
プッシュ配信の交通整備人
俺・・・ 何してんだろう
45 (C) Recruit Technologies Co.,Ltd. All rights reserved.
当時のシステムで発生していた問題
問題1:
「配信スピードが遅く、
届けたいタイミングでメッセージが送れない。」
└1000万件の配信に1週間を要した。
問題2:
「高負荷にシステムが耐えられないため、
各アプリが好きな時間にプッシュ依頼できない。」
└各アプリ担当者のプッシュ時間を調整する必要あった。
キャパシティ限界を迎えていた
46 (C) Recruit Technologies Co.,Ltd. All rights reserved.
目次
リクルートとプッシュ通知との歩み
第1章 旧システムの限界に直面
第2章 スケーラビリティを求めての再構築
第3章 運用を通して顕在化した課題
第4章 まとめ
48 (C) Recruit Technologies Co.,Ltd. All rights reserved.
再構築の背景
Pusnaの再構築が決定! 2013.夏
論点
・外部ASPの利用も考慮に入れ検討。 └各アプリチームの要望に迅速対応できる内製化に。
アプリチームの要望例
・既存システムとの連携 ・レコメンドプッシュ ・セキュリティ観点 (事業会社間でのアクセス制限など)
49 (C) Recruit Technologies Co.,Ltd. All rights reserved.
再構築で解決する課題
課題1:
届けたいタイミングでメッセージが送りきれない
└Realtime 課題2:
各アプリ担当が好きな時間にプッシュ依頼できない
└ Scalable
キャパシティ問題の解決が最優先
55 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
機能間の 非同期連携
56 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
機能間の 非同期連携
57 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化 APNs
旧Pusna
GCM
デバイス登録
プッシュ依頼
改善ポイント①
機能間の 非同期連携
58 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化 APNs
旧Pusna
GCM
デバイス登録
プッシュ依頼
改善ポイント①
機能間の 非同期連携
59 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化 APNs
旧Pusna
GCM
デバイス登録
プッシュ依頼
改善ポイント①
機能分割
機能間の 非同期連携
60 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
61 (C) Recruit Technologies Co.,Ltd. All rights reserved.
• Amazon Simple Queue Service(SQS)はAWSが提供する
分散キューサービス。
• 高速で信頼性・スケーラビリティに優れ、低コストに
使うことが出来る。
SQSとは
機能間の 非同期連携
62 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
改善ポイント②
APNs
旧Pusna
GCM
機能間の 非同期連携
63 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
改善ポイント②
APNs
旧Pusna
GCM
機能間の 非同期連携
64 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
改善ポイント②
I/Oの高速化
APNs
旧Pusna
GCM
機能間の 非同期連携
65 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
66 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDBとは
• Amazon DynamoDBはAWSにて提供される分散KVS。
• 複数のAZ(データセンター)にわたってレプリケーション
されることで高い信頼性が保証されている。
• SSDで動作しておりデータ量の変化に関係なく
高速に動作する。
• スキーマレスにデータを扱える。
機能間の 非同期連携
67 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
機能間の 非同期連携
68 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
機能間の 非同期連携
69 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Realtime & Scalable 実現のため
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
「高速化」&「単純化と分割」で Realtime & Scalable を実現
71 (C) Recruit Technologies Co.,Ltd. All rights reserved.
積極的に最新技術を採用
AWSの機能をふんだんに利用
リクルート内サービスで運用実績のない ソフトウェアも積極採用 ※2013年秋頃当時
73 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
全体構成
SQS
74 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
登録worker
管理API
データ参照
事業サーバ 配信担当者
全体構成
システム管理・操作用 Web UI
SQS
SQS
SQSを利用した 機能間の非同期連携
を実現
75 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
登録worker
管理API
データ参照
事業サーバ 配信担当者
全体構成
システム管理・操作用 Web UI
SQS
SQS
I/Oの高速化
76 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
全体構成
①デバイス登録
SQS
77 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
全体構成
SQS
②配信登録
78 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
全体構成
SQS
③配信依頼
79 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
デバイス登録処理
①デバイス登録
SQS
80
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
デバイス登録処理
(C) Recruit Technologies Co.,Ltd. All rights reserved.
SQS
スマホアプリ内の PusnaRS用SDK経由で
登録APIにデバイス情報を送信
①デバイス登録
81 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
デバイス登録処理
SQS
デバイス情報をDynamoDBと Elasticsearchに登録
①デバイス登録
82 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
配信登録
SQS
②配信登録
83 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
事業サーバ 配信担当者
配信登録
SQS
②配信登録
配信者又は事業サーバから PUSH配信をリクエスト
84 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
データ参照
事業サーバ 配信担当者
配信依頼処理
SQS
③配信依頼
85 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
事業サーバ 配信担当者
配信依頼処理
SQS
③配信依頼
配信要求を元に 対象デバイスを抽出
配信タイプに応じて DynamoDB または elasticsearchから
デバイス情報を抽出
86 (C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
SQS 登録worker
システム管理・操作用 Web UI
管理API
事業サーバ 配信担当者
配信依頼処理
SQS
③配信依頼
抽出したデバイス情報をAPNs又はGCMへ送信
87
[PR]詳細については@IT連載記事を参照
http://www.atmarkit.co.jp/ait/articles/1412/18/news022.html
(C) Recruit Technologies Co.,Ltd. All rights reserved.
89
再構築 BEFORE / AFTER
✔ □ Realtime 配信スピード:
(旧) 秒間最大41件 (新) 秒間最大 14,000件
1000万台配信実績:
(旧) 1週間 ※(分割配信) (新) 12分
90
再構築 BEFORE / AFTER
✔
✔
□ Realtime 配信スピード:
(旧) 秒間最大41件 (新) 秒間最大 14,000件
1000万台配信実績:
(旧) 1週間 ※(分割配信) (新) 12分
□ Scalable 登録デバイス数が数千万を超えた現在も
リリースから1年以上、完全無停止で安定稼働中
91
再構築 BEFORE / AFTER
✔
✔
□ Realtime 配信スピード:
(旧) 秒間最大41件 (新) 秒間最大 14,000件
1000万台配信実績:
(旧) 1週間 ※(分割配信) (新) 12分
□ Scalable 登録デバイス数が数千万を超えた現在も
リリースから1年以上、完全無停止で安定稼働中
93 (C) Recruit Technologies Co.,Ltd. All rights reserved.
目次
リクルートとプッシュ通知との歩み
第1章 旧システムの限界に直面
第2章 スケーラビリティを求めての再構築
第3章 運用を通して顕在化した課題
第4章 まとめ
94 (C) Recruit Technologies Co.,Ltd. All rights reserved.
目次
リクルートとプッシュ通知との歩み
第1章 旧システムの限界に直面
第2章 スケーラビリティを求めての再構築
第3章 運用を通して顕在化した課題
第4章 まとめ
97
ある日の定時後。。 完璧に作りきった
Pusna-RS だったが、 本格運用中に発覚した
事例を3つ紹介
この章で話すこと
(C) Recruit Technologies Co.,Ltd. All rights reserved.
100
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
※ 稀に発生していた
(C) Recruit Technologies Co.,Ltd. All rights reserved.
101
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
※ 稀に発生していた
説明
(C) Recruit Technologies Co.,Ltd. All rights reserved.
102
デバイス登録のキュー詰まりについて
登録 API
登録Worker
キューの処理スピード
≦
登録キュー
エンキュー処理 デバイス登録API
リクエスト
デキュー処理 DynamoDBへの
書込み
(C) Recruit Technologies Co.,Ltd. All rights reserved.
103
デバイス登録のキュー詰まりについて
登録 API
登録Worker
キューの処理スピード
≦
登録キュー
エンキュー処理 デバイス登録API
リクエスト
デキュー処理 DynamoDBへの
書込み
DynamoDBで書込みエラーが発生しないため キュー詰まりは発生しない
(C) Recruit Technologies Co.,Ltd. All rights reserved.
104
デバイス登録のキュー詰まりについて
キューの処理スピード
> エンキュー処理 デバイス登録API
リクエスト
デキュー処理 DynamoDBへの
書込み
登録API 登録Worker 登録キュー
(C) Recruit Technologies Co.,Ltd. All rights reserved.
105
デバイス登録のキュー詰まりについて
キューの処理スピード
> エンキュー処理 デバイス登録API
リクエスト
デキュー処理 DynamoDBへの
書込み
スループットエラーが発生
登録API 登録Worker 登録キュー
リトライ処理開始
(C) Recruit Technologies Co.,Ltd. All rights reserved.
106
デバイス登録のキュー詰まりについて
キューの処理スピード
> エンキュー処理 デバイス登録API
リクエスト
デキュー処理 DynamoDBへの
書込み
登録API 登録Worker 登録キュー
(C) Recruit Technologies Co.,Ltd. All rights reserved.
107
デバイス登録のキュー詰まりについて
キューの処理スピード
> エンキュー処理 デバイス登録API
リクエスト
デキュー処理 DynamoDBへの
書込み
DynamoDBで書込みエラーが発生し 処理が止まるため、キューが詰まりが発生する。
登録API 登録Worker 登録キュー
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録キュー 登録Worker
108
デバイス登録のキュー詰まりについて
登録API
キュー詰まり対策
(C) Recruit Technologies Co.,Ltd. All rights reserved.
スループットエラー発生中
登録キュー 登録Worker
109
デバイス登録のキュー詰まりについて
登録API
該当アプリのDynamoDB スループット値(Write)を上げる
キュー詰まり対策
(C) Recruit Technologies Co.,Ltd. All rights reserved.
スループットエラー発生中
登録キュー 登録Worker
110
デバイス登録のキュー詰まりについて
登録API
該当アプリのDynamoDB スループット値(Write)を上げる
キュー詰まり対策
アプリC
アプリB
アプリA
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録キュー 登録Worker
111
デバイス登録のキュー詰まりについて
登録API
該当アプリのDynamoDB スループット値(Write)を上げる
キュー詰まり対策
アプリC
アプリB
アプリA
スループット値を上げる
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録キュー 登録Worker
112
デバイス登録のキュー詰まりについて
登録API
該当アプリのDynamoDB スループット値(Write)を上げる
キュー詰まり対策
アプリC
アプリB
アプリA
スループットエラー発生中 スループットエラー緩和される
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録キュー 登録Worker
113
デバイス登録のキュー詰まりについて
登録API
該当アプリのDynamoDB スループット値(Write)を上げる
キュー詰まり対策
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録キュー 登録Worker
114
デバイス登録のキュー詰まりについて
登録API
該当アプリのDynamoDB スループット値(Write)を上げる
キュー詰まり対策
(C) Recruit Technologies Co.,Ltd. All rights reserved.
詰まり解消
115
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
[再掲]
(C) Recruit Technologies Co.,Ltd. All rights reserved.
116
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
[再掲] (型化されている運用通り) 該当アプリのDynamoDB
スループット値(write)を上げた。
対応
117
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
[再掲] (型化されている運用通り) 該当アプリのDynamoDB
スループット値(write)を上げた。
想定
対応
118
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
[再掲] (型化されている運用通り) 該当アプリのDynamoDB
スループット値(write)を上げた。
閾値
t
キューの深さ
Writeスループット向上 想定
対応
119
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
[再掲] (型化されている運用通り) 該当アプリのDynamoDB
スループット値(write)を上げた。
実際
対応
120
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
[再掲] (型化されている運用通り) 該当アプリのDynamoDB
スループット値(write)を上げた。
実際
対応
閾値 (1,000)
t
キューの深さ
Writeスループット向上
121
ある日の定時後 アラートメールを受信
デバイス登録キュー が詰まっている (閾値1,000)
[再掲] (型化されている運用通り) 該当アプリのDynamoDB
スループット値(write)を上げた。
実際
対応 キューの深さ
140万件まで膨れ上がる
(゚∀゚;)ヤ・・・ャバ.
閾値 (1,000)
t
キューの深さ
Writeスループット向上
123
起きていた現象
スマホアプリの実装ミス デバイス登録完了のコールバックで 再度デバイス登録をする実装に。
原因
登録API 登録Worker 登録キュー
(C) Recruit Technologies Co.,Ltd. All rights reserved.
リクエスト
124
起きていた現象
レスポンス
スマホアプリの実装ミス デバイス登録完了のコールバックで 再度デバイス登録をする実装に。
原因
デバイス登録の無限ループ が起きていた
登録API 登録Worker 登録キュー
(C) Recruit Technologies Co.,Ltd. All rights reserved.
125
起きていた現象
スマホアプリの実装ミス デバイス登録完了のコールバックで 再度デバイス登録をする実装に。
原因
登録API 登録Worker 登録キュー
(C) Recruit Technologies Co.,Ltd. All rights reserved.
徐々にループする端末も増える
126
起きていた現象
登録API
スマホアプリの実装ミス デバイス登録完了のコールバックで 再度デバイス登録をする実装に。
原因
スループットエラーが発生
登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
127
起きていた現象
登録API
スマホアプリの実装ミス デバイス登録完了のコールバックで 再度デバイス登録をする実装に。
原因
スループットエラーが発生
ループ端末も増え続ける
登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
128
起きていた現象
登録API
スマホアプリの実装ミス デバイス登録完了のコールバックで 再度デバイス登録をする実装に。
原因
スループットエラーが発生
キュー詰まり発生 ループ端末も増え続ける
登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
130
起きていた現象
登録API 登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
DynamoDBスループット値を上げる
誤った打ち手1
131
起きていた現象
登録API 登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
スループット値を上げる
DynamoDBスループット値を上げる
誤った打ち手1
132
起きていた現象
登録API 登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
デバイス登録リクエストのループは継続するため キュー詰まりは解消しない
DynamoDBスループット値を上げる
誤った打ち手1
135
起きていた現象
登録API 登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
ループ端末も増え続ける
負荷が高まる
137
起きていた現象
登録API 登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録APIサーバーのスケールアウト(2台->10台)
誤った打ち手2
138
起きていた現象
登録API 登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録APIサーバーのスケールアウト(2台->10台)
誤った打ち手2
139
起きていた現象
登録API 登録キュー 登録Worker
(C) Recruit Technologies Co.,Ltd. All rights reserved.
登録APIサーバーのスケールアウト(2台->10台)
誤った打ち手2
さらに無限ループが加速
141
起きていた現象
登録キュー (詰まり中)
登録APIサーバーのスケールアウト(2台->10台)
誤った打ち手2
さらに無限ループが加速
無限ループの影響で 他アプリのデバイス登録の遅延が発生した
142
単体のスマホアプリのミスによる影響が 他アプリにも生じてしまうアーキテクチャであること
着目した問題点
スマホアプリの修正版を緊急リリース
暫定対応
デバイス登録キューをアプリ毎に分割
打ち手
事象「無限デバイス登録」のまとめ
(C) Recruit Technologies Co.,Ltd. All rights reserved.
143 (C) Recruit Technologies Co.,Ltd. All rights reserved.
登録API 登録Worker デバイス登録キュー ELB
DynamoDB
elasticsearch
デバイス登録
アプリA
アプリA
アプリB
アプリB
アプリC
全てのアプリのデバイス登録処理を 一つのキュー(SQS)で管理
BEFORE
アプリAから大量のアクセスで アプリB,Cの登録処理が遅延しまった
144 (C) Recruit Technologies Co.,Ltd. All rights reserved.
登録API 登録Worker
アプリA登録キュー
ELB
DynamoDB
elasticsearch
デバイス登録
アプリA
アプリA
アプリB
アプリB
アプリC
一つのキューから大量に取得しないように取得数を制御している
アプリB登録キュー
アプリC登録キュー
アプリ毎にキュー(SQS)を分割することで 遅延リスクを最小限に
AFTER
156
起きていた現象
APNs/GCM Pusna-RS
サービスに対する リクエスト
サービス (C) Recruit Technologies Co.,Ltd. All rights reserved.
157
起きていた現象
APNs/GCM Pusna-RS
サービスに対する リクエスト
サービス (C) Recruit Technologies Co.,Ltd. All rights reserved.
158
起きていた現象
APNs/GCM Pusna-RS
サービスに対する リクエスト
サービス
例えば、500万デバイスに プッシュする場合
7分弱※1の間に
アプリのアクティブユーザが
50万※2増えることになる
※1 配信スピード: 秒間14,000件 換算 ※2 プッシュ通知の開封率: 10% 換算
161
対応
配信Worker 配信キュー APNs/GCM
READ
配信ごとに大まかな 秒間配信数を指定できるように修正
打ち手
修正内容
プログラム内でデータソースへのScan間隔を制御 することで配信速度をコントロール
一定間隔を置いて アクセス
(C) Recruit Technologies Co.,Ltd. All rights reserved.
データソース
164
今取り組んでいる話
当初想定していた2倍のスピードで 登録デバイス数が
想定のX千万に到達!
(C) Recruit Technologies Co.,Ltd. All rights reserved.
165
想定Doc数 5,000万
シャード 4
レプリカ数 3
ノード数 6
Elasticsearchの構成
クラスター情報
想定Doc数を超え 1シャード当たり 1000万を超える
データ量
(C) Recruit Technologies Co.,Ltd. All rights reserved.
166
想定Doc数 5,000万
シャード 4
レプリカ数 3
ノード数 6
Elasticsearchの構成
クラスター情報
想定Doc数を超え 1シャード当たり 1000万を超える
データ量
当然、1回1回の検索時間 も長くなり、負荷が高まる
167
想定Doc数 5,000万
シャード 4
レプリカ数 3
ノード数 6
Elasticsearchの構成
クラスター情報
想定Doc数を超え 1シャード当たり 1000万を超える
データ量
セグメンテーションプッシュの
利用頻度も上がり、
高負荷な状態は慢性化していた
さらに
168
想定Doc数 5,000万
シャード 4
レプリカ数 3
ノード数 6
Elasticsearchの構成
クラスター情報
想定Doc数を超え 1シャード当たり 1000万を超える
データ量
OutOfMemoryが発生!
そんな時
169
想定Doc数 5,000万
シャード 4
レプリカ数 3
ノード数 6
Elasticsearchの構成
クラスター情報
想定Doc数を超え 1シャード当たり 1000万を超える
データ量
OutOfMemoryが発生!
一部のプッシュが遅延した。
そんな時
170
打ち手
1シャード当たりのドキュメント数が多く検索負荷が高い
問題
事象「Elasticsearch高負荷」のまとめ
シャード
想定Doc数
Doc数/シャード
4
5,000万
現
1,250万
(C) Recruit Technologies Co.,Ltd. All rights reserved.
171
シャード数を増やした構成に再構築する
打ち手
1シャード当たりのドキュメント数が多く検索負荷が高い
問題
事象「Elasticsearch高負荷」のまとめ
シャード
想定Doc数
Doc数/シャード
4
5,000万
現
1,250万
(C) Recruit Technologies Co.,Ltd. All rights reserved.
172
シャード数を増やした構成に再構築する
打ち手
1シャード当たりのドキュメント数が多く検索負荷が高い
問題
事象「Elasticsearch高負荷」のまとめ
シャード 10↑
- 想定Doc数
変更後すぐ
500万↓ Doc数/シャード
4
5,000万
現
1,250万
(C) Recruit Technologies Co.,Ltd. All rights reserved.
173
シャード数を増やした構成に再構築する
打ち手
1シャード当たりのドキュメント数が多く検索負荷が高い
問題
事象「Elasticsearch高負荷」のまとめ
シャード 10↑
- 想定Doc数
変更後すぐ
500万↓ Doc数/シャード
未来
10
1億
1,000万
4
5,000万
現
1,250万
(C) Recruit Technologies Co.,Ltd. All rights reserved.
174
想定Doc数 5,000万
シャード 4
レプリカ数 3
ノード数 6
Elasticsearchの構成
クラスター情報
想定Doc数を超え 1シャード当たり 1000万を超える
データ量
シャード数の変更は
オンラインではできない。
しかし
175
想定Doc数 5,000万
シャード 4
レプリカ数 3
ノード数 6
Elasticsearchの構成
クラスター情報
想定Doc数を超え 1シャード当たり 1000万を超える
データ量
シャード数の変更は
オンラインではできない。
しかし
176
オンラインでのESシャード数変更
デバイス登録ワーカーを止め、更新処理を遅らせている間にESクラスターを再構成
登録 API
登録キュー
登録Worker
旧ES
(C) Recruit Technologies Co.,Ltd. All rights reserved.
177
オンラインでのESシャード数変更
デバイス登録ワーカーを止め、更新処理を遅らせている間にESクラスターを再構成
登録 API
登録キュー
登録Worker
旧ES
新ES
新しいESクラスターを用意
(C) Recruit Technologies Co.,Ltd. All rights reserved.
178
オンラインでのESシャード数変更
デバイス登録ワーカーを止め、更新処理を遅らせている間にESクラスターを再構成
登録 API
登録キュー
登録Worker
旧ES
新ES
登録Workerを停止
(C) Recruit Technologies Co.,Ltd. All rights reserved.
179
オンラインでのESシャード数変更
デバイス登録ワーカーを止め、更新処理を遅らせている間にESクラスターを再構成
登録 API
登録キュー
登録Worker
旧ES
新ES
データ移行開始
(C) Recruit Technologies Co.,Ltd. All rights reserved.
180
オンラインでのESシャード数変更
デバイス登録ワーカーを止め、更新処理を遅らせている間にESクラスターを再構成
登録 API
登録キュー
登録Worker
旧ES
新ES
データ移行開始 データ移行完了!
(C) Recruit Technologies Co.,Ltd. All rights reserved.
181
オンラインでのESシャード数変更
デバイス登録ワーカーを止め、更新処理を遅らせている間にESクラスターを再構成
登録 API
登録キュー
登録Worker
旧ES
新ES
登録Workerを再起動
(C) Recruit Technologies Co.,Ltd. All rights reserved.
183 (C) Recruit Technologies Co.,Ltd. All rights reserved.
目次
リクルートとプッシュ通知との歩み
第1章 旧システムの限界に直面
第2章 スケーラビリティを求めての再構築
第3章 運用を通して顕在化した課題
第4章 まとめ
機能間の 非同期連携
202 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Pusna-RS アーキテクチャのポイント
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
機能間の 非同期連携
203 (C) Recruit Technologies Co.,Ltd. All rights reserved.
Pusna-RS アーキテクチャのポイント
基本アイディア
利用ツール
Scalable └単純化と分散
Realtime └高速化 └各機能の高速化 └IOの高速化
DynamoDBによる I/Oの高速化
非同期I/Oの活用 I/Oの最適化
DynamoDB
elasticsearch クラスタ
デバイス登録 リクエスト
APNs/GCM サーバ
登録API
データ登録
配信worker
登録worker
管理API
データ参照
事業サーバ 配信担当者
システム管理・操作用 Web UI
SQS
SQS
SQSを利用した 機能間の非同期連携
を実現
I/Oの高速化
205
リクルートテクノロジーズでは 新技術に挑戦したくてウズウズしてる
一緒に働く仲間を募集中です!!
(C) Recruit Technologies Co.,Ltd. All rights reserved.