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

Redis::Objects で遊んでみよう

Ryz310
September 17, 2021

Redis::Objects で遊んでみよう

2021/09/17 に社内勉強会で発表した内容です。

1. Redis::Objects の紹介
2. RDS に対して IO 負荷の高かった処理に Redis を使って解決した話
3. Redis::Objects を拡張する gem を作った話
https://github.com/ryz310/redis-object-daily-counter

Ryz310

September 17, 2021
Tweet

More Decks by Ryz310

Other Decks in Programming

Transcript

  1. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 2021 © Social

    PLUS Inc.| 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objectsで遊んでみよう Ryosuke Sato FFTT 2021-09-17
  2. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 自己紹介 Ryosuke Sato

    • 開発リーダー • バックエンドエンジニア • 3月に娘が産まれました 😘👶
  3. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 サービス改善してみた Redis::Objectsで遊んでみよう ソーシャルPLUS

    のメッセージ配信システムが激重 • 毎週のように 10 ~ 100 万件の LINE メッセージ配信が予約される • Sidekiq で並列に処理される • RDS への負荷がヤバい • ただし並列数とサーバー台数が制限されているので、一定以上の負荷にはならない • とはいえアラートも飛んでくるし辛い
  4. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objectsで遊んでみよう 原因を探ってみる •

    配信回数分 update が実行されるので 2 × 10 万回 実行されて大変そう • 沢山実行されている select も 10 万回同じ値を取得 している
  5. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 「前処理→配信処理→後処理」というフローでメッセージ配信は実現されている。

    配信処理における RDS へのアクセスを Redis を用いたキャッシュに逃がすことで Write IOPS を削減できるはずなので、その ように対応する。 1. 前処理 ◦ 配信処理で必要な情報を Redis へキャッシュする ◦ 配信処理ジョブのエンキュー 2. 配信処理 ◦ 前処理でキャッシュした Redis の情報を用いて LINE Messaging API を使って配信を実行する ◦ 配信結果は Redis にキャッシュする 3. 後処理 ◦ 配信処理の完了を確認 ◦ Redis のキャッシュから必要な情報を RDS へ Bulk Insert を使ってエクスポートする ◦ Redis のキャッシュを削除してメモリを開放する
  6. 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 に書き込まない 最後にまとめて効率的に書き込む
  7. 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 のキャッシュを使うように変更
  8. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 「前処理→配信処理→後処理」というフローでメッセージ配信は実現されている。

    配信処理における RDS へのアクセスを Redis を用いたキャッシュに逃がすことで Write IOPS を削減できるはずなので、その ように対応する。 1. 前処理 ◦ 配信処理で必要な情報を Redis へキャッシュする ◦ 配信処理ジョブのエンキュー 2. 配信処理 ◦ 前処理でキャッシュした Redis の情報を用いて LINE Messaging API を使って配信を実行する ◦ 配信結果は Redis にキャッシュする 3. 後処理 ◦ 配信処理の完了を確認 ◦ Redis のキャッシュから必要な情報を RDS へ Bulk Insert を使ってエクスポートする ◦ Redis のキャッシュを削除してメモリを開放する 後始末はちゃんとやりましょう
  9. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 10

    万件配信した時の RDS のメトリクス Write IOPS: 1,800 RDS CPU: 22% After 解像度高いスクショ撮るの忘れてた(´・ω・`)
  10. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 10

    万件配信した時の Redis のメトリクス CPU: 5.5% Memory: -50MB After 解像度高いスクショ撮るの忘れてた(´・ω・`)
  11. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 2021 © Feedforce

    Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 新gem爆誕 👏👏👏👏👏
  12. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 • 日毎に効果測定したかった •

    PV数, CV数, ログイン数, 配 信数, etc… • RDSに記録すると負荷になり そうだし容量も圧迫しそう 何故作ったか
  13. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 今後の アップデート •

    weekly_counter • monthly_counter • annual_counter (?) • hourly_counter • minutely_counter API Rate Limit の作成に便利かも