
《Apache RocketMQ 从入门到实战》阅读笔记开篇我的另一种参与 RocketMQ 开源社区的方式一、与 RocketMQ 相识、相知到“在一起” 在 2017 年听到阿里巴巴将 RocketMQ 捐赠给 Apache 基金会成为 Apache 的顶级项目 说到参与开源项目很多人都理解为成为一名 Committer 才能算式参与到开源社区的建设但其实这个就是参与开源项目有代码层面的贡献也有非代码贡献层面的如技术布道、社区运营线上直播、线下活动、文档编辑等。 RocketMQ 创始人冯嘉大神 RocketMQ 中国社区负责人青峰大佬 参与开源的另外一种方式做一个开源项目的传播者让更多人更容易的应用它即降低大众对它的使用门槛。二、如何成为开源项目的 Committer 有针对性的学习有使用需求或许学习动力更强劲学习效率更高效。 参与开源一个最基本的条件是拥有大量的连续时间想要成为一个开源框架的 Committer ,唯有坚持不懈持续投入持续产出。 希望广大读者朋友们积极参与开源社区贡献一份自己的力量同事打造自身影响力助力职场步步高升。1.1 RocketMQ 核心概念扫盲篇一、RocketMQ 部署架构 在 RocketMQ 中主要的组件如下1. Nameserver Nameserver 集群topic 的路由注册中心为客户端发现 Topic 提供路由服务从而引导客户端向 Broker 发送消息。Nameserver 之间的节点不通信。路由信息在Nameserver 集群中数据一致性采取的最终一致性。2. Broker 消息存储服务器分为两种角色Master 与 Slave上图中呈现的就是 2 主 2 从的部署架构在 RocketMQ 中主服务承担读写操作从服务器作为一个备份当主服务器存在压力时从服务器可以承担读服务消息消费。所有 Broker包含 Slave 服务器每隔30s 会向 Nameserver 发送心跳包心跳包中会包含存在在 Broker 上所有的 topic 的路由信息。3. Client 消息客户端包括 Producer(消息发送者)和 Consumer(消费消费者)客户端在同一时间只会连接一台 nameserver只有在连接出现异常时才会尝试连接另外一台。客户端每隔 30s 向 Nameserver 发起 topic 的路由信息查询。二、消息订阅模型 RocketMQ 的消息消费模式采用的是发布与订阅模式。 topic一类消息的集合消息发送者将一类消息发送到一个主题中例如订单模块将订单发送到 order_topic 中而用户登录时将登录事件发送到 user_login_topic 中。 consumegroup消息消费组一个消费单位的“群体”消费组首先在启动时需要订阅需要消费的 topic。一个 topic 可以被多个消费组订阅同样一个消费组也可以订阅多个主题。一个消费组拥有多个消费者。 例如我们在开发一个订单系统在该项目中会创建一个消费组 order_consumer 来订阅 order_topic其中有一个子系统order-service-apporder-service-app 部署了 3 台服务器每一个 jvm 进程可以看做是 order_consumer 消费组的其中一个消费者。1. 消费模式 那这三个消费者如何来分工来共同消费 order_topic 中的消息呢 在 RocketMQ 中支持广播模式与集群模式。 **广播模式**一个消费组内的所有消费者每一个都会处理 topic 中的每一条消息。 **集群模式**一个消费组内的所有消费者共同消费一个 topic 中的消息即分工协作启动负载均衡一个消费者消费一部分数据。 集群模式是非常普遍的模式符合分布式架构的基本理念即横向扩容当前消费者如果无法快速及时处理消息时可以通过增加消费者的个数横向扩容快速提高消费能力及时处理挤压的消息。2. 消费队列负载算法与重平衡机制 例如上面实例中 order_topic 有 16 个队列那一个拥有 3 个消费者的消费组如何来分配队列。在 MQ 领域有一个不成文的约定同一个消费者同一时间可以分配多个队列但一个队列同一时间只会分配给一个消费者。3. 消费进度 消费者消费一条消息后需要记录消费的位置这样在消费端重启的时候继续从上一次消费的位点开始进行处理新的消息。在 RocketMQ 中消息消费位点的存储是以消费组为单位的。 集群模式下一个 Topic 下的多个队列并分给消费者组中的多个消费者每个消费者负责自己分配到的队列中的消息。4. 消费模型 RocketMQ 提供了并发消费、顺序消费两种消费模型。 并发消费模型中消息消费失败默认会重试 16 次每一次的间隔时间不一样而顺序消费如果一条消息消费失败则会一直消费直到消费成功。故在顺序消费的使用过程中应用程序需要区分系统异常、业务异常如果是不符合业务规则导致的异常则重试多少次都无法消费成功这个时候一定要告警机制及时进行人为干预否则消费会积压。三、事务消息 将订单存储关系型数据库中和将消息发送到 MQ 这是两个不同介质的操作如果能保证消息发送、数据库存储这两个操作要么同时成功要么同时失败RocketMQ 为了解决该问题引入了事务消息。四、定时消息 所谓的定时消息就是将消息发送到 Broker但消费端不会立即消费而是要到指定延迟时间后才能被消费端消费。五、消息过滤 消息过滤是指消费端可以根据某些条件对一个 topic 中的消息进行过滤即只消费一个主题下满足过滤条件的消息。 RocketMQ 目前主要的过滤机制是基于 tag 的过滤与基于消息属性的过滤基于消息属性的过滤支持 SQL92 表达式对消息进行过滤。六、小结 本文的主要目的是介绍 RocketMQ 常见的术语从下一篇开始将正式开始 RocketMQ 之旅开始学习消息发送1.2 生产环境中autoCreateTopicEnable 为什么不能设置为 true一、现象 很多网友会问为什么明明集群中有多台 Broker 服务器autoCreateTopicEnable设置为 true表示开启 Topic 自动创建但新创建的 Topic 的路由信息只包含在其中一台Broker 服务器上。 期望值为了消息发送的高可用希望新创建的 Topic 在集群中的每台 Broker 上创建对应的队列避免 Broker 的单节点故障。1.3 实战RocketMQ 学习环境搭建指南篇一、Linux 安装 RocketMQ、RocketMQ-Console1. 安装 RocketMQ Step1从如下地址下载 RocketMQ 安装包。cd/opt/applicationwgethttps://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip Step2解压安装包。unziprocketmq-all-4.7.1-bin-release.zipls-l Step3修改 Nameserver jvm 参数。cdbinvirunserver.sh# 定位到如下代码JAVA_OPT${JAVA_OPT}-server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize1 28m -XX:MaxMetaspaceSize320m# 修改 -Xms -Xmx -Xmn 参数JAVA_OPT${JAVA_OPT}-server-Xms512M-Xmx512M-Xmn256M-XX:MetaspaceSize128m-XX:MaxMetaspaceSize320m 温 馨 提 示 这 里 修 改 J V M 参 数 主 要 目 的 是 个 人 学 习 电 脑 内 存 不 够 默 认NameServer 会占用 4G。 Step4启动 nameserver。nohup./mqnamesrv 查看${user_home}/logs/rocketmqlogs/namesrv.log 日志文件。 Step5修改 broker 的配置文件。viconf/broker.conf# 使用如下配置文件brokerClusterNameDefaultCluster brokerNamebroker-a brokerId0deleteWhen04 fileReservedTime48brokerRoleASYNC_MASTER flushDiskTypeASYNC_FLUSHstorePathRootDir/data/rocketmq/storestorePathCommitLog/data/rocketmq/store/commitlognamesrvAddr127.0.0.1:9876brokerIP1192.168.3.10brokerIP2192.168.3.10autoCreateTopicEnablefalse Step6修改 broker jvm 参数。cdbinvirunbroker.sh#修改如下配置(配置前)JAVA_OPT${JAVA_OPT}-server -Xms8g -Xmx8g -Xmn4g#配置后JAVA_OPT${JAVA_OPT}-server -Xms1g -Xmx1g -Xmn512m Step7启动 broker。cdbinnohup./mqbroker-c../conf/broker.conf 查看${user_home}/logs/rocketmqlogs/broker.log。 经过上面的步骤就成功在 Linux 环境上安装了 RocketMQ Nameserver 服务器与Broker 服务器。