rocketmq 顺序消费_RocketMQ核心概念扫盲
在正式进入RocketMQ的学习之前,我觉得有必要梳理一下RocketMQ核心概念,为大家学习RocketMQ打下牢固的基础。
1、RocketMQ部署架构
在RocketMQ主要的组件如下:
- Nameserver
Nameserver集群,topic的路由注册中心,为客户端根据Topic提供路由服务,从而引导客户端向Broker发送消息。Nameserver之间的节点不通信。路由信息在Nameserver集群中数据一致性采取的最终一致性。 - Broker
消息存储服务器,分为两种角色:Master与Slave,上图中呈现的就是2主2从的部署架构,在RocketMQ中,主服务承担读写操作,从服务器作为一个备份,当主服务器存在压力时,从服务器可以承担读服务(消息消费)。所有Broker,包含Slave服务器每隔30s会向Nameserver发送心跳包,心跳包中会包含存在在Broker上所有的topic的路由信息。 - Client
消息客户端,包括Producer(消息发送者)和Consumer(消费消费者).客户端在同一时间只会连接一台nameserver,只有在连接出现异常时才会向尝试连接另外一台。客户端每隔30s向Nameserver发起topic的路由信息查询。
温馨提示:Nameserver是在内存中存储Topic的路由信息,持久化Topic路由信息的地方是在Broker中,即${ROCKETMQ_HOME}/store/config/topics.json。
在RocketMQ4.5.0版本后引入了多副本机制,即一个复制组(m-s)可以演变为基于raft协议的复制组,复制组内部使用raft协议保证broker节点数据的强一致性,该部署架构在金融行业用的比较多。
2、消息订阅模型
在RocketMQ的消息消费模式采用的是发布与订阅模式。
topic:一类消息的集合,消息发送者将一类消息发送到一个主题中,例如订单模块将订单发送到 order_topic 中,而用户登录时,将登录事件发送到 user_login_topic 中。
consumegroup:消息消费组,一个消费单位的“群体”,消费组首先在启动时需要订阅需要消费的topic。一个topic可以被多个消费组订阅,同样一个消费组也可以订阅多个主题。一个消费组拥有多个消费者。
术语解释起来有点枯燥晦涩,接下来我举例来阐述。
例如我们在开发一个订单系统,其中有一个子系统:order-service-app,在该项目中会创建一个消费组order_consumer来订阅 order_topic,并且基于分布式部署,order-service-app的部署情况如下:
即order-service-app部署了3台服务器,每一个jvm进程可以看做是消费组 order_consumer 消费组的其中一个消费者。
2.1 消费模式
那这三个消费者如何来分工来共同消费 order_topic 中的消息呢?
在RocketMQ中支持广播模式与集群模式。
广播模式:一个消费组内的所有消费者每一个都会处理topic中的每一条消息,通常用于刷新内存缓存。
集群模式:一个消费组内的所有消费者共同消费一个topic中的消息,即分工协作,一个消费者消费一部分数据,启动负载均衡,
集群模式是非常普遍的模式,符合分布式架构的基本理念,即横向扩容,当前消费者如果无法快速及时处理消息时,可以通过增加消费者的个数横向扩容,快速提高消费能力,及时处理挤压的消息。
2.2 消费队列负载算法与重平衡机制
那集群模式下,消费者是如何来分配消息的呢?
例如上面实例中order_topic有16个队列,那一个拥有3个消费者的消费组如何来分配队列中。
在MQ领域有一个不成文的约定:同一个消费者同一时间可以分配多个队列,但一个队列同一时间只会分配给一个消费者。
RocketMQ提供了众多的队列负载算法,其中最常用的两种平均分配算法。
- AllocateMessageQueueAveragely
平均分配 - AllocateMessageQueueAveragelyByCircle
轮流平均分配
为了说明这两种分配算法的分配规则,现在对16个队列,进行编号,用q0~q15表示,消费者用c0~c2表示。
AllocateMessageQueueAveragely分配算法的队列负载机制如下:
c0:q0 q1 q2 q3 q4 q5
c1: q6 q7 q8 q9 q10
c2: q11 q12 q13 q14 q15
其算法的特点是用总数除以消费者个数,余数按消费者顺序分配给消费者,故c0会多分配一个队列,而且队列分配是连续的。
AllocateMessageQueueAveragelyByCircle分配算法的队列负载机制如下:
c0:q0 q3 q6 q9 q12 q15
c1: q1 q4 q7 q10 q13
c2: q2 q5 q8 q11 q14
该分配算法的特点就是轮流一个一个分配。
温馨提示:如果topic的队列个数小于消费者的个数,那有些消费者无法分配到消息。在RocketMQ中一个topic的队列数直接决定了最大消费者的个数,但topic队列个数的增加对RocketMQ的性能不会产生影响。
在实际过程中,对主题进行扩容(增加队列个数)或者对消费者进行扩容、缩容是一件非常寻常的事情,那如果新增一个消费者,该消费者消费哪些队列呢?这就涉及到消息消费队列的重新分配,即消费队列重平衡机制。
在RocketMQ客户端中会每隔20s去查询当前topic的所有队列、消费者的个数,运用队列负载算法进行重新分配,然后与上一次的分配结果进行对比,如果发生了变化,则进行队列重新分配;如果没有发生变化,则忽略。
例如采取的分配算法如下图所示,现在增加一个消费者c3,那队列的分布情况是怎样的呢?
根据新的分配算法,其队列最终的情况如下:
c0:q0 q1 q2 q3
c1: q4 q5 q6 q7
c2: q8 q9 q10 q11
c3: q12 q13 q14 q15
上述整个过程无需应用程序干预,由RocketMQ完成。大概的做法就是将将原先分配给自己但这次不属于的队列进行丢弃,新分配的队列则创建新的拉取任务。
2.3 消费进度
消费者消费一条消息后需要记录消费的位置,这样在消费端重启的时候,继续从上一次消费的位点开始进行处理新的消息。在RocketMQ中,消息消费位点的存储是以消费组为单位的。
集群模式下,消息消费进度存储在broker端,$ { ROCKETMQ_HOME }/store/config/consumerOffset.json 是其具体的存储文件,其中内容截图如下:
可见消费进度的Key为:topic@consumeGroup,然后每一个队列一个偏移量。
广播模式的消费进度文件存储在用户的主目录,默认文件全路劲名:$ { USER_HOME }/.rocketmq_offsets。
2.4 消费模型
RocketMQ提供了并发消费、顺序消费两种消费模型。
并发消费:对一个队列中消息,每一个消费者内部都会创建一个线程池,对队列中的消息多线程处理,即偏移量大的消息比偏移量小的消息有可能先消费。
顺序消费:在某一项场景,例如MySQL binlog 场景,需要消息按顺序进行消费。在RocketMQ中提供了基于队列的顺序消费模型,即尽管一个消费组中的消费者会创建一个多线程,但针对同一个Queue,会加锁。
温馨提示:并发消费模型中,消息消费失败默认会重试16次,每一次的间隔时间不一样;而顺序消费,如果一条消息消费失败,则会一直消费,直到消费成功。故在顺序消费的使用过程中,应用程序需要区分系统异常、业务异常,如果是不符合业务规则导致的异常,则重试多少次都无法消费成功,这个时候一定要告警机制,及时进行人为干预,否则消费会积压。
3、事务消息
事务消息并不是为了解决分布式事务,而是提供消息发送与业务落库的一致性,其实现原理就是一次分布式事务的具体运用,请看如下示例:
上述伪代码中,将订单存储关系型数据库中和将消息发送到MQ这是两个不同介质的两个操作,如果能保证消息发送、数据库存储这两个操作要么同时成功,要么同时失败,RocketMQ为了解决该问题引入了事务消息。
温馨提示,本节主要的目的是让大家知晓各个术语的概念,由于事务消息的使用,将在该专栏的后续文章中详细介绍。
4、定时消息
开源版本的RocketMQ目前并不支持任意精度的定时消息。所谓的定时消息就是将消息发送到Broker,但消费端不会立即消费,而是要到指定延迟时间后才能被消费端消费。
RocketMQ目前支持指定级别的延迟,其延迟级别如下:
1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
5、消息过滤
消息过滤是指消费端可以根据某些条件对一个topic中的消息进行过滤,即只消费一个主题下满足过滤条件的消息。
RocketMQ目前主要的过滤机制是基于tag的过滤与基于消息属性的过滤,基于消息属性的过滤支持SQL92表达式,对消息进行过滤。
6、小结
本文的主要目的是介绍RocketMQ常见的术语,例如nameserver、broker、主题、消费组、消费者、队列负载算法、队列重平衡机制、并发消费、顺序消费、消费进度存储、定时消息、事务消息、消息过滤等基本概念,为后续的实战系列打下坚实基础。
温馨提示:本文节选自笔者在 gitchat 发布的专栏《RocketMQ实战与进阶》。
rocketmq 顺序消费_RocketMQ核心概念扫盲相关推荐
- RocketMQ_01 RocketMQ入门简介及核心概念
RocketMQ_01 RocketMQ入门简介及核心概念 伟大的事物不是一时冲动做起来的,而是由一系列小事共同造就的 一.RocketMQ简介 RocketMQ是一款分布式.列队模型的消息中间件,由 ...
- RocketMQ——顺序消费(代码)
关于rocketmq顺序消费的理解和图示可以查看该博文:RocketMQ--顺序消费和重复消费 本博客主要是以代码示例来了解顺序消费的相关内容,建议在此之前先了解下顺序消费的原理. 注:RocketM ...
- 一次 RocketMQ 顺序消费延迟的问题定位
一次 RocketMQ 顺序消费延迟的问题定位 问题背景与现象 昨晚收到了应用报警,发现线上某个业务消费消息延迟了 54s 多(从消息发送到MQ 到被消费的间隔): 2021-06-30T23:12: ...
- rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ
RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目.作为经历过多次阿里巴巴双十一这种&qu ...
- 一文理清RocketMQ顺序消费、重复消费、消息丢失问题
前言 在使用消息队列时不可避免的会遇到顺序消费.重复消费.消息丢失三个问题.在一次面试字节的时候,面试官问到如何保证顺序消费,当时回答不太准确,特意此文回顾如何解决顺序消费.重复消费.消息丢失三个问题 ...
- RocketMQ 顺序消费只消费一次 坑
rocketMq实现顺序消费的原理 produce在发送消息的时候,把消息发到同一个队列(queue)中,消费者注册消息监听器为MessageListenerOrderly,这样就可以保证消费端只有一 ...
- rocketMq 顺序消费
什么是顺序消费? 消息有序指的是一类消息消费时,能按照发送的顺序来消费.例如:一个订单产生了 3 条消息,分别是订单创建.订单付款.订单完成.消费时,要按照这个顺序消费才有意义.与此同时多笔订单之间又 ...
- rocketmq 顺序消费_必须先理解的RocketMQ入门手册,才能再次深入解读
推荐阅读一下下 2020年后想跳槽?MQ.ZK.Nginx.Kafk等分布式技术你都掌握了? 阿里架构师推荐学习的<RabbitMQ实战指南>,渣渣的你都看过吗? RocketMQ入门手册 ...
- rocketmq 重复消费_RocketMQ的十二个特性,你都知道吗「下」
接上文,今天继续. 9 消息重试 Consumer消费消息失败后,要提供一种重试机制,令消息再消费一次.Consumer消费消息失败通常可以认为有以下几种情况: 由于消息本身的原因,例如反序列化失败, ...
最新文章
- 拼图游戏_我最喜欢的Java拼图2 + 1 = 4
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—异步编程(九)
- 写给 Android 应用工程师的 Binder 原理剖析
- 睢县职教中心计算机专业18年高考 成绩,南模18年高考成绩喜人!想进这所学校,你需要知道这些~...
- horizon client 无法识别域_「领域驱动设计DDD」事件风暴简介:实现域驱动设计的简便方法...
- 数据结构-树3-红黑树
- Selenium Firefox 官方Webdriver -- Geckodriver 下载地址
- 如何将c语言编译器设置为初始状态,C语言编译器设与实现毕业论文设计.doc
- 在一行中捕获多个异常(块除外)
- JDBCAPI简介(二)
- 今天使用overleaf生成个人简历
- java开根号函数_如何在Java中计算平方根和平方根?
- 引导扇区维护工具linux,bootice引导扇区维护工具下载
- 利尔达芯智行智能BMS系统方案,让电池的“大脑”更聪明
- windows下搭建自己的跨平台tts语音合成播报技术
- 富贵电玩 富贵旺旺 富贵精华版 富贵3 后门 格机问题研究
- NC65 用户密码重置
- Mac 开启局域网smb文件共享(附全平台连接方法)
- 点击按钮点击复制功能
- 中式装修之美,呈现出东方的诗意与唯美
热门文章
- Oracle 归档开启切换和归档日志删除(单实例和RAC)
- 查看Android 系统发送的广播
- 如何用代码编写四则运算?
- 002-一般处理程序(HttpHandler)
- Poisson泊松分布
- Spark Streaming源码解读之Driver中ReceiverTracker架构设计以具体实现彻底研究
- iOS字符串处理笔记(正则表达式、NSScanner扫描、CoreParse解析器)
- java 解析json的问题
- WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)
- 【Assembly】Mixed mode dll unable to load in .net 4.0