理解消息队列

52 阅读2分钟

消息队列的作用:

1、解耦:使用消息队列来作为系统直接的通信方式,两个系统不需要相互依赖了

2、异步:系统A给消费队列发送完消息之后,就可以继续做其他事情了

3、流量消峰:如果使用消息队列的方式来调用某个系统,那么消息在队列中进行排队,有消费者自己控制消费速度。

死信队列是什么:

死信队列也是一个消息队列,它是用来存放那些没有成功消费的消息的,通常可以用来作为消息重试。

延时队列是什么:

延时队列就是用来存放需要在指定时间被处理的元素的队列,通常可以用来处理一些具有过期性操作的业务,比如十分钟内未支付则取消订单。

消息队列如何保证消息可靠传输:

消息可靠传输代表了两次意思,既不能多也不能少。

1、为了保证消息不多,也就是消息不能重复,也就是生产者不能重复生产消息,或者消费者不能重复消费消息。

2、首先要确保消息不多发,这个不常出现,也比较难控制,因为如果出现了多发,很大的原因是生产者自己的原因,如果要避免出现问题,就需要在消费端做控制。

3、要避免不重复消费,最保险的机制就是消费者实现幂等性,保证就算重复消费,也不会有问题,通过幂等性,也能解决生产者重复发送消息的问题。

4、消息不能少,意思就是消息不能丢失,生产者发送的消息,消费者一定要能消费到,对于这个问题,就要考虑两个方面

5、生产者发送消息时,要确认Broker确实收到并持久化了这条消息,比如RabbitMQ的confirm机制,Kafka的ack机制都可以保障生产者能正确的将消息发送给broker。

6、broker要等待消费者真正确认消费到了消息时才删除掉消息,这里通常就是消费端ack机制,消费者接收到一条消息后,如果确认没有问题了,就可以发送一个ack,broker接收到ack后才会删除消息。