Redis::Objects で遊んでみよう
by
Ryz310
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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.