问题:在我们使用rabbit mq时,队列、消息均被持久化了,还会不会丢消息?
答案:会,如下图3种场景。
在某些业务场景下,丢消息使得各个系统间数据状态不一致,影响业务的正常进展。例如某个用户开通金融账户,
开通成功后发送消息到消息队列,把开户结果同步给支付平台,会员系统;如果消息丢了,那么用户后续无法支付。
那么怎么解决呢?
方法一使用事务,性能不好。
方法二很老土,常规解法。生产者端发消息前先落一条发送记录;消费端在接收消息后先落一条接收记录。
生产者端启动定时任务扫描发送记录表,接收端暴露接收记录查询API,批量查询发送记录匹配接收记录。
如果遇到问题,生产者端补发消息即可。另外,消费者遇到异常不能ACK或者压根就没有ACK会导致消息积压和重发,消息重发也会导致消息的重复消费(业务上需要做幂等处理)。