Files
junhong_cmp_fiber/docs/polling-system/manual-trigger-vs-alternatives.md
huang 7308afe801
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m18s
归档
2026-04-13 15:03:02 +08:00

7.1 KiB
Raw Permalink Blame History

手动触发 vs 替代方案对比

方案对比矩阵

方案1保留手动触发当前方案

优点:
✅ 灵活,支持多种触发方式
✅ 不影响自动轮询配置
✅ 可以精确控制触发范围
✅ 支持权限控制和审计

缺点:
❌ 代码复杂度高884行
❌ 维护成本高
❌ 频次限制设置不合理
❌ 权限检查逻辑复杂

适用场景:
- 故障恢复(快速重试失败的卡)
- 数据修复(重新检查修复的卡)
- 性能测试(控制测试场景)

成本884行代码 + 中等维护成本
收益:高(故障恢复/数据修复)
综合评分:⭐⭐⭐

方案2调整轮询配置

原理:
- 不需要手动触发
- 直接调整轮询配置的间隔
- 原配置:实名检查间隔 3600秒
- 新配置:实名检查间隔 60秒故障期间
- 恢复:实名检查间隔 3600秒故障解决后

优点:
✅ 简单,不需要额外代码
✅ 自动应用到所有卡
✅ 易于理解和维护
✅ 无需权限控制

缺点:
❌ 需要手动修改配置
❌ 可能影响其他卡的轮询频率
❌ 无法精确控制触发范围
❌ 无法快速恢复

适用场景:
- 系统级故障(需要调整所有卡的轮询频率)
- 长期优化(调整轮询策略)

成本0行代码 + 低维护成本
收益:中(需要手动操作)
综合评分:⭐⭐

方案3优先级队列

原理:
- 不需要手动触发队列
- 使用优先级队列替代
- 自动轮询队列Sorted Set按时间戳排序
- 优先级队列Sorted Set按优先级排序
- 调度器优先消费优先级队列

优点:
✅ 灵活,可以动态调整优先级
✅ 不需要额外的队列机制
✅ 支持多级优先级
✅ 易于扩展

缺点:
❌ 需要修改调度器逻辑
❌ 需要定义优先级规则
❌ 需要权限控制
❌ 需要审计日志

适用场景:
- 需要多级优先级的场景
- 需要动态调整优先级的场景

成本200-300行代码 + 中等维护成本
收益:中(灵活性高)
综合评分:⭐⭐⭐

方案4事件驱动系统

原理:
- 使用事件系统替代 API 调用
- 当卡状态变化时,发送事件
- 事件处理器根据事件类型触发轮询
- 支持多个事件处理器

优点:
✅ 解耦,易于扩展
✅ 支持多个事件处理器
✅ 易于测试
✅ 易于维护

缺点:
❌ 需要重新设计架构
❌ 需要事件系统基础设施
❌ 学习成本高
❌ 调试困难

适用场景:
- 需要多个系统协作的场景
- 需要高度解耦的场景

成本500+行代码 + 高维护成本
收益:高(长期收益)
综合评分:⭐⭐⭐⭐

详细对比

功能对比

功能 手动触发 配置调整 优先级队列 事件驱动
快速重试 ⚠️
精确控制
权限控制
审计日志
自动化
灵活性

性能对比

指标 手动触发 配置调整 优先级队列 事件驱动
响应时间 <100ms <100ms <100ms <100ms
内存占用
CPU 占用
数据库查询
Redis 操作

成本对比

成本项 手动触发 配置调整 优先级队列 事件驱动
开发成本 已完成 0 200-300行 500+行
维护成本
测试成本
学习成本
总成本

收益对比

收益项 手动触发 配置调整 优先级队列 事件驱动
故障恢复
数据修复
性能测试
日常运维
业务集成
长期价值

推荐方案

短期1-3个月

推荐:保留手动触发 + 改进

理由:

  • 代码已经实现,删除成本高
  • 故障恢复和数据修复场景有实际价值
  • 可以通过改进来提高价值

改进清单:

  1. 修复去重机制的时间不对齐问题
  2. 明确使用场景和频次限制的业务依据
  3. 优化频次限制(提高或移除)
  4. 添加 Redis 缓存优化性能
  5. 改进异步处理的错误处理

中期3-6个月

推荐:优先级队列 + 简化手动触发

理由:

  • 优先级队列提供更灵活的控制
  • 可以逐步迁移手动触发的功能
  • 减少代码复杂度

迁移步骤:

  1. 实现优先级队列
  2. 将手动触发迁移到优先级队列
  3. 简化手动触发的功能(只保留单卡和批量)
  4. 移除条件筛选、进度追踪、任务取消

长期6-12个月

推荐:事件驱动系统

理由:

  • 高度解耦,易于扩展
  • 支持多个系统协作
  • 长期收益高

实现步骤:

  1. 设计事件系统
  2. 实现事件处理器
  3. 迁移手动触发到事件系统
  4. 移除手动触发 API

成本收益分析

方案1保留手动触发当前方案

成本:
- 开发成本0已完成
- 维护成本:中等
- 测试成本:高
- 总成本:中等

收益:
- 故障恢复:高
- 数据修复:高
- 日常运维:低
- 业务集成:低
- 总收益:中等

成本收益比:中等 / 中等 = 1:1
评价:⭐⭐⭐ 保留,但需要改进

方案2调整轮询配置

成本:
- 开发成本0
- 维护成本:低
- 测试成本:低
- 总成本:低

收益:
- 故障恢复:中
- 数据修复:中
- 日常运维:中
- 业务集成:低
- 总收益:中

成本收益比:低 / 中 = 1:2
评价:⭐⭐ 简单但功能有限

方案3优先级队列

成本:
- 开发成本200-300行
- 维护成本:中等
- 测试成本:中等
- 总成本:中等

收益:
- 故障恢复:高
- 数据修复:高
- 日常运维:中
- 业务集成:中
- 总收益:高

成本收益比:中等 / 高 = 1:1.5
评价:⭐⭐⭐⭐ 推荐中期方案

方案4事件驱动系统

成本:
- 开发成本500+行
- 维护成本:高
- 测试成本:高
- 总成本:高

收益:
- 故障恢复:高
- 数据修复:高
- 日常运维:高
- 业务集成:高
- 总收益:高

成本收益比:高 / 高 = 1:1
评价:⭐⭐⭐⭐ 推荐长期方案

总结

方案 短期 中期 长期 综合评分
保留手动触发 ⚠️
调整轮询配置 ⚠️
优先级队列 ⚠️ ⚠️
事件驱动系统 ⚠️

最终建议

  1. 短期:保留手动触发,进行改进
  2. 中期:实现优先级队列,逐步迁移
  3. 长期:构建事件驱动系统,完全重构