🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、概述 RocketMQ是一个纯Java、分布式、队列模型的开源**消息中间件**,前身是MetaQ,是阿里参考Kafka特点研发的一个队列模型的消息中间件,后开源给Apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点; 简单来说,RocketMQ由 **Producer**、**Broker**、**Consumer**三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息; ![](https://img.kancloud.cn/01/4d/014dcf2c5f052c74c43dabd9255cb50c_1342x541.png) ### **价值** 消息中间件的诸多优势,使得在如今的微服务架构中能够作为一种中间件,提供许多重要的功能以解决微服务架构中的诸多痛点; 比如:消息队列可以将同步的系统调用转为异步的消息投递,一定程度上解除业务子系统间的耦合; ### **功能特点:** * 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型; * 在一个队列中可靠的先进先出(FIFO)和严格的顺序传递; * 支持拉(pull)和推(push)两种消息模式; * 单一队列百万消息的堆积能力; * 支持多种消息协议,如 JMS、MQTT 等; * 分布式高可用的部署架构,满足至少一次消息传递语义; * 提供 docker 镜像用于隔离测试和云集群部署; * 提供配置、指标和监控等功能丰富的 Dashboard; ### **核心模块:** 四大核心组成部分:**NameServer**、**Broker**、**Producer**以及**Consumer**四大部分; * rocketmq-namesrv:NameServer,类似于Zookeeper,这里保存着消息TopicName,队列等运行时的元信息; * rocketmq-broker:接受生产者发来的消息并存储(通过调用rocketmq-store),消费者从这里取得消息; * rocketmq-client:提供发送、接受消息的客户端API; * rocketmq-common:通用的一些类,方法,数据结构等; * rocketmq-remoting:基于Netty4的client/server + fastjson序列化 + 自定义二进制协议; * rocketmq-store:消息、索引存储等; * rocketmq-filtersrv:消息过滤器Server,需要注意的是,要实现这种过滤,需要上传代码到MQ!(一般而言,我们利用Tag足以满足大部分的过滤需求,如果更灵活更复杂的过滤需求,可以考虑filtersrv组件); * rocketmq-tools:命令行工具; ## 二、核心术语 ### **Producer** 负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要; ### **Consumer** 负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费; ### **Broker** 消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等; ### **Name Server** 名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表; ### **Message** 消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能; ### **Topic** 表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位; ### **Tag** 为消息设置的标志,Topic的子单位,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性; ## 三、官方最佳实践 官方给出了最佳实践的文档,可以参考,实际业务中,尽量遵循; [rocketmq/best_practice.md at master · apache/rocketmq (github.com)](https://github.com/apache/rocketmq/blob/master/docs/cn/best_practice.md)