MQ 学习日志(三) 保证消息队列的高可用性

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 保证消息队列的可靠性

如何保证消息队列的高可用性

RabbitMQ的高可用性

RabbitMQ是比较有代表性的,因为是基于主从做高可用性,RabbitMQ有三种模式,单机,普通集群,镜像集群模式

单机模式

就是Demo级别

普通集群模式

多台器上启动多个RabbitMQ实例,每个机器启动一个,但是创建的Queue只会放在一个RabbitMQ实例上,但是每个实例都同步queue的元数据,消费的时候如果连接到了另外一个实例,那么这个实例就会从queue所在的实例上拉取数据过来

这种方式确实很麻烦,也不好,没有做所谓的分布式,就是个普通集群,因为这导致你要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个queue所在的实例消费数据,前者有数据拉取的开销,后者导致单实力性能瓶颈

而且如果那个放queue的实例当寄了,会导致接下来其他的实例就无法从那个实例拉取,如果开启了消息持久化,,让RabbitMq落地存储消息的话,消息不一定会丢,得等这个实例恢复后,才能继续从这个queue中拉取数据

所以这个方案就没有什么高可用性而言,主要就是让急群众多个节点来服务某个queue的读写操作

镜像集群模式

这种模式才是所谓的RabbitMQ的高可用模式,跟普通集群模式不一样的是,你创建的queue无论元数据还是queue里的消息都会存在于多个实例上,然后每次写消息到queue的时候就会主动把消息到多个实例的queue里的消息进行同步

好处就是如果一个机器宕机了,其他的机器一样可以使用,坏处在于,性能开销太大,消息同步所有的机器,导致网络的带宽压力和消耗很重,第二,没有拓展性可言,如果某个queue负载很重,你加机器,新增的机器也包含了这个queue的所有数据,没有办法线性拓展你的queue

镜像集群开启方式

RabbitMQ有一个管理控制台,可以再后台新增一个策略,这个策略是惊喜那个集群模式的策略,指定的时候可以要求数据同步到所有的节点,也可以要求哦同步到指定数量的节点上,然后在创建queue的时候,应用这个策略,就会自动将数据同步到其他的节点上去了

kafka的高可用性

kafka是一个基本的架构认识,多个broker组成,每个broker是一个节点,你创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据

这就是天然的分布式消息队列,就是说一个topic的数据,是分散放在多个机器上的,每个机器就放一部分数据

实际上rabbitMQ之类的,并不是分布式消息队列,也就是传统的消息队列,只不过提供了一些集群,HA的机制而已,因为无论怎么玩,RabbitMQ一个Queue的数据都是放在一个节点里的,镜像集群下,也是每个节点都放这个Queue的完整数据

kafka0.8以前,是没有HA机制的,就是任何一个broker当寄了,那个broker上的patition

Topic,Partition,Replication
topic

KafKa与其他的MQ的区别是在于,其他的MQ同时拥有Queue(点对点)和Topic(订阅/发布)两种模式,而KafKa只有Topic一种模式,topic可以理解为消息存储的虚拟空间,也就是一个集合

Partition

KafKa是一个标准的分布式MQ,其在每台设备上都会运行一个Broker进程,如果我们定义一个Topic有三个Partition,则这三个Partition就会在设备上创建三个Partition文件,再机器上物理保存,也就是说,Partition就是消息的物理存储,我们可以再KafKa的数据目录(/tmp/KafKa-log)下面找到,命名规则为:topic_name-partition_id 此目录可以自行配置

Replication

Replication是保证KafKa消息高可用且系统稳定的一个策略,也就是HA机制,及,每个partitation都会有至少一个对应的Replication,而KafKa会通过一取模算法保证每个broker的partition和对应的Replication再不同的机器上,具体的算法是第i个Partitation存放的Broker为 i mod n ,而第i个Partition的j个 Replication存放的位置为 (i + j) mod n

