RocketMQ 实战与进阶
本专栏由《RocketMQ 技术内幕》作者丁威老师执笔编写核心原理和设计思想,讲解通透严谨,核心知识点提供最佳实践代码。由在消息领域实战多年的梁勇老师负责编写运维实战部分,手把手教你如何做集群压测、调优、平滑运维、监控、告警设计。两位作者均通读熟悉 RocketMQ 核心源码、并在消息领域实战多年。
中间件兴趣圈
《RocketMQ技术内幕》一书作者、RocketMQ开源社区优秀布道师、CSDN2020博客之星TOP2,主打成体系剖析java中间件,已发布RocketMQ、Kafka、Dubbo、Sentinel、Canal、ElasticJob、ElasticSearch等15个专栏。
展开
-
搭建学习环境准备篇
本文主要分如下几个部分展开:Linux 服务器安装 RocketMQ、RocketMQ-ConsoleIDEA 中搭建可调试环境Linux 安装 RocketMQ、RocketMQ-Console安装 RocketMQStep1:从如下地址下载 RocketMQ 安装包cd /opt/applicationwget https://mirrors.tuna.tsinghua.ed...原创 2020-10-28 16:11:50 · 1246 阅读 · 0 评论 -
RocketMQ 核心概念扫盲篇
在正式进入 RocketMQ 的学习之前,我觉得有必要梳理一下 RocketMQ 核心概念,为大家学习 RocketMQ 打下牢固的基础。RocketMQ 部署架构在 RocketMQ 主要的组件如下。NameServerNameServer 集群,Topic 的路由注册中心,为客户端根据 Topic 提供路由服务,从而引导客户端向 Broker 发送消息。NameServer 之间的节...原创 2020-10-28 16:11:51 · 1420 阅读 · 0 评论 -
消息发送 API 详解与版本变迁说明
RocketMQ 在捐赠给 Apache 成为 Apache 基金会顶级项目之前的版本为 3.x,捐赠给 Apache 的版本号从 4.0.0 开始。由于 RocketMQ 在成为 Apache 顶级项目之前也一直在开源,故 4.0.0 版本其版本包含的内容就非常全面了,从 4.0.0 后面的进化主要是提供新的功能,例如消息轨迹、ACL、多副本等新功能,RocketMQ 的内核非常稳定,客户端的变...原创 2020-10-28 16:11:51 · 853 阅读 · 0 评论 -
结合实际应用场景谈消息发送
本篇将开始结合各种使用场景,运用合适的 API 解决具体的实际问题。消息发送方式RocketMQ 支持同步、异步、Oneway 三种发送方式。同步:客户端发起一次消息发送后会同步等待服务器的响应结果。异步:客户端发起一下消息发起请求后不等待服务器响应结果而是立即返回,这样不会阻塞客户端子线程,当客户端收到服务端(Broker)的响应结果后会自动调用回调函数。Oneway:客户端发起消息...原创 2020-10-28 16:11:52 · 848 阅读 · 0 评论 -
消息发送核心参数与工作原理详解
经过前面几篇的讲解,我相信大家对 RocketMQ 的消息发送已经有了一个较为详细的认识,已经能够非常顺畅地使用 DefaultMQProducer 相关的 API。本篇将重点关注 DefaultMQProducer 中的相关属性,以便从这些属性窥探 RocketMQ 消息发送较为底层的原理。从 DefaultMQProducer 的类图就可以看出其属性主要来源于 ClientConfig、...原创 2020-10-28 16:11:52 · 873 阅读 · 0 评论 -
消息发送常见错误与解决方案
本篇将结合自己使用 RocketMQ 的经验,对消息发送常见的问题进行分享,基本会遵循出现问题,分析问题、解决问题。No route info of this topic无法找到路由信息,其完整的错误堆栈信息如下:而且很多读者朋友会说,Broker 端开启了自动创建主题也会出现上述问题。RocketMQ 的路由寻找流程如下图所示:上面的核心关键点如下:如果 Broker 开启了自...原创 2020-10-28 16:11:53 · 12912 阅读 · 0 评论 -
事务消息使用及方案选型思考
事务消息应用场景首先需要申明的是,事务消息与业界用 RocketMQ 解决分布式事务,并不是一回事。RocketMQ 引入事务消息,主要是要解决什么问题呢?接下来以电商一个登录送积分的示例来展开本文的叙述。在互联网电商发展的初期,为了提高用户的活跃度,通常会采取这样一个提高用户活跃度:一个用户每一天首次登录送积分活动。在没有提出送积分活动时,用户登录的代码如下:public Map<...原创 2020-10-28 16:11:53 · 850 阅读 · 0 评论 -
消息消费 API 与版本变迁说明
从本篇开始我们将详细介绍 RockeMQ 的消息消费端的 API。消息消费类图RocketMQ 消费端的 API 如下图所示:其核心类图如下所示。MQAdminMQ 一些基本的管理功能,例如创建 Topic,这里稍微有点奇怪,消费端应该不需要继承该接口。该类在消息发送 API 章节已详细介绍,再次不再重复说明。MQConsumerMQ 消费者,这个接口定义得过于简单,如果该接口需要...原创 2020-10-28 16:11:54 · 579 阅读 · 0 评论 -
DefaultMQPushConsumer 核心参数与工作原理
PUSH 模式是对 PULL 模式的封装,类似于一个高级 API,用户使用起来将非常简单,基本将消息消费所需要解决的问题都封装好了,故使用起来将变得简单。与此同时,需要将其用好,那还是需要了解其内部的工作原理以及 PUSH 模式支持哪些参数,这些参数是如何工作的,在使用时有什么注意的呢?DefaultMQPushConsumer 核心参数一览与内部原理DefaultMQPushConsumer...原创 2020-10-28 16:11:54 · 1979 阅读 · 0 评论 -
DefaultMQPushConsumer 使用示例与注意事项
上篇已详细介绍了 DefaultMQPushConsumer 的核心属性与消息消费相关的理论,本篇将重点介绍在使用过程中容易出现的问题,并加以解决。ConsumeFromWhere 注意事项下面首先先看一段 RokcetMQ PUSH 模式消费者的常见使用方式:构建需要通过 setConsumeFromWhere(…) 指定从哪消费,正如上篇提到的,RocketMQ 支持从最新消息、最早消...原创 2020-10-28 16:11:55 · 2910 阅读 · 0 评论 -
DefaultLitePullConsumer 核心参数与实战
在《消息消费 API 与版本变更》中也提到 DefaultMQPullConsumer(PULL 模式)的 API 太底层,使用起来及其不方便,RocketMQ 官方设计者也注意到这个问题,为此在 RocketMQ 4.6.0 版本中引入了 PULL 模式的另外一个实现类 DefaultLitePullConsumer,即从 4.6.0 版本后,DefaultMQPullConsumer 已经被标...原创 2020-10-28 16:11:55 · 3345 阅读 · 0 评论 -
结合实际场景再聊 DefaultLitePullConsumer 的使用
通过上文的讲解,各位读者朋友们应该对 DefaultLitePullConsumer 有了一个全面的理解,但会不会觉得意犹未尽之感,因为在实战环节只是给出了一个 Demo 级别的示例,本篇将一个大数据领域的消息拉取批处理场景丰富一些 DefaultLitePullConsumer 的使用技巧。场景描述现在订单系统会将消息发送到 ORDER_TOPIC 中,大数据这边需要将订单数据导入自己的计算...原创 2020-10-28 16:11:56 · 3034 阅读 · 0 评论 -
结合实际场景顺序消费、消息过滤实战
经过前面的篇幅,我相信大家已经掌握了消息消费方面的常用使用技巧了,本篇将对消息消费领域的其他几个特殊场景进行一些实战演示,并穿插一些原理解读。顺序消费业务场景描述现在开发一个银行类项目,对用户的每一笔余额变更都需要发送短信通知到用户。如果用户同时在电商平台下单,转账两个渠道在同一时间进行了余额变更,此时用户收到的短信必须顺序的,例如先网上购物,消费了 128,余额 1000,再转账给朋友 2...原创 2020-10-28 16:11:56 · 882 阅读 · 0 评论 -
消息消费积压问题排查实战
问题描述在 RocketMQ 消息消费方面一个最常见的问题是消息积压,其现象如下图所示:所谓的消息积压:就是 Broker 端当前队列有效数据最大的偏移量(brokerOffset)与消息消费端的当前处理进度(consumerOffset)之间的差值,即表示当前需要消费但没有消费的消息。问题分析与解决方案项目组遇到消息积压问题通常第一时间都会怀疑是 RocketMQ Broker 的问题...原创 2020-10-28 16:11:57 · 1410 阅读 · 0 评论 -
RocketMQ 常用命令实战
本篇整理在运维 RocketMQ 集群时的常用命令,明白命令的含义,在集群运维时得心应手,下面命令均在实际环境中执行过。集群命令汇总集群列表命令 clusterList 用于查看集群各个节点的运行情况。可以看到该集群中有几个节点、主节点还是从节点、以及每个节点的写入 TPS 和读出的 TPS 等。命令示例:$ bin/mqadmin clusterList -n x.x.x.x:9876...原创 2020-10-28 16:11:57 · 1218 阅读 · 0 评论 -
RocketMQ 集群性能摸高
前言我们在生产环境搭建一个集群时,需要对该集群的性能进行摸高。即:集群的最大 TPS 大约多少,我们做到心里有数。通常我们日常的实际流量控制在压测最高值的 1/3 到 1/2 左右,预留一倍到两倍的空间应对流量的突增情况。如何进行压力测试呢?写段发送代码测试同学通过 JMeter 进行压力测试,或者代码中通过多线程发送消息。这种方式需要多台不错配置的测试机器。通过 RocketMQ 自带...原创 2020-10-28 16:11:58 · 1035 阅读 · 0 评论 -
RocketMQ 集群性能调优
前言本篇从系统参数和集群参数两个维度对 RocketMQ 集群进行优化,目的在于 RocketMQ 运行的更平稳。平稳往往比单纯提高 TPS 更重要,文中基于实际生产环境运行情况给出,另外在后面文章中会介绍由于参数设置而引发集群不稳定,业务受到影响的踩坑案例。系统参数调优在解压 RocketMQ 安装包后,在 bin 目录中有个 os.sh 的文件,该文件由 RocketMQ 官方推荐系统参...原创 2020-10-28 16:11:58 · 1921 阅读 · 0 评论 -
RocketMQ 集群平滑运维
前言在 RocketMQ 集群的运维实践中,无论线上 Broker 节点启动和关闭,还是集群的扩缩容,都希望是平滑的,业务无感知。正所谓 “随风潜入夜,润物细无声” ,本文以实际发生的案例窜起系列平滑操作。优雅摘除节点案例背景自建机房 4 主 4 从、异步刷盘、主从异步复制。有一天运维同学遗失其中一个 Master 节点所有账户的密码,该节点在集群中运行正常,然不能登陆该节点机器终究存在安...原创 2020-10-28 16:11:59 · 1468 阅读 · 0 评论 -
RocketMQ 集群监控(一)
前言在 RocketMQ 体系中,有集群、主题、消费组,集群又包括 NameSrv 和 Broker。本篇主要介绍 RocketMQ 的集群监控设计应该考虑哪些方面,以及如何实现。下一篇文章介绍主题、消费组方面的监控。本篇的介绍基于实战中 4 主 4 从,主从异步复制的架构模式。监控项设计集群监控的目的记录集群健康状态,具体监控项见下图:节点数量如果集群中是 4 主 4 从架构,那么集...原创 2020-10-28 16:11:59 · 1757 阅读 · 0 评论 -
RocketMQ 集群监控(二)
前言主题和消费组通常使用方比较关心的资源,发送方关注主题,消费方关注消费组。管理员更侧重关注集群的健康状况。本文介绍主题和消费组的监控实战,包括监控项的设计、及每个监控项的代码实现。监控项设计我们先把主题监控和消费监控统称为资源监控,下图分列了主题和消费组包含的监控项。主题监控从发送速度、发送耗时、消息大小、日消息量方面整理主题监控项,下面分别介绍这些监控项的重要性。发送速度通过实...原创 2020-10-28 16:11:59 · 956 阅读 · 0 评论 -
RocketMQ 集群告警
前言对集群健康状况、使用主题、消费组资源的巡检,发现达到阈值则发送告警信息给管理员或者资源申请者。监控是告警的基础,告警的巡检基于前面两篇文章中监控采集到的数据。告警的重要性不必过多地赘述,RocketMQ 集群往往承载着公司核心业务流转。如果集群不可用往往影响是全公司的业务,事故责任是公司最高级别的。本文从告警项的设计、告警流程、告警实战给出指导建议,在实践中以此为思路扩展完善,实现自...原创 2020-10-28 16:12:00 · 1052 阅读 · 0 评论 -
RocketMQ 集群踩坑记
集群节点进程神秘消失现象描述接到告警和运维反馈,一个 RocketMQ 的节点不见了。此类现象在以前从未发生过,消失肯定有原因,开始查找日志,从集群的 broker.log、stats.log、storeerror.log、store.log、watermark.log 到系统的 message 日志没发现错误日志。集群流量出入在正常水位、CPU 使用率、CPU Load、磁盘 IO、内存、带...原创 2020-10-28 16:12:00 · 1694 阅读 · 0 评论 -
消息轨迹、ACL 与多副本搭建
消息轨迹消息轨迹含义一条消息什么时候由哪台机器产生的、发送的耗时、消息大小、发送状态、存储在哪个 Broker 上、什么时候存储的以及存储在哪台 Broker 上、什么时候消费的、消费状态等信息,这些信息即消息轨迹,用于追踪消息从诞生到被消费的整个生命周期。这些信息对于业务同学排查定位有着重要的意义,发送和消费往往在不同的业务部门。有了消息轨迹后一条消息有没有发送,发送成功了没,有没有消费一...原创 2020-10-28 16:12:01 · 603 阅读 · 0 评论 -
RocketMQ-Console 常用页面指标获取逻辑
本文的目的不是详细介绍 RocketMQ-Console 的使用方法,主要对一些关键点(更多是会有疑问的点)进行介绍,避免对返回结果进行想当然。集群信息一览可以通过 Cluster 查看一个集群中所有的 Broker 信息,包含主节点、从节点,有时候发现主节点、从节点的一些统计指标存在一些偏差,例如 Slave 节点的 Today Producer Count 比主节点的低或者高,会简单认为...原创 2020-10-28 16:12:01 · 826 阅读 · 0 评论 -
RocketMQ NameServer 背后的设计理念
Nameserver 在 RocketMQ 整体架构中所处的位置就相当于 ZooKeeper、Dubbo 服务化架构体系中的位置,即充当“注册中心”,在 RocketMQ 中路由信息主要是指主题(Topic)的队列信息,即一个 Topic 的队列分布在哪些 Broker 中。Nameserver 工作机制Topic 的注册与发现主要的参与者:Nameserver、Producer、Consu...原创 2020-10-28 16:12:02 · 734 阅读 · 0 评论 -
从RocketMQ学Java 并发编程
RocketMQ 是一款非常优秀的分布式,里面有很多的编程技巧值得我们借鉴,本文从并发编程角度,从 RocketMQ 中挑选几个示例与大家一起来分享沟通一下。读写锁的使用场景在 RocketMQ 中关于 Topic 的路由信息主要指的是一个 Topic 在各个 Broker 上的队列信息,而 Broker 的元数据又包含所属集群名称、Broker IP 地址,路由信息的写入操作主要是 Brok...原创 2020-10-28 16:12:02 · 656 阅读 · 0 评论 -
从 RocketMQ 学基于文件的编程模式(一)
消息存储格式看文件编程从 commitlog 文件的设计来学文件编程我们知道 RocketMQ 的全量消息存储在 commitlog 文件中,每条消息的大小不一致,那如何对消息进行组织呢?当消息写入到文件中后,如果判别一条消息的开始与结束呢?首先基于文件的编程模型,首先需要定义一套消息存储格式,用来表示一条完整的消息,例如 RocketMQ 的消息存储格式如下图所示:从这里我们可以得到一...原创 2020-10-28 16:12:03 · 677 阅读 · 0 评论 -
从 RocketMQ 学基于文件的编程模式(二)
同步刷盘、异步刷盘基于文件的编程模型中为了提高文件的写入性能,通常会引入内存映射机制,但凡事都有利弊,引入了内存映射、页缓存等机制,数据首先写入到页缓存,此时并没有真正的持久化到磁盘,那 Broker 收到客户端的消息发送请求时是存储到页缓存中就直接返回成功,还是要持久化到磁盘中才返回成功呢? 这里又是一个抉择,是在性能与消息可靠性方面进行的权衡,为此 RocketMQ 提供了多种持久化策略:...原创 2020-10-28 16:12:03 · 571 阅读 · 0 评论 -
从 RocketMQ 学 Netty 网络编程技巧
从整个类体系看网络设计RocketMQ 关于网络方面核心类图如下所示:接下来先一一介绍各个类的主要职责。RemotingServiceRPC 远程服务基础类。主要定义所有的远程服务类的基础方法:void start():启动远程服务。void shutdown():关闭。void registerRPCHook(RPCHook rpcHook):注册 RPC 钩子函数,有利于在执...原创 2020-10-28 16:12:04 · 894 阅读 · 0 评论 -
RocketMQ 学习方法之我见
亲爱的读者朋友,RocketMQ 实战专辑的全部内容即将更新完毕,前面的篇幅主要是介绍 RocketMQ 技术本身,本篇想和大家谈谈我是如何学习 RocketMQ 的,尽量做到授之以渔。我想大家都会有这样一个共识:光学理论没用,要实战。这个有一定的道理,但不应该成为阻碍我们学习的理由。对知识的学习我们当然需要优先学习研究工作中常用的技术,例如以微服务为例,现在市面上 Spring Clould ...原创 2020-10-28 16:12:04 · 959 阅读 · 0 评论