RocketMQ 源码学习 1 : 整体结构

来源:谢晞鸣 , fdx321.github.io/2017/08/16/【RocketMQ源码学习】1-总体架构/

1.为什么是RocketMQ

为什么是 RocketMQ,而不是 ActiveMQ/RabbitMQ/Kafka 呢?这不是技术选型,我只是想找一个业界比较好的、开源的 MQ 系统,学习一下 MQ 的工作原理。所以首选 Java 的(虽然语言对我来说不是问题,然还是有点学习成本的),这就只剩下 RocketMQ 和 ActiveMQ 了,这两个那就肯定 选RocketMQ 了,毕竟人家是这么吹牛逼的: “万亿级数据洪峰下的分布式消息引擎”。

2.项目结构

  • benchmark, 一些 sh 脚本,调用 example 模块中的 benchmark Producer/Consumer 来做一些测试
  • broker, 消息代理,起到串联 Producer/Consumer 和 Store 的作用
  • client,包含 Producer 和 Consumer,负责消息的发和收
  • common,一些公共代码,供其他模块依赖
  • distribution, 一些 sh 脚本和 配置,主要是在部署的时候用的
  • example,使用样例,包括各种使用方法,Pull模式、Push模式、广播模式、有序消息、事务消息等等
  • filter,过滤器,用于服务端 SQL92 的过滤方式
  • filtersrv, 过滤器 server, 用于消费端过滤,主要负责动态的加载和实例化过滤器
  • logappender,日志相关
  • namesrv,可以理解成注册中心,每个 broker 都会在这里注册,client 也会从这里获取 broker 的相关信息
  • openmessaging, 讲真,还没去了解,应该是类似于 opentracing 这种,按照一套标准(或者叫API),封装了一下RocketMQ原来的接口,让其可以通用一点。我猜的!
  • remoting,基于 Netty 实现的网络通信模块,包括 Server 和 Client, client、broker、filtersrv 等模块对它都有依赖
  • srvutil, 里面只有两个类,一个是来处理命令行的,一个是来配置 shutdownHook 的
  • store,负责消息的存储和读取
  • style,代码模板,为了统一代码风格
  • test, 测试用例
  • tools, 一些工具类,基于它们可以写一些 sh 工具来管理、查看MQ系统的一些信息

3.我的重点关注

这么多模块,我并不是每一个都一行行代码的去读,像 distribution、test、tools 这些我就大概扫了一眼。那么哪些是我重点关注的呢?主要是 broker、client、common、namesrv、store、remoting,这几个是核心模块,值得认真研读,其它模块不要它们也能跑起来。

4.RocketMQ逻辑部署结构

这是 RocketMQ 的逻辑部署结构(参考《RocketMQ原理简介 v3.1.1》),包括 producer/broker/namesrv/consumer 四大部分。namesrv 起到注册中心的作用,部署的时候会用到 rocketmq-namesrv/rocketmq-common/rocketmq-remoting 三个模块的代码;broker 部署的时候会用到 rocketmq-broker/rocketmq-store/rocketmq-common/rocketmq-remoting 四个模块的代码;producer 和 consumer 会用到 rocketmq-client/rocketmq-common/rocketmq-remoting 三个模块的代码,这里虽然将它们分开画了,但实际上一个应用往往既是producer又是consumer。

Consumer 和 Broker 之间其实还可以加一个 filtersrv,用来做消费端的消息过滤。

这里面还有几个概念:

  • Producer Group, 一类 Producer 的集合的名称
  • Consumer Group, 一类 Consumer 的集合的名称
  • Topic, 消息的主题,用来标识一类消息,还有 Tag 可以用来区分一个 Topic 下的多种消息。

Producer Group、Consumer Group 和 Topic 之间并没有强制的某种关系,一个 Producer Group 可以发多个 Topic 的消息,一个 Consumer Group 也可以消费多个 Topic 的消息。一个Consumer Group 可以消费来自多个 Producer Group的消息,一个 Producer Group 的消息也可以被多个 Consumer Group 消费。

Reference

  • RocketMQ 原理简介 http://alibaba.github.io/RocketMQ-docs/document/design/RocketMQ_design.pdf
  • 分布式开放消息系统(RocketMQ)的原理与实践 http://www.jianshu.com/p/453c6e7ff81c

原文发布于微信公众号 - 精讲JAVA(toooooooozi)

原文发表时间:2018-06-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

JMS与ActiveMQ

JMS是Java消息服务的缩写,它提供了一种以松耦合且灵活的方式对应用进行集成的机制。JMS以异步的方式在应用之间进行数据的存储转发。应用之间以MOM(面向消息...

22850

使用CoreOs,Docker和Nirmata部署微服务类型的应用

随着采用应用容器的持续增长,设计用于运行容器的“最小”操作系统正在普及。CoreOS就是这样的一个操作系统。CoreOs是为运行现代云原生应用,并为Docker...

316100
来自专栏云计算

教你五分钟在笔记本电脑上部署容器化应用程序

按照以下步骤设置Nirmata并部署应用程序:

21970
来自专栏运维前线

使用CentOS7 kvm虚拟机安装蓝鲸社区版(3.15)

使用C7 kvm虚拟机安装蓝鲸平台 蓝鲸介绍 蓝鲸官网: http://bk.tencent.com/ 蓝鲸社区版本下载:http://bk.tencent.c...

35660
来自专栏pangguoming

Centos下Yum安装PHP5.5,5.6,7.0

默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep p...

98130
来自专栏匠心独运的博客

消息中间件—RocketMQ消息消费(一)

文章摘要:在发送消息给RocketMQ后,消费者需要消费。消息的消费比发送要复杂一些,那么RocketMQ是如何来做的呢? 在RocketMQ系列文章的前面几...

45630
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装和配置Salt Master和Minion服务器

SaltStack是一个功能强大,灵活,高性能的配置管理和远程执行系统。它可用于从集中位置管理您的基础架构,同时最大限度地减少手动维护步骤。

32200
来自专栏杂烩

ActiveMQ集群部署 转

(摘自:http://www.open-open.com/lib/view/open1400126457817.html)

12210

使用CoreOs,Docker和Nirmata来部署微服务风格的应用程序

随着应用程序容器(application container)的技术越来越被大众接受,设计用于运行容器的“最轻量级”操作系统正在变得非常流行。CoreOS便是这...

41670
来自专栏MessageQueue

Pulsar-Producer实现分析

“Pulsar is a distributed pub-sub messaging platform with a very flexible messagi...

18120

扫码关注云+社区

领取腾讯云代金券