Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
急激なDB書き込みが行われるサービスをリビルドした話
Search
takayuki.miura
February 20, 2023
Technology
0
690
急激なDB書き込みが行われるサービスをリビルドした話
takayuki.miura
February 20, 2023
Tweet
Share
More Decks by takayuki.miura
See All by takayuki.miura
TerraformをやめてCDKでReStartしたあと、 CDKをやめてCDK for TerraformでReStartした話
tmiura0203
0
1.2k
実際にリビルドを完遂してみて
tmiura0203
0
640
Spring Bootという強すぎるフレームワークについて
tmiura0203
0
790
Other Decks in Technology
See All in Technology
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
270
多様なメトリックとシステムの健全性維持
masaaki_k
0
120
コンテナセキュリティのためのLandlock入門
nullpo_head
2
330
TypeScript開発にモジュラーモノリスを持ち込む
sansantech
PRO
2
710
12 Days of OpenAIから読み解く、生成AI 2025年のトレンド
shunsukeono_am
0
420
事業貢献を考えるための技術改善の目標設計と改善実績 / Targeted design of technical improvements to consider business contribution and improvement performance
oomatomo
0
160
AWS環境におけるランサムウェア攻撃対策の設計
nrinetcom
PRO
0
190
なぜCodeceptJSを選んだか
goataka
0
180
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
5
740
スタートアップで取り組んでいるAzureとMicrosoft 365のセキュリティ対策/How to Improve Azure and Microsoft 365 Security at Startup
yuj1osm
0
240
APIとはなにか
mikanichinose
0
120
非機能品質を作り込むための実践アーキテクチャ
knih
5
1.7k
Featured
See All Featured
Scaling GitHub
holman
459
140k
Documentation Writing (for coders)
carmenintech
67
4.5k
The Pragmatic Product Professional
lauravandoore
32
6.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Agile that works and the tools we love
rasmusluckow
328
21k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
810
Adopting Sorbet at Scale
ufuk
73
9.1k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Code Reviewing Like a Champion
maltzj
521
39k
A better future with KSS
kneath
238
17k
Transcript
急激なDB書き込みが行われる サービスをリビルドした話 エキサイト株式会社 三浦 大幸 01
アジェンダ 自己紹介 ことの始まり DB書き込みでの負荷問題とその解決 今後の展望 まとめ 02
エキサイト株式会社 所属 バックエンド 技術スタック @miura0203 SNS 01 02 03 自己紹介
自己紹介 03 三浦 大幸 フロントエンド インフラ iOSアプリ
ことの始まり 04
サマーインターン前のある日 ことの始まり 05 インターンなにやる? WebPushのリビルドとかどうですか? いいね! (そういえばWebPushのリビルドして なかったな…)
サマーインターン前のある日 ことの始まり インターンなにやる? WebPushのリビルドとかどうですか? いいね! (そういえばWebPushのリビルドして なかったな…) 闇の開発の始まり 06
問題点 ユーザ情報が少なすぎて、WebPushの機能をフルに使えない WebPushを送信できるタイミングが決め打ちされている cron + ShellScript + PHPで無理やりデーモンを作っており、管理が難しい 配信開始から終了まで数時間掛かる DBからデータを取得
~ WebPush通知送信までの流れが複雑 通知送信後、DBに急激な書き込み負荷が掛かる などなど… ことの始まり 07
問題点 ことの始まり ユーザ情報が少なすぎて、WebPushの機能をフルに使えない WebPushを送信できるタイミングが決め打ちされている cron + ShellScript + PHPで無理やりデーモンを作っており、管理が難しい 配信開始から終了まで数時間掛かる
DBからデータを取得 ~ WebPush通知送信までの流れが複雑 通知送信後、DBに急激な書き込み負荷が掛かる などなど… 省略 08
DB書き込みでの負荷問題とその解決 09
DB書き込みでの負荷問題とその解決 10 DB書き込みでの負荷問題とその解決 通知の送信状況記録時 通知の受信状況記録時のDB書き込み負荷 のDB書き込み負荷
DB書き込みでの負荷問題とその解決 11 通知の受信状況記録時のDB書き込み負荷 DB書き込みでの負荷問題とその解決
問題点 ユーザ情報が少なすぎて、WebPushの機能をフルに使えない WebPushを送信できるタイミングが決め打ちされている cron + ShellScript + PHPで無理やりデーモンを作っており、管理が難しい 配信開始から終了まで数時間掛かる DBからデータを取得
~ WebPush通知送信までの流れが複雑 通知送信後、DBに急激な書き込み負荷が掛かる などなど… 12 DB書き込みでの負荷問題とその解決
問題点 ユーザ情報が少なすぎて、WebPushの機能をフルに使えない WebPushを送信できるタイミングが決め打ちされている cron + ShellScript + PHPで無理やりデーモンを作っており、管理が難しい 配信開始から終了まで数時間掛かる DBからデータを取得
~ WebPush通知送信までの流れが複雑 通知送信後、DBに急激な書き込み負荷が掛かる などなど… 13 DB書き込みでの負荷問題とその解決
問題点 14 ブラウザから受信通知を受け、並列で受信状況記録を行う 受信状況記録(並列) DB書き込みでの負荷問題とその解決 Push通知送信(並列) 受信通知(各ブラウザから)
問題点 15 並列での受信状況記録が急激すぎて、DBへの書き込みが高負荷に 受信状況記録(並列) DB書き込みでの負荷問題とその解決 Push通知送信(並列) 受信通知(各ブラウザから)
問題点 16 並列での受信状況記録が急激すぎて、DBへの書き込みが高負荷に 受信状況記録(並列) 必須 DB書き込みでの負荷問題とその解決 Push通知送信(並列) 受信通知(各ブラウザから)
解決策 17 この機能は必須だったので、別のサービスを噛ませることに 受信通知(各ブラウザから) DB書き込みでの負荷問題とその解決 Push通知送信(並列)
18 Amazon Timestream DB書き込みでの負荷問題とその解決
Amazon Timestreamとは? DB書き込みでの負荷問題とその解決 19 解決策 > Amazon Timestream は、高速かつスケーラブルなサーバーレス時系列データベースサービスです。1 日あたり
数兆件規模のイベントを最大 1,000 倍の速度でより簡単に保存および分析できます。Amazon Timestream は、容 量とパフォーマンスを調整するために自動的にスケールアップまたはスケールダウンするので、基盤インフラスト ラクチャの管理が不要です。 要は、書き込みにとても強い https://aws.amazon.com/jp/timestream/
解決策 20 Timestreamで直接の書き込みを受け、DBへは一定時間ごとに一括入力 受信状況記録(並列) 一括取得 一括入力 一括リクエスト 受信通知 (各ブラウザから) DB書き込みでの負荷問題とその解決
DB書き込みでの負荷問題とその解決 21 通知の送信状況記録時のDB書き込み負荷 DB書き込みでの負荷問題とその解決
問題点 22 数十万人 最終確認で、数十万人相当にWebPushを送ってみた DB書き込みでの負荷問題とその解決
問題点 DB書き込みでの負荷問題とその解決 数十万人 最終確認で、数十万人相当にWebPushを送ってみた 問題発生 23
問題点 24 DBのCPU使用率 送信開始 100 75 50 25 0 問題発生
(グラフはイメージです) DB書き込みでの負荷問題とその解決
問題点 25 既存処理はこうなっているが、リビルドに際し新しく機能を追加した DB書き込みでの負荷問題とその解決 受信通知(各ブラウザから) Push通知送信(並列)
問題点 26 Push通知送信時に、送信状況を記録する機能を追加 DB書き込みでの負荷問題とその解決 送信状況記録(並列) Push通知送信(並列) 受信通知(各ブラウザから)
問題点 27 並列での送信状況記録が急激すぎて、DBへの書き込みが高負荷に Push通知送信(並列) 受信通知(各ブラウザから) DB書き込みでの負荷問題とその解決 送信状況記録(並列)
解決策 28 Push通知送信(並列) 受信通知(各ブラウザから) DB書き込みでの負荷問題とその解決 「ユーザへの通知の送信状況記録」は、Push通知において必須要件ではないので削除 あったほうが便利ではあったが、負荷と天秤にかけた
解決 以上の仕組みで、現在は元気に動いている 29 DB書き込みでの負荷問題とその解決
今後の展望 30
Amazon Timestream Amazon SQS Timestreamは最適? 仕様・コスト・開発のしやすさなどから、SQSのほうが最適な可能性がある 今後の展望 31 検証し、必要に応じて変更
どこまでデータをとっておく? DBの負荷は減ったが、放っておくとデータ量自体は今後も増えていってしまう 今後の展望 32 適切なタイミングで、データを集計・削除する仕組みを入れてもいいかも?
まとめ 33
DBへの急激な書き込み負荷を抑えるには 本当に必要なデータなのか、改めて考える まとめ 34 直にDBに書き込むのではなく、Timestreamなど書き込み負荷に強い サービスを経由する データ書き込みが多いサービスはDB周りが結構シビアなので、「あったほうがいい」くらいの ものは削る必要がある場合も 書き込み負荷に強いサービスも種類があるので、最適なものを選ぶ