MQ如何解决消息的顺序问题和消息的重复问题

简介: 作者:CHEN川链接:http://www.jianshu.com/p/453c6e7ff81c來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。一、摘要分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。

作者:CHEN川

链接:http://www.jianshu.com/p/453c6e7ff81c

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、摘要

分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题:

1、消息的顺序问题

2、消息的重复问题

二、关键特性以及其实现原理

2.1、顺序消息

要实现严格的顺序消息,简单且可行的办法就是:

保证生产者 - MQServer - 消费者是一对一对一的关系

这样的设计虽然简单易行,但也会存在一些很严重的问题,比如:

1、并行度就会成为消息系统的瓶颈(吞吐量不够)

2、更多的异常处理,比如:只要消费端出现问题,就会导致整个处理流程阻塞,我们不得不花费更多的精力来解决阻塞的问题。

但我们的最终目标是要集群的高容错性和高吞吐量。这似乎是一对不可调和的矛盾,那么阿里是如何解决的?

有些问题,看起来很重要,但实际上我们可以通过合理的设计或者将问题分解来规避。如果硬要把时间花在解决问题本身,实际上不仅效率低下,而且也是一种浪费。从这个角度来看消息的顺序问题,我们可以得出两个结论:

1、不关注乱序的应用实际大量存在

2、队列无序并不意味着消息无序

2.2、消息重复

上面在解决消息顺序问题时,引入了一个新的问题,就是消息重复。那么MQ是怎样解决消息重复的问题呢?还是“恰好”不解决。

造成消息的重复的根本原因是:网络不可达。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是不解决,转而绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?

1、消费端处理消息的业务逻辑保持幂等性

2、保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现

第1条很好理解,只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。第2条原理就是利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息。

我们可以看到第1条的解决方式,很明显应该在消费端实现,不属于消息系统要实现的功能。第2条可以消息系统实现,也可以业务端实现。正常情况下出现重复消息的概率不一定大,且由消息系统实现的话,肯定会对消息系统的吞吐量和高可用有影响,所以最好还是由业务端自己处理消息重复的问题,这也是MQ不解决消息重复的问题的原因。

MQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。

三、阅读原文

在线观看地址:跟着阿笨一起玩NET

微信公众号:ABenDotNet




相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
9月前
|
消息中间件 数据库
RabbitMQ消息的重复消费问题如何解决的
RabbitMQ消息的重复消费问题如何解决的
1163 0
|
1月前
|
消息中间件 安全 Kafka
Kafka保证消息不丢失不重复
Kafka保证消息不丢失不重复
33 6
|
2月前
|
消息中间件 存储 Kafka
几种 MQ 顺序消息的实现方式
几种 MQ 顺序消息的实现方式
|
9月前
|
消息中间件 NoSQL Redis
消息重复消费的问题
消息重复消费的问题
|
9月前
|
消息中间件 Kafka 测试技术
MQ 学习日志(七) 保证消息消费的顺序性
保证消息消费的顺序性
128 0
|
9月前
|
消息中间件
RabbitMQ消息的重复消费问题如何解决的?
RabbitMQ消息的重复消费问题是在分布式系统中常见的一个挑战,解决该问题可以采取以下几种策略:
499 0
|
9月前
|
消息中间件 Kafka
Kafka消息的重复消费问题如何解决的 ?
Kafka 通过使用消费者组(Consumer Group)来解决消息的重复消费问题。
1161 0
|
9月前
|
消息中间件 缓存 数据库
RabbitMQ消息的重复消费问题如何解决的 ?
在RabbitMQ中,重复消费是一个常见的问题,但可以通过以下几种方式来解决
1186 0
|
10月前
|
消息中间件 存储 NoSQL
该如何保证消息不被重复消费
该如何保证消息不被重复消费
110 0
|
11月前
|
消息中间件 存储 网络协议
大厂都是如何处理重复消息的?
消息消费失败,很多框架会自动执行重试,而重试就产生了重复消息。 MQTT协议给出三种传递消息时能够提供的
222 0