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

Redis::Objects で遊んでみよう

7c4ff97e74b3f52858796fd0cc358fb5?s=47 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

7c4ff97e74b3f52858796fd0cc358fb5?s=128

Ryz310

September 17, 2021
Tweet

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. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 本日のテーマ

  4. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objectsで遊んでみよう

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

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

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

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

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

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

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

  12. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 サービス改善してみた

  13. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 サービス改善してみた Redis::Objectsで遊んでみよう ソーシャルPLUS

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

    万件配信した時の RDS のメトリクス Write IOPS: 73,600 RDS CPU: 55%
  15. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる

  16. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる Redis::Objectsで遊んでみよう

  17. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる Redis::Objectsで遊んでみよう この辺が特にヤバそう

  18. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 原因を探ってみる Redis::Objectsで遊んでみよう 同じ値を

    10 万回取得しているっぽい
  19. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 Redis::Objectsで遊んでみよう 原因を探ってみる •

    配信回数分 update が実行されるので 2 × 10 万回 実行されて大変そう • 沢山実行されている select も 10 万回同じ値を取得 している
  20. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる

  21. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 「前処理→配信処理→後処理」というフローでメッセージ配信は実現されている。

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

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

  26. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 10

    万件配信した時の RDS のメトリクス Write IOPS: 73,600 RDS CPU: 55% Before
  27. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう 10

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

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

  30. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 対策してみる Redis::Objectsで遊んでみよう After

    👏👏👏👏 👏
  31. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 もっとRedis::Objectsで遊んでみる

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

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

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

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

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

    同じように使えます
  37. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 変数定義。 expiration

    なども指定 できます。
  38. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 使い方は count

    とほぼ同じです
  39. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 日付が変わると自動的に新しい カウンターを参照します。

  40. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 使い方 日毎の記録は保持しているので 後から期間を指定して取得できます

  41. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 週末にガッと作っただけなので 本番運用はまだこれからです🙇

  42. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 今後の アップデート •

    weekly_counter • monthly_counter • annual_counter (?) • hourly_counter • minutely_counter
  43. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 今後の アップデート •

    weekly_counter • monthly_counter • annual_counter (?) • hourly_counter • minutely_counter API Rate Limit の作成に便利かも
  44. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 今後の アップデート •

    timezone の対応 • RSpec 綺麗に書く • リファクタリング
  45. 2021 © Social PLUS Inc. | 本資料を無断で転用・改変・複製・第三者に開示することを禁じます。 みんなもRedis::Objectsで遊ぼう

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