RocketMQ如何支持更多队列(翻译)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: RocketMQ怎样支持更多队列

简述

Kafka是一个分布式流处理平台,它诞生自日志聚合案例。它不需要太高的并发性。在阿里的大规模案例中,我们发现
原始模式不能满足我们的事件需求。因此,我们开发了一个名为RocketMQ的消息中间件,来解决更广泛的使用场景,从传统的发布/订阅情景到超大容量的不容忍消息丢失的事物系统。现在,在阿里,RocketMQ集群每天处理超过5000亿次事件,为3000多核心应用提供服务。

kafka的分区设计

  1. 生产者的并行写受分区数量的限制。
  2. 消费者的消费并行级别同样受到消费分区数量的限制。假设最大分区数量是20,当前消费中的消费者最大数量也只能是20.
  3. 每个主题由固定数量的分区组成。分区数量决定单个broker可能拥有的最大主题数,而不会显著的影响性能。

更多详情请参考这里

为什么Kafka不支持更多分区

  1. 每个分区都存储着所有的消息数据。尽管每个分区都按照顺序写盘,但随着并发写入分区的数量增加,从操作系统层面来说,写入就变的随机。
  2. 由于数据文件的分散,使用Linux IO组提交机制会比较困难。

Rocket如何支持更多分区?

111111

  1. 所有的消息数据存储在提交日志文件。所有的写操作都是完全有序的,而读操作是随机的。
  2. 消费队列存储用户实际消费位置信息,这些消息也可以以顺序方式刷到磁盘。
优势
  1. 每个消息队列都是轻量级的,并且包含有限的元数据。
  2. 访问磁盘是完全按序的,这也会避免磁盘锁的争夺,当大量队列被创建也不会引发高磁盘IO等待。
劣势
  1. 消息消费会首先读取消费队列,然后是提交日志。这个过程将会带来一定的成本,在最坏的情况下。
  2. 提交日志和消费队列需要保证逻辑一致,这将会给编程模型带来额外的复制性。
动机
  1. 随机读。尽可能多的读取以提高页面缓存的命中率,减少读取IO操作。因此大容量内存依然是更可取的。如果大量消息堆积,读性能会不会下降很严重?答案是否定的,理由如下:
1,即使消息的大小只有1KB,系统也会提前读取更多数据。这意味着后续数据的读取,这将访问主存储器,而不是缓慢的磁盘IO读取。
2,从磁盘随机访问提交日志。在SSD情况下将I/O调动程序设置为NOOP,读qps将显著提速,这样会比电梯调度算法更快。
  1. 鉴于消费队列仅保存固定大小的元数据,主要用来记录消费进度,因此会很好的支持随机读。拥有页面缓存预取的优势,访问消费队列同访问主内存一样快,即使在大量消息堆积的情况下。作为结果,消费队列不会对读性能带来明显的损失。
  2. 提交日志保存几乎所有的信息,包括消息数据。类似关系数据库的重做日志,只要提交日志存在,消费队列,消息健索引和所有其他所需数据都能被完全恢复。
相关实践学习
消息队列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
目录
相关文章
|
7月前
|
消息中间件 Java Spring
SpringBoot实现RabbitMQ的简单队列(SpringAMQP 实现简单队列)
SpringBoot实现RabbitMQ的简单队列(SpringAMQP 实现简单队列)
57 1
|
2月前
|
消息中间件 存储 监控
RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察
RabbitMQ 是一个功能强大的消息代理,用于分布式应用程序间的通信。它通过队列临时存储消息,支持异步通信和解耦。经典队列适合高吞吐量和低延迟场景,而仲裁队列则提供高可用性和容错能力,适用于关键任务系统。选择哪种队列取决于性能、持久性和容错性的需求。
190 6
|
3月前
|
消息中间件 JSON Java
|
3月前
|
消息中间件
rabbitmq,&队列
rabbitmq,&队列
|
3月前
|
消息中间件 JSON Java
玩转RabbitMQ声明队列交换机、消息转换器
玩转RabbitMQ声明队列交换机、消息转换器
99 0
|
4月前
|
消息中间件 存储 NoSQL
MQ的顺序性保证:顺序队列、消息编号、分布式锁,一文全掌握!
【8月更文挑战第24天】消息队列(MQ)是分布式系统的关键组件,用于实现系统解耦、提升可扩展性和可用性。保证消息顺序性是其重要挑战之一。本文介绍三种常用策略:顺序队列、消息编号与分布式锁,通过示例展示如何确保消息按需排序。这些方法各有优势,可根据实际场景灵活选用。提供的Java示例有助于加深理解与实践应用。
117 2
|
5月前
|
消息中间件 RocketMQ
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
|
5月前
|
消息中间件 Java Kafka
说说RabbitMQ延迟队列实现原理?
说说RabbitMQ延迟队列实现原理?
74 0
说说RabbitMQ延迟队列实现原理?
|
5月前
|
消息中间件 NoSQL 关系型数据库
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
148 1
|
6月前
|
消息中间件 存储 监控
RabbitMQ 死信队列
RabbitMQ的死信队列(DLQ)是存储无法正常消费消息的特殊队列,常见于消息被拒绝、过期或队列满时。DLQ用于异常处理、任务调度和监控,通过绑定到普通队列自动路由死信消息。通过监听死信队列,可以对异常消息进行补偿和进一步处理,提升系统稳定性和可维护性。
104 1