Redis::Objects で遊んでみよう
by
Ryz310
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 2021 © Social PLUS Inc.| 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objectsで遊んでみよう Ryosuke Sato FFTT 2021-09-17
Slide 2
Slide 2 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 自己紹介 Ryosuke Sato ● 開発リーダー ● バックエンドエンジニア ● 3月に娘が産まれました 😘👶
Slide 3
Slide 3 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 本日のテーマ
Slide 4
Slide 4 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objectsで遊んでみよう
Slide 5
Slide 5 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objects とは
Slide 6
Slide 6 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 7
Slide 7 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 8
Slide 8 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 9
Slide 9 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 10
Slide 10 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 11
Slide 11 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 12
Slide 12 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 サービス改善してみた
Slide 13
Slide 13 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 サービス改善してみた Redis::Objectsで遊んでみよう ソーシャルPLUS のメッセージ配信システムが激重 ● 毎週のように 10 ~ 100 万件の LINE メッセージ配信が予約される ● Sidekiq で並列に処理される ● RDS への負荷がヤバい ● ただし並列数とサーバー台数が制限されているので、一定以上の負荷にはならない ● とはいえアラートも飛んでくるし辛い
Slide 14
Slide 14 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 サービス改善してみた Redis::Objectsで遊んでみよう 10 万件配信した時の RDS のメトリクス Write IOPS: 73,600 RDS CPU: 55%
Slide 15
Slide 15 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる
Slide 16
Slide 16 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる Redis::Objectsで遊んでみよう
Slide 17
Slide 17 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる Redis::Objectsで遊んでみよう この辺が特にヤバそう
Slide 18
Slide 18 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる Redis::Objectsで遊んでみよう 同じ値を 10 万回取得しているっぽい
Slide 19
Slide 19 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objectsで遊んでみよう 原因を探ってみる ● 配信回数分 update が実行されるので 2 × 10 万回 実行されて大変そう ● 沢山実行されている select も 10 万回同じ値を取得 している
Slide 20
Slide 20 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる
Slide 21
Slide 21 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 「前処理→配信処理→後処理」というフローでメッセージ配信は実現されている。 配信処理における RDS へのアクセスを Redis を用いたキャッシュに逃がすことで Write IOPS を削減できるはずなので、その ように対応する。 1. 前処理 ○ 配信処理で必要な情報を Redis へキャッシュする ○ 配信処理ジョブのエンキュー 2. 配信処理 ○ 前処理でキャッシュした Redis の情報を用いて LINE Messaging API を使って配信を実行する ○ 配信結果は Redis にキャッシュする 3. 後処理 ○ 配信処理の完了を確認 ○ Redis のキャッシュから必要な情報を RDS へ Bulk Insert を使ってエクスポートする ○ Redis のキャッシュを削除してメモリを開放する
Slide 22
Slide 22 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 「前処理→配信処理→後処理」というフローでメッセージ配信は実現されている。 配信処理における RDS へのアクセスを Redis を用いたキャッシュに逃がすことで Write IOPS を削減できるはずなので、その ように対応する。 1. 前処理 ○ 配信処理で必要な情報を Redis へキャッシュする ○ 配信処理ジョブのエンキュー 2. 配信処理 ○ 前処理でキャッシュした Redis の情報を用いて LINE Messaging API を使って配信を実行する ○ 配信結果は Redis にキャッシュする 3. 後処理 ○ 配信処理の完了を確認 ○ Redis のキャッシュから必要な情報を RDS へ Bulk Insert を使ってエクスポートする ○ Redis のキャッシュを削除してメモリを開放する 配信中は RDS に書き込まない 最後にまとめて効率的に書き込む
Slide 23
Slide 23 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 「前処理→配信処理→後処理」というフローでメッセージ配信は実現されている。 配信処理における RDS へのアクセスを Redis を用いたキャッシュに逃がすことで Write IOPS を削減できるはずなので、その ように対応する。 1. 前処理 ○ 配信処理で必要な情報を Redis へキャッシュする ○ 配信処理ジョブのエンキュー 2. 配信処理 ○ 前処理でキャッシュした Redis の情報を用いて LINE Messaging API を使って配信を実行する ○ 配信結果は Redis にキャッシュする 3. 後処理 ○ 配信処理の完了を確認 ○ Redis のキャッシュから必要な情報を RDS へ Bulk Insert を使ってエクスポートする ○ Redis のキャッシュを削除してメモリを開放する 配信データの読み込みも Redis のキャッシュを使うように変更
Slide 24
Slide 24 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 「前処理→配信処理→後処理」というフローでメッセージ配信は実現されている。 配信処理における RDS へのアクセスを Redis を用いたキャッシュに逃がすことで Write IOPS を削減できるはずなので、その ように対応する。 1. 前処理 ○ 配信処理で必要な情報を Redis へキャッシュする ○ 配信処理ジョブのエンキュー 2. 配信処理 ○ 前処理でキャッシュした Redis の情報を用いて LINE Messaging API を使って配信を実行する ○ 配信結果は Redis にキャッシュする 3. 後処理 ○ 配信処理の完了を確認 ○ Redis のキャッシュから必要な情報を RDS へ Bulk Insert を使ってエクスポートする ○ Redis のキャッシュを削除してメモリを開放する 後始末はちゃんとやりましょう
Slide 25
Slide 25 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 26
Slide 26 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 10 万件配信した時の RDS のメトリクス Write IOPS: 73,600 RDS CPU: 55% Before
Slide 27
Slide 27 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 10 万件配信した時の RDS のメトリクス Write IOPS: 1,800 RDS CPU: 22% After 解像度高いスクショ撮るの忘れてた(´・ω・`)
Slide 28
Slide 28 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 10 万件配信した時の Redis のメトリクス CPU: 5.5% Memory: -50MB After 解像度高いスクショ撮るの忘れてた(´・ω・`)
Slide 29
Slide 29 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう Before
Slide 30
Slide 30 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう After 👏👏👏👏 👏
Slide 31
Slide 31 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 もっとRedis::Objectsで遊んでみる
Slide 32
Slide 32 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。
Slide 33
Slide 33 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 2021 © Feedforce Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 新gem爆誕 👏👏👏👏👏
Slide 34
Slide 34 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 ● 日毎に効果測定したかった ● PV数, CV数, ログイン数, 配 信数, etc… ● RDSに記録すると負荷になり そうだし容量も圧迫しそう 何故作ったか
Slide 35
Slide 35 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方
Slide 36
Slide 36 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 Redis::Objects と 同じように使えます
Slide 37
Slide 37 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 変数定義。 expiration なども指定 できます。
Slide 38
Slide 38 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 使い方は count とほぼ同じです
Slide 39
Slide 39 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 日付が変わると自動的に新しい カウンターを参照します。
Slide 40
Slide 40 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 日毎の記録は保持しているので 後から期間を指定して取得できます
Slide 41
Slide 41 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 週末にガッと作っただけなので 本番運用はまだこれからです🙇
Slide 42
Slide 42 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 今後の アップデート ● weekly_counter ● monthly_counter ● annual_counter (?) ● hourly_counter ● minutely_counter
Slide 43
Slide 43 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 今後の アップデート ● weekly_counter ● monthly_counter ● annual_counter (?) ● hourly_counter ● minutely_counter API Rate Limit の作成に便利かも
Slide 44
Slide 44 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 今後の アップデート ● timezone の対応 ● RSpec 綺麗に書く ● リファクタリング
Slide 45
Slide 45 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 みんなもRedis::Objectsで遊ぼう
Slide 46
Slide 46 text
2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 fin.