RabbitMQ 消息 100% 投递的解决方案!

简介: 现在大多都使用 MQ 来做系统的异构,来做系统的解耦,系统的的模块相当于寄信者与收信者,MQ 则扮演者邮局的角色。作为一个中转的角色,就需要确保消息的100%投递。今天我们就来研究一下如何确保消息的100%的投递。

一、前言

现在大多都使用 MQ 来做系统的异构,来做系统的解耦,系统的的模块相当于寄信者与收信者,MQ 则扮演者邮局的角色。作为一个中转的角色,就需要确保消息的100%投递。


今天我们就来研究一下如何确保消息的100%的投递。


二、先谈谈 RabbitMQ 的特性

RabbitMQ 所做的确保是:只要你把消息投递到 Broker 中,那么我就确保这个消息会送达到消费者的手中。


当然这是有前提条件的,比如:


你需要进行手动应答,

最起码 Broker 不挂,且消息进行了持久化等。

结合 RabbitMQ 的特性来做分析,针对于投递端,我们只需要确保把消息发送到 Broker 中即可,那么如何保证可靠性呢,分下列步骤:


消息成功的发送了出去

保证 Broker 成功的收到了消息

生产者收到了 Broker 的确认应答

消息补偿机制,当前三步都跪了,做一个补偿重发机制

最后一道屏障,如果第四步重试次数过多,那么说明系统出现问题,我们就需要人工干预了

只要做到上面五步,基本上我们就可以保证,消息投递100%的投递出去。


三、生产者的投递的可靠性保障

3.1 先上一个示意图

image.png


3.2 就上述的图示,我们逐步解析

step1:数据落库,这一步是必须的

step2:把消息落库,且初始化其状态为 0 (发送中)

step3:把消息投递到 Broker 中

step4:Broker 发送成功应答

step5:生产者拿到成功应答,修改消息状态为1:(发送成功) 上面讲述的都是正常的流程,下面讲讲如果出现不正常的解决机制:

step6:定时检查消息的状态是否为1

step7:如果 step6 的消息的状态仍然为 0 ,则进入重发,重复上述 step1 - step5

step8:如果消息重发达到一定的的次数,则人工接入处理,因为此时说明可能是消息

上述的方案看似完美无缺,但是细想,如果在 step4 中 Broker 发送应答的过程中,网络出现问题这个消息没有到达生产者会导致整个流程进入补偿的流程当中,此时 Broker 中就有两条消息,也就是发成了重复的投递的问题,所以接下来我们要在消费端来处理这个问题。


四、消费端的幂等:

4.1 导致需要解决幂等的原因

Broker 发送应答消息的时候,消息未到达生产者

消费者在发送应答的时候,消费者挂掉了

4.2 就上述我们的机制的解决

因为上述我的消息都有唯一的标识,所以我们只需要查找对应的消息对应的标识来判断其状态即可


4.3 构建唯一标识的方案

首先说明不同的方案使用不同的应用场景,不要一上来你就说十几万的并发怎么样的,这个慢慢来,一步步往这里走


4.3.1 利用数据库自增id

优点:

1):不能再简单了,在并发不大的情况可以接受 2):对分页和排序是有帮助的


缺点:

1):分库分表和读写分离多住从的情况下不适用 2):性能达不到要求时,不利于扩展 3):不同数据库的语法实现不一样


4.3.2 利用 redis 来生成id

优点:

1):redis 单线程可以生成全局唯一ID 2):可以使用 redis 集群获取更高的吞吐量


缺点:

1):引入新的组件,增加系统复杂度 2):需要注意处理并发问题


4.3.3 利用 twitter 开源的 snowflake

snowflake 是 twitter 开源的一个分布式的 ID 的生成算法,结果是一个 long 的ID,使用 41bit 作为毫秒数,10bit 作为机器 ID(5个 bit 是数据中心,5个 bit 是机器 ID) 12 bit 作为毫秒内的流水号(每个节点每毫秒可以产生 2^12 = 4096 个 ID)最后是一个符号位,


优点:

1):不依赖数据库和其他的中间件,且性能尚可


缺点:

1):是有依赖时间的,如果各个机器的失重不同步就会出现不适全局递增的情况


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3月前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
116 10
|
3月前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
3月前
|
消息中间件 存储 弹性计算
云消息队列 RabbitMQ 版实践解决方案评测
随着企业业务的增长,对消息队列的需求日益提升。阿里云的云消息队列 RabbitMQ 版通过架构优化,解决了消息积压、内存泄漏等问题,并支持弹性伸缩和按量计费,大幅降低资源和运维成本。本文从使用者角度详细评测这一解决方案,涵盖实践原理、部署体验、实际优势及应用场景。
|
3月前
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
83 4
|
4月前
|
消息中间件 运维 监控
云消息队列RabbitMQ实践解决方案评测报告
本报告旨在对《云消息队列RabbitMQ实践》解决方案进行综合评测。通过对该方案的原理理解、部署体验、设计验证以及实际应用价值等方面进行全面分析,为用户提供详尽的反馈与建议。
100 16
|
4月前
|
消息中间件 弹性计算 运维
阿里云云消息队列RabbitMQ实践解决方案评测报告
阿里云云消息队列RabbitMQ实践解决方案评测报告
86 9
|
4月前
|
消息中间件 监控 持续交付
《云消息队列RabbitMQ实践》解决方案测评报告
《云消息队列RabbitMQ实践》解决方案通过RabbitMQ实现业务解耦、异步处理和高可用性。其核心优势包括消息持久化、灵活路由及高可靠性。文档详细介绍了部署步骤、配置方法及监控手段,帮助用户快速搭建消息队列系统。方案适用于电商、金融和实时数据处理等高并发场景,通过异步处理提升系统性能。建议增加自动化部署、复杂场景示例及更详尽的日志解析,进一步提升用户体验。
|
4月前
|
消息中间件 监控 数据处理
解决方案 | 云消息队列RabbitMQ实践
解决方案 | 云消息队列RabbitMQ实践
59 1
|
3月前
|
消息中间件 运维 监控
《云消息队列RabbitMQ实践》解决方案
《云消息队列RabbitMQ实践》解决方案
|
6月前
|
消息中间件 存储 RocketMQ
消息队列 MQ使用问题之进行超过3天的延迟消息投递,采用多次投递的策略是否有风险
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。