目录
相关文章
|
2月前
|
消息中间件 存储 数据库
深入学习RocketMQ的底层存储设计原理
文章深入探讨了RocketMQ的底层存储设计原理,分析了其如何通过将数据和索引映射到内存、异步刷新磁盘以及消息内容的混合存储来实现高性能的读写操作,从而保证了RocketMQ作为一款低延迟消息队列的读写性能。
|
1天前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
9 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
17天前
|
消息中间件 运维 监控
云消息队列RabbitMQ实践解决方案评测报告
本报告旨在对《云消息队列RabbitMQ实践》解决方案进行综合评测。通过对该方案的原理理解、部署体验、设计验证以及实际应用价值等方面进行全面分析,为用户提供详尽的反馈与建议。
48 15
|
13天前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
16天前
|
消息中间件 弹性计算 运维
阿里云云消息队列RabbitMQ实践解决方案评测报告
阿里云云消息队列RabbitMQ实践解决方案评测报告
43 9
|
12天前
|
消息中间件 监控 数据处理
解决方案 | 云消息队列RabbitMQ实践
解决方案 | 云消息队列RabbitMQ实践
25 1
|
13天前
|
消息中间件 弹性计算 运维
云消息队列RabbitMQ实践
本评测报告详细分析了阿里云云消息队列 RabbitMQ 版的实践原理、部署体验及核心优势。报告认为其在解决消息积压、脑裂难题及弹性伸缩方面表现优秀,但建议进一步细化架构优化策略和技术细节描述。部署文档详尽,对初学者友好,但仍需加强网络配置和版本兼容性说明。实际部署展示了其高可用性和成本优化能力,适用于高并发消息处理和分布式系统数据同步。为进一步提升方案,建议增加安全性配置指导、性能调优建议及监控告警系统设置。
|
1天前
|
消息中间件 监控 测试技术
云消息队列RabbitMQ实践 - 评测
根据反馈,对本解决方案的实践原理已有一定理解,描述整体清晰但需在消息队列配置与使用上增加更多示例和说明以助理解。部署体验中获得了一定的引导和文档支持,尽管文档仍有待完善;期间出现的配置文件错误及依赖库缺失等问题已通过查阅资料解决。设计验证展示了云消息队列RabbitMQ的核心优势,包括高可用性和灵活性,未来可通过增加自动化测试来提高系统稳定性。实践后,用户对方案解决问题的能力及适用场景有了明确认识,认为其具有实际生产价值,不过仍需在性能优化、安全性增强及监控功能上进行改进以适应高并发和大数据量环境。
8 0
|
26天前
|
消息中间件
手撸MQ消息队列——循环数组
队列是一种常用的数据结构,类似于栈,但采用先进先出(FIFO)的原则。生活中常见的排队场景就是队列的应用实例。在数据结构中,队列通常用数组实现,包括入队(队尾插入元素)和出队(队头移除元素)两种基本操作。本文介绍了如何用数组实现队列,包括定义数组长度、维护队头和队尾下标(front 和 tail),并通过取模运算解决下标越界问题。此外,还讨论了队列的空与满状态判断,以及并发和等待机制的实现。通过示例代码展示了队列的基本操作及优化方法,确保多线程环境下的正确性和高效性。
25 0
手撸MQ消息队列——循环数组
|
2月前
|
消息中间件 存储 Java
【揭秘】RocketMQ内部运作大揭秘:一探究竟,原来消息队列是这样工作的!
【8月更文挑战第19天】RocketMQ是一款高性能、高可用的消息中间件,在分布式系统中至关重要。它采用发布/订阅模式,支持高吞吐量的消息传递。核心组件包括管理元数据的NameServer、存储消息的Broker以及Producer和Consumer。RocketMQ支持发布/订阅与点对点两种模型,并具备复杂的消息持久化和路由机制。通过Java API示例,可轻松实现消息的发送与接收。RocketMQ凭借其出色的特性和可靠性,成为大型分布式系统首选的消息解决方案。
58 5