- Redisは技術業界で最も好意的な評価を得ている技術の1つ
- 非常によく設計された優れた技術であり、それ自体に欠陥があるわけではないが、常に必要とは限らない
- 10年以上にわたり3社で同じパターンを見てきた:
- 問題が発生し、Redisが適しているように見えたが、実際には状況を改善できなかったり、根本的な問題を解決できなかったりした
- ただ複雑さのために複雑さを増やしただけだった
最初の事例: Tantanでの経験
- Tantanは中国で2番目に大きいデーティングアプリで、PostgreSQLベースの50〜100台の高性能データベースサーバーを運用している
- 各サーバーはユーザーIDごとにシャーディングされており、特定ユーザーのデータは1台のサーバーにのみ保存される
- 問題状況
- 「スワイプ」回数を保存し、素早く更新しなければならない要件が発生
- 当初はRedisに保存するのが適切だと判断した
- 高性能なRedisサーバーが数台あれば十分だと考えて設定を進めた
- 再検討と解決策
- チーム内でRedisの代わりにPostgreSQLへ直接保存する案を議論した
- PostgreSQLサーバーの負荷はすでに高いため、追加負荷はわずかだろうと予想した
- PostgreSQLに保存した後も性能低下はなく、Redis導入は不要だった
2番目の事例: Bannerflowでの経験
- 背景
- Bannerflowは広告の制作・配信プラットフォーム
- 新しいマイクロサービスでFacebookのようなソーシャルネットワークへの広告配信を支援するため、Redisの導入を決定
- 問題状況
- Tantanに比べて負荷が著しく低い状況で、Redis導入が本当に必要だったのか不明だった
- 初期開発者が去った後、Redis導入理由を明確に説明できる人がいなかった
- 結果
- 負荷が低く、Redisは特に必要ではなかった
- 長期的にはRedisを削除するのが最善という結論に達した
3番目の事例: MAJORITYでの経験
- 背景
- MAJORITYはフィンテック企業で、外部API呼び出し結果をキャッシュするためにRedisを導入
- Redisは位置情報検索データをキャッシュし、処理速度を高めてコストを削減する目的で導入された
- 問題状況
- 同じデータがDB(Azure SQL)にも保存されていた
- Redis呼び出しをDB呼び出しに置き換えても、負荷増加はほとんどないと予想された
- ロック処理が必要でRedisを使い続けようとしたが、Azure SQLで十分に対応可能だった
- 結果
- Redis導入は不要だという結論に達した
- Redisの代わりにAzure SQLへ切り替える計画を立てた
結論
- 3つの事例はいずれも異なるドメイン、技術スタック、負荷条件で発生した
- 共通点は不要なRedis導入だったこと
- Redis導入前には、実際の必要性と性能上の利点を十分に検討すべき
- Dan McKinleyの「Choose Boring Technology」講演を推奨
5件のコメント
Redisを使うかどうかはさておき、ドメインと永続化の間にキャッシュレイヤーを挟むこと(基本実装はバイパス)は、まったくオーバーエンジニアリングではない。ロギング、フェイクデータ、デバッグ、プロファイリング、あるいは本当のキャッシュにさえ使えるかもしれない…
+1 私も同意します。レイヤーを1つ追加するだけでも
余地が生まれ、数多くのことを解決できる余白を作ってくれます。Redisに問題があるというより、DBだけで十分なのに、なぜ追加の構成要素を導入して運用負担を増やす必要があるのか、という観点のようです。
やや簡潔に説明しているので、こういう視点も考えてみるべきだ、という程度で受け取るとよさそうですね。
アプリケーションロジックをシンプルに保ちながらRedisキャッシュを導入するほうが、よりよい選択になる状況もあるので、
状況に応じて選ぶ必要がありそうです。
タイトルに釣られましたね。笑 同感です~~
Hacker Newsの意見
2015年にUberで働いていたとき、郵便番号ベースの地理的分割を六角形ベースの方式へ切り替えようとしていた
Redisの過剰利用について議論があった
Redis利用の文化は、その人気に比べて発展してこなかった
Redisか非Redisかの問題ではなく、シリアライズしにくいデータを扱う問題である
ソフトウェア開発はしばしば他人のやり方を繰り返す傾向がある
Redisは唯一の本番運用対応の「データ構造サーバー」である
キャッシュが不要なこともある
RedisのAPIは素晴らしいが、運用上のリスクがある
Redisの利用を勧めない傾向には驚かされる
Redisは一時的なキャッシュとしては問題ないが、トランザクションや分散ストレージには不十分である