MQ如何解决消息的顺序问题和消息的重复问题
2018-02-28 16:51
531 查看
作者:CHEN川链接:http://www.jianshu.com/p/453c6e7ff81c來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。二、关键特性以及其实现原理
2.1、顺序消息要实现严格的顺序消息,简单且可行的办法就是:保证生产者 - MQServer - 消费者是一对一对一的关系这样的设计虽然简单易行,但也会存在一些很严重的问题,比如:1、并行度就会成为消息系统的瓶颈(吞吐量不够)2、更多的异常处理,比如:只要消费端出现问题,就会导致整个处理流程阻塞,我们不得不花费更多的精力来解决阻塞的问题。但我们的最终目标是要集群的高容错性和高吞吐量。这似乎是一对不可调和的矛盾,那么阿里是如何解决的?有些问题,看起来很重要,但实际上我们可以通过合理的设计或者将问题分解来规避。如果硬要把时间花在解决问题本身,实际上不仅效率低下,而且也是一种浪费。从这个角度来看消息的顺序问题,我们可以得出两个结论:1、不关注乱序的应用实际大量存在2、队列无序并不意味着消息无序2.2、消息重复上面在解决消息顺序问题时,引入了一个新的问题,就是消息重复。那么MQ是怎样解决消息重复的问题呢?还是“恰好”不解决。造成消息的重复的根本原因是:网络不可达。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是不解决,转而绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?1、消费端处理消息的业务逻辑保持幂等性2、保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现第1条很好理解,只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。第2条原理就是利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息。我们可以看到第1条的解决方式,很明显应该在消费端实现,不属于消息系统要实现的功能。第2条可以消息系统实现,也可以业务端实现。正常情况下出现重复消
4000
息的概率不一定大,且由消息系统实现的话,肯定会对消息系统的吞吐量和高可用有影响,所以最好还是由业务端自己处理消息重复的问题,这也是MQ不解决消息重复的问题的原因。MQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。
官方QQ群:422315558
574187616
个人讲师课堂主页:http://study.163.com/provider/2544628/index.htm
个人微信公众号课程主页:http://dwz.cn/ABenNET
一、摘要
分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题:1、消息的顺序问题2、消息的重复问题二、关键特性以及其实现原理
2.1、顺序消息要实现严格的顺序消息,简单且可行的办法就是:保证生产者 - MQServer - 消费者是一对一对一的关系这样的设计虽然简单易行,但也会存在一些很严重的问题,比如:1、并行度就会成为消息系统的瓶颈(吞吐量不够)2、更多的异常处理,比如:只要消费端出现问题,就会导致整个处理流程阻塞,我们不得不花费更多的精力来解决阻塞的问题。但我们的最终目标是要集群的高容错性和高吞吐量。这似乎是一对不可调和的矛盾,那么阿里是如何解决的?有些问题,看起来很重要,但实际上我们可以通过合理的设计或者将问题分解来规避。如果硬要把时间花在解决问题本身,实际上不仅效率低下,而且也是一种浪费。从这个角度来看消息的顺序问题,我们可以得出两个结论:1、不关注乱序的应用实际大量存在2、队列无序并不意味着消息无序2.2、消息重复上面在解决消息顺序问题时,引入了一个新的问题,就是消息重复。那么MQ是怎样解决消息重复的问题呢?还是“恰好”不解决。造成消息的重复的根本原因是:网络不可达。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是不解决,转而绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?1、消费端处理消息的业务逻辑保持幂等性2、保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现第1条很好理解,只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。第2条原理就是利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息。我们可以看到第1条的解决方式,很明显应该在消费端实现,不属于消息系统要实现的功能。第2条可以消息系统实现,也可以业务端实现。正常情况下出现重复消4000
息的概率不一定大,且由消息系统实现的话,肯定会对消息系统的吞吐量和高可用有影响,所以最好还是由业务端自己处理消息重复的问题,这也是MQ不解决消息重复的问题的原因。MQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。
三、阅读原文
源代码在线演示和解读
作者:阿笨官方QQ群:422315558
574187616
个人讲师课堂主页:http://study.163.com/provider/2544628/index.htm
个人微信公众号课程主页:http://dwz.cn/ABenNET
相关文章推荐
- MQ如何解决消息的顺序问题和消息的重复问题
- RocketMQ(三)如何解决消息的顺序&重复两大硬伤?
- RocketMQ(三)如何解决消息的顺序&重复两大硬伤?
- 分布式开放消息系统RocketMQ的原理与实践(消息的顺序问题、重复问题、可靠消息/事务消息)
- 解决rabbitmq消息队列的顺序及重复消费问题
- 阿里RocketMQ如何解决消息的顺序&重复两大硬伤?
- 如何解决系统补丁(KB971092)重复安装问题
- 如何解决oracle分页查询数据重复问题
- 解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理大文件
- 解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理大文件
- asp.net mvc 表单重复提交问题。如何解决呀?
- [问题记录]解决RabbitMQ消息丢失与重复消费问题
- RocketMQ原理解析-producer 3.如何发送顺序消息
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- 解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理大文件
- 如何解决Win7系统下QQ来消息是PPS酷狗播放器声音变小的问题
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- 如何彻底解决网站存在的内容重复度问题 !!!!
- Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题