故障描述
中行扫码支付接入系统,并发量稍微高一点,就有不时出现查询任务发送了,但是没有线程接收到任务查询信息的故障。
故障原因
系统当时设置的消费者并发量是5个,采用了事务消息确认机制,使用了默认的prefetchSize,而事务的prefetchSize默认大小为1000个,(当broker有需要处理的消息后,主动push给某个线程)
而我们的业务有这种问题,用户获取了支付页面,但并不支付,出现10分钟内一直查询到不确定的结果,导致该消息事务无法结束。(哎,觉得系统这样设计就不好,),而未处理的消息处理队列头,该消息不处理后面的消息就获取不到。下图是目前消息的处理流模型。
解决方案:
从两个点解决:
1、加大并发量,尽量大的容纳刷而不付的场景,但还是不能从根本上解决,如果同时有超过这个并发数的人刷而不付还是会出现这种情形。
2、设置prefetchSize=0,将获取消息改为pull模式,一条消息得不到处理就不会影响后面被prefetch进来的消息了。