记录一次责任链设计模式使用低级错误
目录背景
- 提供一个服务支持语音转写成文本,以及历史转写备份数据的简单服务。
- 提供一个接口批量上传,一次最大1000条(分表) 落库之后 同时发送到消息队列 并更新数据状态
- 消费者一条条消费,并调用底层转写服务。等待回调
流程
- 提交转写 使用责任链模式,进行语音下载 转码 生成波形图,提交转写
- 回调 也使用了责任链模式,回调记录结果 并通知上层。
- 本身也有使用threadLocal 进行透传参数
发现问题
- 两者都使用了责任链模式,并借助spring IOC 注入能力 按顺序循环调用每个handle。
- Spring IOC Bean 默认都是单例的,那么提交转写因为是从队列1条条消费,使用了类的私有变量只要每次流程都更新了 就不会出现问题
- 但是回调 底层是并发回调,那么问题出现了,导致多条数据 类的私有变量 信息错乱。
解决方案
- 原型,那么需要改动责任链启动方式
- 把变量放到threadLocal 这个需要记得使用完清理掉
总结
- 考虑每个业务的使用场景 不要盲目套用设计模式。
- 得亏自测发现了,要不提交测试丢人呀。低级错误 眼高手低 笨蛋一个。加油