消息队列(RocketMQ)作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。
RocketMQ核心的四大组件:NameServer、Broker、Producer、Consumer每个组件都可以部署成集群模式进行水平扩展。
如果搞懂这份RocketMQ实战与原理解析,在简历上写精通RocketMQ完全没问题
RocketMQ实战原理解析从入门到生产环境、分布式消息列队、可靠性、吞吐量、Apache中间件、NameServer源码、主从同步,最后基于Netty的通信实现
本篇幅可以让你了解RocketMQ和分布式消息队列的功能,然后搭建好单机版的消息队列,进而能够发送并接收简单的消息。
在生产环境中使用RocketMQ集群需要比QuickStart部分了解更多的内容,本章节在机器角色、集群配置和部署,以及集群管理方面都做了介绍,用户可以基于这些内容搭建起一个生成环境的RocketMQ消息队列集群,在数据量不大的非关键场景,可以通过这一章节快速上线。
对消息队列使用者来说,Consumer和Producer是打交道最多的两个类型。
本篇详细介绍了两种类型的Consumer和一种类型的Producer,用户在使用的时候基于业务需求来选择合适的类型。最后重点介绍了Offset和Log,了解Offset机制是正确使用RocketMQ的基础,合理使用Log可以大幅提高开发、调试的效率。
介绍了NameServer的功能,NameServer在RocketMQ集群中扮演调度中心的角色。
各个Producer、Consumer上报自己的状态上去,同时从NameServer获取其他角色的状态信息。NameServer的功能虽然非常重要,但是被设计得很轻量级,代码量少并且几乎无磁盘存储,所有的功能都通过内存高效完成。
还介绍了底层的通信机制,RocketMQ基于Netty对底层通信做了很好的抽象,使得通信功能逻辑清晰,代码简单。
介绍了RocketMQ消息队列实现的难点及核心,即“队列”本身的实现,基于磁盘做一个读写效率高的队列并非易事,实现不好就会使磁盘操作成为整个系统的瓶颈,无法提升系统的吞吐量。RocketMQ基于“顺序写”“随机读”的原则来设计,利用“零拷贝”技术,克服了磁盘操作的瓶颈。
另一个难点是为了高可用性而设计的主从机制,数据被及时复制到多个机器,这样当一台机器出故障后,整体系统依然可用。这样可靠性和性能能直接有个权衡,RocketMQ把选择权留给用户,用户根据具体的业务场景来选择要更高的可靠性,还是要更高的效率。
本篇根据使用场景,讨论如何“可靠”地收发消息。即在要求消息顺序的场景下,如何既能并发执行,又能保证消息顺序;然后分析可能的故障场景下,如何应对以保证不丢消息、不中断服务。RocketMQ在设计上,有重试机制来保证消息不丢,造成的结果是可能存在消息重复,这一点需要用户根据具体业务场景来处理。下一章将讨论处理大数据量消息的方法。
另一个提高吞吐量的方法是增加集群的机器数量,提高并发性,要根据实际场景增加Broker、Consumer或Producer角色的机器数量。
作为一个中间件产品,会比普通软件更多地需要和其他系统打交道,本篇介绍了如何与SpringBoot、Spark、Flink等软件进行交互。同时介绍了使用云端的RocketMQ产品,以及自定义开发运维工具的方法。
RocketMQ是阿里最优秀的中间件之一,本篇介绍了RocketMQ的历史,以及其目前作为Apache顶级项目的现状。
本篇分析了NameServer模块的源码,NameServer是--个功能重要但是代码量不大的模块,所以选择这个模块入手,比较容易理解。我们在分析源码时,认真读懂一个模块后就可以对作者的代码风格、设计偏好等有基本的了解。
本篇分析的是Client模块里的代码,我们在使用RocketMQ的时候,更多的是和这个模块里的代码打交道。本章重点分析了DefaultMQPushConsumerImpl类,然后分析了Consumer的并发处理过程,最后分析了客户端Class统一的底层通信类MQClientInstance。
本篇分析了Master和Slave角色的Broker之间同步信息功能的实现。需要同步的信息分为两种类型,实现方式各不相同:一种是元数据信息,采用基于Netty的command方式来同步消息;另一种是commitLog信息,同步方式是直接基于JavaNIO来实现。
本篇介绍了RocketMQ底层通信的实现机制,由于它是基于Netty来实现的,所以首先介绍了Netty的基础知识。Netty被用在很多开源软件的底层通信部分,RocketMQ以Netty为基础,还实现了-种机制,把通信功能和消息处理功能分离,不同类型的通信内容被抽象成发送带有对应类型代码的Command,同时根据类型代码查找对应的Processor和Executor来执行,结构非常清晰,为我们自己实现网络通信程序提供了参考。