关于消息队列热门面试题

自我总结:不喜勿喷

关于幂等性

什么是幂等性?

就是消费者在消费消息时一次只能消费一次才会对系统造成影响,重复消费不会对系统造成影响

如何保证幂等性?

在生产消息是为消息加一个全局唯一的ID,消费者消费时会去redis中查询有没有这个ID,如果没有将这个全局ID存存在redis中,如果有,不会再重复消费

使用场景

消费者在消费完消息后,会对MQ发送一个ACK来告诉MQ已经消费,如果在消费者准备发送ACK时,系统挂掉,MQ就不会收到ACK,当然MQ也不知道消费时候消费了消息,所以等下次连接,MQ会再次发送消息,导致消息被重复消费,此时使用幂等性来保证一致性.

 关于如何保证消息的可靠性

1.设置mandatory参数或者备份交换器:生产者把消息发给服务器,服务器路由失败,本来消息会被丢弃,但mandatory开启就会把消息退回来,如果开了备份交换机,路由失败就会进入交换机里

2.使用publisher confirm机制(发布者确认模式):生产者把消息发给服务器以后,服务器接受到并且存盘持久化,才会给生产发布确认消息,生产者此时才能发消息删掉,如果生产接收到的是拒接,没有成功,生产者就会重发,如果失败超过阈值就人工补偿

mandatory和发布者确认模式,都是保证生产者端消息的可靠性

3.队列和消息都为持久化:开启持久化保证消息无论如何都会发给消费者

4.设置消费端对应的autoAck参数为false并在消费完消息之后再进行消息确认

关于如何保证消息的顺序性

 什么是顺序性

就是指消费者消费的消息和生产者发送的消息,顺序是一样的,

如果一个队列分别有m1,m2,m3,m4消息,消费者有A B两个,消息队列会将消息轮询发给 AB,A为m1,m3,B为m2和m4,但是A B的处理速度不同,无法保证消息的顺序性

如何保证消息的顺序性

1.生产者在发送多条消息到一个队列中,这多条消息前后都有顺序,这个队列只有一个消费者在消费,相当去与也是给消息加全局位置的ID,最后一个消息会有一个结束的标记,当最后一个消息进来就知道,队列中的消息已消费完

2.当有多个消费者时(因为单个消费者处理消息很慢,如果数据量庞大,会挤压很多的消息),消费者在消费信息的时候不去直接消费消息,而是将消息保存在内存队列中。根据消息的关键值(例如订单ID,要全局唯一)进行消息分类,如果没有就创建消费者,将关键值相同的消息(一组需要保证先进先出顺序的消息)发送到相同的内存队列中,一个线程只去一个内存队列中取信息。这样就保证了消息的顺序性

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值