使用streadway/amqp出错

问题描述:服务a接收http请求,并将请求内容存入db,启动一个goroutine将这些内容推送到rabbitmq中,生产环境运行后,每天都通过脚本比对db以及rabbitmq的consumer得到的结果,发现经常少推送记录。

假设consumer不存在问题,现在需要保证的就是服务a中的goroutine从db中拿到内容,推送到rabbitmq,并更新db内容的状态,这件事的一致性。

代码中按照以上描述的顺序执行。在推送mq成功后,更新db状态,单线程无并发的情况,db状态变了,但是consumer统计的结果确实是丢失了内容。这种情况,直接查看关于mq sdk的使用部分的逻辑。发现官方例子中,有一个publish后,server异步给ack的机制,允许调用sdk的app注册channel,除了性能可能有些问题外,这个问题到这里就结束了。

但是,上线后,发现大量的超时,并且,worker会突然定制运作,不会定期处理db中的记录。本地按照生产环境试着重现,重现后,发现是由于调用方代码使用sdk不当,导致lock和channel导致sdk阻塞。不能继续publish。

整件事比想象中要绕,还需要对amqp的sdk中Publish有了解才能搞清楚发生了什么。

使用streadway/amqp出错
Share this