浅谈消息队列mq

75 阅读2分钟

我们知道消息队列在业务开发中有着许多应用场景,例如解耦、异步、削峰等。利用好消息队列可以解决很多棘手的问题,但是使用mq时,以下几个方面需要特殊处理。

1、消息丢失问题

业务系统执行完业务操作,发送mq通知执行下一步操作,但是由于网络等原因导致mq发送失败。那么,针对这种情况,要如何防止消息丢失,让程序继续执行下去?

解决方案可能有很多,这里提供一种简单的方法:

(1)增加mq消息流水表,在生产者发送mq消息之前,向表中插入一条流水,设置流水为初始待处理状态。消费者消费完消息后修改流水的状态为完成状态。

(2)设置定时任务,定时查询超时未处理的消息流水,通过补偿接口重新发送消息。

2、重复消费问题

由于网络超时、消息重试等异常情况导致mq发送多次,如何保证消费者只消费一次呢?

针对这个问题,一是消费者要做好幂等处理,二是通过业务逻辑校验是否消费过消息,三是通过消息流水的状态来确认是否已经消费过。

3、垃圾消息问题

在使用mq时,如果消费者消费失败,我们可以捕获异常并重新发送消息,或者延迟消息来作为补偿逻辑。但如果消息一直失败,一直重新发送mq,会造成大量的垃圾消息,甚至堆积无法消费的消息。

那么,如何处理这些垃圾消息呢?

一方面我们可以设置重试次数,当达到一定重试次数之后不再重试和重新发送mq消息。二是在代码层面设置消息消费补偿接口,通过调用接口主动消费掉堆积的消息。当然,这种情况下要根据具体的业务逻辑来处理,不能随便结束掉消费的消息。

4、延迟消息问题

在业务开发中,我们经常碰到间隔一段时间查询结果的场景。遇到这个场景,我们首先会想到通过定时任务去查询结果,但是定时任务很重。mq本身就给我们提供了一个延迟消息的功能,在对时间要求不严格的情况下,使用mq提供的时间间隔等级,也不失为一种很好的方案。