RocketMQ入门
前言
本文仅仅用作RocketMQ的简单介绍
,仅仅包含RocketMQ的起源,特点
等基础信息。
什么是RocketMQ
Apache RocketMQ
是一个开源的分布式消息中间件系统
,最初由阿里巴巴集团
开发并捐赠给 Apache 软件基金会
,成为 Apache 顶级项目。RocketMQ
最早于 2012
年开始在阿里巴巴内部
使用,并于 2016
年成为 Apache 顶级项目
。以下是其简要发展史:
-
起源: RocketMQ 最早起源于
阿里巴巴集团内部
,作为其消息中间件
的解决方案。最初是为了满足大规模分布式系统下的高吞吐量、低延迟和高可靠性的消息传递
需求。 -
Apache 孵化: 在经历了一段时间的内部发展和测试之后,
阿里巴巴将 RocketMQ 作为开源项目捐赠给了 Apache 软件基金会
。随后,RocketMQ 进入 Apache 孵化器,并于 2016 年成为了 Apache 顶级项目。 -
功能特点: RocketMQ 提供了
高可用、高性能、低延迟的分布式消息传递服务
。它支持消息的事务性处理、顺序消息传递、多队列模型
等特性,同时具备良好的可伸缩性和扩展性
,能够满足大规模分布式系统的消息通信需求。 -
持续发展: 作为一个 Apache 顶级项目,
RocketMQ 持续得到开源社区的贡献和支持
。它不断地进行功能增强、Bug 修复以及性能优化,同时还提供了多种客户端语言的支持
,如 Java、C++、Go 等。
这里的Rocket
意为火箭,表示速度很快
,MQ
指的是Message Queue(消息队列)
。
消息
这里的消息指的是:Rocket中的最小的数据单元
可能是文本、JSON、XML 或二进制数据等形式,包含了系统间通信所需的信息
什么是MQ(消息队列)
消息队列(Message Queue)
是一种通信模式
,用于在分布式系统
中进行异步
通信。它允许不同的组件或应用程序在系统之间发送消息,而无需立即知道接收方的状态或立即处理该消息
。消息队列
通常由消息中间件
支持,用于提供异步通信
和解耦合
的能力。
主要特点包括:
-
异步通信: 发送方将
消息
放入队列,而接收方稍后从队列中接收和处理消息
。这种异步通信模式可以降低系统的耦合性,允许独立的部分并行工作,并提高系统的灵活性和可扩展性。 -
解耦合: 发送方和接收方
不需要直接相互通信
,它们通过共享的队列进行消息传递
。这种解耦合的方式允许系统中的不同部分独立进行操作,而不会受到其他部分状态或性能的影响。 -
持久化: 消息通常会
被持久化,以防止数据丢失
。即使接收方当前不可用,消息也会被保存在队列中,直到接收方准备好处理它们为止。 -
消息分发: 消息队列允许
多个接收方订阅相同的消息,并进行消息分发
,使得多个接收方能够同时获取并处理相同类型的消息。
消息队列可以帮助处理大量的消息传递
,提供一种弹性、高效且可靠的
通信方式,从而支持系统的稳定性和性能
。
RocketMQ能做什么
-
消息传递: 支持
可靠、快速
的消息传递
。它允许在分布式系统
中发送和接收消息,用于实现异步通信、系统集成和解耦合。 -
高可用性和可靠性: 提供高
可用性和数据可靠性
。消息被持久化存储,即使在发生故障时也不会丢失
。 -
高性能: 能够实现
高吞吐量和低延迟
的消息处理。它适用于处理大量消息
以及对低延迟和高性能有要求的场景。 -
顺序消息传递: 能够保证消息
按照发送的顺序进行传递和处理
,这对于需要特定顺序的应用场景非常重要。 -
分布式部署: 能够实现
分布式部署
,支持横向扩展
,以便更好地应对大规模系统的需求。 -
灵活性: 提供
多种消息模式和特性
,包括发布/订阅模式、点对点模式、事务消息等,能够适应不同的应用场景和需求。 -
监控和管理: 提供丰富的
监控和管理
功能,帮助用户监视系统状态
、消息流和性能指标。
现被广泛应用于金融、电商、物流
等领域,用于异步通信、日志采集、实时计算
等多种场景。
常见MQ产品及其优缺点
以下是一些常见的MQ系列产品
及其主要优缺点
RocketMQ
优点
- 单机吞吐量可达
十万级
,可以支持大规模的消息堆积和处理
。 可用性非常高
,分布式
架构,支持主从同步和异步复制
,以及容灾切换
。- 消息
可靠性高
,经过参数优化配置,可以做到零消息丢失
。 功能支持丰富
,支持发布/订阅、请求/响应、事务消息、顺序消息、延时消息等。- 源码是
Java语言
,易于阅读和定制,有阿里品牌保障。 - 支持
大量的topic数量
,不会影响吞吐量和性能
。
缺点
- 社区活跃度
一般
,文档相对简单
,更新频率较低。 - 接口不是按照标准JMS规范走的,
迁移成本较高
。 - 需要
较多的机器资源
,部署和运维相对复杂
。
Kafka
是LinkedIn
开源的一个分布式的提交日志系统
,主要用于大数据的实时处理和日志收集
,具有超高的吞吐量、低延迟、高可用性和可扩展性
等特点。
优点
- 单机吞吐量
可达十万级
,适合高并发和海量数据
的场景。 - 时效性
低至毫秒级
,支持实时的数据分析和处理
。 - 可用
性非常高
,少数机器宕机不会丢失数据和影响可用性
。 - 功能
相对简单
,主要支持简单的MQ功能
,易于使用和集成。 - 分布式
可以任意扩展
,支持在线
水平扩展。
缺点
topic数量对吞吐量有较大的影响
,同等机器下,topic越多,吞吐量越低
,需要增加更多的机器资源。- 消费者
采用短轮询方式
,实时性取决于轮询间隔时间
,可能导致消息重复消费或者延迟消费
。 不支持消息顺序
,如果一台代理宕机,就会产生消息乱序的情况。不支持消息过滤,只能根据topic进行订阅
,需要消费者自己处理不感兴趣
的消息。- 社区
更新较慢
,存在一些已知的bug和性能问题。
RabbitMQ:
一个基于AMQP协议
的可复用的企业消息系统
,主要用于解耦和异步
的场景,具有高性能、低延迟、高可用性和丰富的功能
等特点。
优点
- 单机吞吐量可达
万级
,性能较好,高并发。 时效性低至微秒级
,延迟最低,适合实时性要求高的场景。- 可用性高,基于
主从架构实现高可用性
,支持集群和镜像
模式。 - 消息可靠性高,
支持事务和持久化
,可以做到零消息
丢失。 功能支持丰富,支持多种消息模式
,如发布/订阅、路由、主题、远程过程调用等。支持多种语言客户端
,如Java、Python、Ruby、.NET等。- 开源
提供的管理界面
,易于使用和监控。 社区活跃度高
,更新频率高,文档齐全,问题容易解决。
缺点
吞吐量相对较低
,不适合大数据量的场景。集群动态扩展比较麻烦
,需要手动添加或删除节点。- 源码是
Erlang
语言,难以阅读和定制
,依赖于社区的维护和修复。 - 需要
学习比较复杂的接口和协议
,学习和维护成本较高。
ActiveMQ(很少用到了)
Apache
旗下的一个老牌的消息中间件
,主要用于解耦和异步
的场景,具有高可用性、高可靠性和丰富的功能等特点。
优点
- 单机
吞吐量可达万级
,性能较好,高并发。 时效性低至毫秒级,适合实时性要求较高的场景
。可用性高,基于主从架构实现高可用性
,支持集群和网络连接器模式。- 消息
可靠性高,支持事务和持久化
,有较低的概率丢失数据。 - 功能支持丰富,
支持多种消息模式
,如发布/订阅、点对点、请求/响应等,以及多种传输协议
,如TCP、UDP、HTTP等。 - 支持
多种语言客户端
,如Java、C#、C++等。 - 源码是
Java
语言,易于阅读和定制。 - 在业内有
很多的应用案例和经验
,问题容易解决。
缺点
吞吐量相对较低
,不适合大数据量的场景。社区活跃度较低
,更新频率较低,存在一些已知的bug和性能问题。集群动态扩展比较麻烦
,需要手动添加或删除节点。接口和协议比较复杂
,学习和维护成本较高。