redis内存被打爆了

一次基于redis做队列消费cannel的binlog导致内存被打爆的场景分析

问题复现流程图:

  • 100万次 SQL 更新 → 100万个 Binlog 事件
  • 100万个事件 → 100万个队列任务(都在同一个业务队列中)
  • 100万个任务 → 100万个监控 Key(Horizon 监控每个任务)

每次 MySQL UPDATE 都会产生一个 Binlog 事件 100万次 UPDATE = 100万个 Binlog 事件

  • Canal 为每个 Binlog 事件创建一个队列任务
php 复制代码
foreach ($binlogEvents as $event) {
    // 每个事件都创建一个任务,塞到同一个队列
    Redis::lpush('ai_vending_horizon', json_encode([
        'id' => generateUUID(),
        'event' => $event,
        'timestamp' => time()
    ]));
}

horizon:laravel框架的queue队列管理服务 支持队列中每个任务的监控和管理 `

  • 暂停/恢复队列
  • 重试失败任务
  • 清空队列
  • 查看任务详情`
  • 任务超时

等等

Laravel Horizon 本身是个很好的工具,但在事故中:

  • 监控开销过大:每个任务都创建多个监控 Key
  • 缺乏批量处理:没有针对大批量任务的优化
  • 内存管理缺失:没有监控 Key 数量的限制
  • 缺乏redis内存监控告警

Horizon都干了啥?

arduino 复制代码
// 每个任务都会创建这些监控 Key
ai_phone_horizon:{task_id}           // 任务状态
ai_phone_horizon:{task_id}:metrics   // 性能指标
ai_phone_horizon:{task_id}:runtime   // 运行时间
ai_phone_horizon:{task_id}:memory    // 内存使用
ai_phone_horizon:{task_id}:failed    // 失败信息
ai_phone_horizon:{task_id}:retries   // 重试次数

任务级别的监控的作用

diff 复制代码
// 需要知道每个任务的状态
- 任务是否成功执行?
- 任务执行了多长时间?
- 任务消耗了多少内存?
- 任务失败了吗?
- 任务重试了几次?

监控开销计算

ini 复制代码
100万个任务 × 每个任务6个监控Key = 600万个 Redis Key

同时业务逻辑消费慢,任务被阻塞,导致任务队列数据数据越来越多,越来越大,变成一个吃内存的超级大key

优化、优化

相关推荐
llz_1121 小时前
web-第二次课后作业
前端·后端·web
红尘散仙7 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记9 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆9 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪9 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball61610 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_25183645710 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao10 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒11 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
ayqy贾杰12 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理