记录一次责任链设计模式使用低级错误

记录一次责任链设计模式使用低级错误

背景

  1. 提供一个服务支持语音转写成文本,以及历史转写备份数据的简单服务。
  2. 提供一个接口批量上传,一次最大1000条(分表) 落库之后 同时发送到消息队列 并更新数据状态
  3. 消费者一条条消费,并调用底层转写服务。等待回调

流程

  1. 提交转写 使用责任链模式,进行语音下载 转码 生成波形图,提交转写
  2. 回调 也使用了责任链模式,回调记录结果 并通知上层。
  3. 本身也有使用threadLocal 进行透传参数

发现问题

  1. 两者都使用了责任链模式,并借助spring IOC 注入能力 按顺序循环调用每个handle。
  2. Spring IOC Bean 默认都是单例的,那么提交转写因为是从队列1条条消费,使用了类的私有变量只要每次流程都更新了 就不会出现问题
  3. 但是回调 底层是并发回调,那么问题出现了,导致多条数据 类的私有变量 信息错乱。

解决方案

  1. 原型,那么需要改动责任链启动方式
  2. 把变量放到threadLocal 这个需要记得使用完清理掉

总结

  • 考虑每个业务的使用场景 不要盲目套用设计模式。
  • 得亏自测发现了,要不提交测试丢人呀。低级错误 眼高手低 笨蛋一个。加油
posted @ 2024-04-25 11:47  贺艳峰  阅读(12)  评论(0编辑  收藏  举报