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.