一个网站用两个域名,广告公司排名,网站开发自学网站,长春有几个站可以坐火车RocketMQ 的设计理念与源码阅读技巧 一、设计理念二、源码设计三、源码阅读技巧 一直想仔细仔细看看这个 RocketMQ 的源码#xff0c;学学它的设计思想和编码风格#xff0c;没准在以后自己在设计和编码的时候有思考的方向。这是专栏的第一篇 —— 介绍下 RocketMQ 的一些设计… RocketMQ 的设计理念与源码阅读技巧 一、设计理念二、源码设计三、源码阅读技巧 一直想仔细仔细看看这个 RocketMQ 的源码学学它的设计思想和编码风格没准在以后自己在设计和编码的时候有思考的方向。这是专栏的第一篇 —— 介绍下 RocketMQ 的一些设计懂其设计和原理才能更好地阅读源码. RocketMQ 是阿里巴巴开发的开发之前他们也使用过当时流行的 Kafka 作为自己的解决方案但是是说它没法满足低延迟、高可靠的要求Kafka 若分区多了对磁盘写来说会出现大量随机写的情况写入性能会下降很多这里说的低延迟与实际使用方式和数据存储实现有关系当然还有其它原因所以它们决定开发一款新的消息传递引擎来满足自己的业务需求。 上面内容来自RocketMQ 官方文档
一、设计理念
咱先聊聊设计一款消息中间件需要具备的要素设计一款消息队列中间件首先它需要对外提供通信路口提供生产、消费消息的路口即需要具备网络通信能力其次就是它得具备数据存储的能力这数据包含消息本身与元数据存储。 了解完设计消息队列的必要元素咱来看看 RocketMQ 的技术架构 主要由四部分组成
NameServer 被用来当做信息管理的注册中心主要是用来管理元数据路由信息。Kafka 元数据管理是用的 Zookeeper而 RocketMQ 是自己写了一个服务实现这个元数据注册中心写的这个服务被称为 NameServerNameServer 被设计出来是一种无状态的即 NameServer 集群之间是不通信的这样做一方面可以满足实际需求的前提下路由信息无需保障集群之间强一致性可以容忍分钟级别的不一致相比 Zookeeper 性能也有极大的提升。 Broker 主要用来做消息存储的服务 Producer、Consumer 消息队列的客户端除了实现消息的发送消费外RocketMQ 很多功能交给了客户端进行实现减轻消息中间件的实现复杂度像消息生产的高可用、消息顺序消费、消费幂等等等这些功能都是交由客户端实现的。
二、源码设计
看源码第一步就是下载源码https://github.com/apache/rocketmq 随后了解一下源码的目录结构 RocketMQ核心目录说明如下
acl权限控制模块brokerbroker模块broker启动进程client消息客户端包含消息生产者和消息消费者相关类common公共包dev开发者信息非源码distribution打包分发目录非源码exampleRocketMQ示例代码filter消息过滤相关基础类logappender日志实现相关类logging自主实现日志相关类namesrvNameServer实现相关类NameServer启动进程openmessaging消息开放标准已发布remoting远程通信模块基于Nettysrvutil服务器工具类store消息存储实现相关类stylecheckstyle相关实现test测试相关类tools工具类监控命令相关实现类
RocketMQ 的网络通信是基于 Netty 实现的这里需要提一下它是如何设计接收网络消息去执行任务的如何进行的编码设计使得它更具拓展更灵活。 其实在服务端NameServer、Broker/客户端Producer、Consumer中都维护了一个 processorTable是一个 k-v 集合key 是服务码 requestCodevalue 是对应的执行单元 PairNettryRequestProcessor, ExecutorService 类型包含了处理 Processor 和执行线程的线程池。里面对应内容在对应业务系统启动的时候会自行注册。 客户端发送网络包的时候会携带 RequestCode服务端接收网络包后进行解码得到 RequestCode然后通过 ProcessorTable 找对应 Processor 任务拿对应线程池进行执行从而实现了异步任务执行。这种服务注册机制简洁且灵活。 类似这种使用 Netty 实现通信然后与业务结合的编码设计我在 IM 系统、货柜系统也看见过。
三、源码阅读技巧
先理解相应底层原理再去针对性的看源码实现学习编码验证原理源码阅读建议起始点 Broker 启动BrokerStartup#start、NameServer 启动NamesrvStartup#start、客户端相关的源码阅读可以从 example 目录下的用例直接入手 不太建议 Debug 阅读源码建议静态看源码看不懂的地方再尝试调试跟进。一方面是对这种能力的培养另一方面中间件源码不同于业务系统中间件源码堆栈太多容易绕晕而且很多异步书籍与博客辅助看源码 书籍推荐《RocketMQ 技术内幕》 反复看