はじめに
バックエンドエンジニア歴2年、Redisに初めて触れたので記念するため記事として記録する!
どんなサービスに導入した?
ディスプレイ広告のImpression集計サービスに導入した。
Impression集計フローを変えた。
理由
サーバのディスク使用率が100%になったことがあり、Impressionの書き込みができず、損失に繋がったことがある。
ディスク使用率が100%に絶対ならないような対策と共に、リアルタイムでDBに保存するよう変更した。既存と同じくcsvファイルとしてもバックアップするので、どっちか一箇所が壊れてもImpressionを担保できる。
既存の仕様
- ImpressionサーバでImpressionをcsvファイルにテキスト形式で保存
- Batchサーバでcsvファイルを読みDBに保存
新しい仕様
- ImpressionサーバでDBに直保存する
- バックアップとしてcsvファイルも取っておく
Redisで実現できたこと
- リアルタイムでImpressionを集計
- Redisのシングルスレッドのおかげで、マルチスレッド環境で同時生問題を防いだ
- ListをQueueのように使うことでデータ損失防止(LeftPush, RightPop)
- ImressionデータをRedisに臨時保存する→BatchInsertすることでRDSとのI/Oコスト削減
RabbitMqを使ったらもっと良かったかも?
- Redisはメモリを使うのでDiskを使うローカルRabbitMqを使ったらもっと良かったかもしれない。
- また、Message Queueがあるとinsert失敗シナリオ対策がもっと柔軟にできそうだった。
- 今後は他サービスとの連携をEvent Driven Architectureで作ってみたい(配信〜在庫管理〜imp集計)
- RabbitMq VS Kafka、どっちを使う方がいいか考えてみよう、、!