自我总结:不喜勿喷
关于幂等性
什么是幂等性?
就是消费者在消费消息时一次只能消费一次才会对系统造成影响,重复消费不会对系统造成影响
如何保证幂等性?
在生产消息是为消息加一个全局唯一的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,要全局唯一)进行消息分类,如果没有就创建消费者,将关键值相同的消息(一组需要保证先进先出顺序的消息)发送到相同的内存队列中,一个线程只去一个内存队列中取信息。这样就保证了消息的顺序性