在正式进入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核心概念扫盲相关推荐

  1. RocketMQ_01 RocketMQ入门简介及核心概念

    RocketMQ_01 RocketMQ入门简介及核心概念 伟大的事物不是一时冲动做起来的,而是由一系列小事共同造就的 一.RocketMQ简介 RocketMQ是一款分布式.列队模型的消息中间件,由 ...

  2. RocketMQ——顺序消费(代码)

    关于rocketmq顺序消费的理解和图示可以查看该博文:RocketMQ--顺序消费和重复消费 本博客主要是以代码示例来了解顺序消费的相关内容,建议在此之前先了解下顺序消费的原理. 注:RocketM ...

  3. 一次 RocketMQ 顺序消费延迟的问题定位

    一次 RocketMQ 顺序消费延迟的问题定位 问题背景与现象 昨晚收到了应用报警,发现线上某个业务消费消息延迟了 54s 多(从消息发送到MQ 到被消费的间隔): 2021-06-30T23:12: ...

  4. rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ

    RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目.作为经历过多次阿里巴巴双十一这种&qu ...

  5. 一文理清RocketMQ顺序消费、重复消费、消息丢失问题

    前言 在使用消息队列时不可避免的会遇到顺序消费.重复消费.消息丢失三个问题.在一次面试字节的时候,面试官问到如何保证顺序消费,当时回答不太准确,特意此文回顾如何解决顺序消费.重复消费.消息丢失三个问题 ...

  6. RocketMQ 顺序消费只消费一次 坑

    rocketMq实现顺序消费的原理 produce在发送消息的时候,把消息发到同一个队列(queue)中,消费者注册消息监听器为MessageListenerOrderly,这样就可以保证消费端只有一 ...

  7. rocketMq 顺序消费

    什么是顺序消费? 消息有序指的是一类消息消费时,能按照发送的顺序来消费.例如:一个订单产生了 3 条消息,分别是订单创建.订单付款.订单完成.消费时,要按照这个顺序消费才有意义.与此同时多笔订单之间又 ...

  8. rocketmq 顺序消费_必须先理解的RocketMQ入门手册,才能再次深入解读

    推荐阅读一下下 2020年后想跳槽?MQ.ZK.Nginx.Kafk等分布式技术你都掌握了? 阿里架构师推荐学习的<RabbitMQ实战指南>,渣渣的你都看过吗? RocketMQ入门手册 ...

  9. rocketmq 重复消费_RocketMQ的十二个特性,你都知道吗「下」

    接上文,今天继续. 9 消息重试 Consumer消费消息失败后,要提供一种重试机制,令消息再消费一次.Consumer消费消息失败通常可以认为有以下几种情况: 由于消息本身的原因,例如反序列化失败, ...

最新文章

  1. 拼图游戏_我最喜欢的Java拼图2 + 1 = 4
  2. ASP.NET温故而知新学习系列之ASP.NET多线程编程—异步编程(九)
  3. 写给 Android 应用工程师的 Binder 原理剖析
  4. 睢县职教中心计算机专业18年高考 成绩,南模18年高考成绩喜人!想进这所学校,你需要知道这些~...
  5. horizon client 无法识别域_「领域驱动设计DDD」事件风暴简介:实现域驱动设计的简便方法...
  6. 数据结构-树3-红黑树
  7. Selenium Firefox 官方Webdriver -- Geckodriver 下载地址
  8. 如何将c语言编译器设置为初始状态,C语言编译器设与实现毕业论文设计.doc
  9. 在一行中捕获多个异常(块除外)
  10. JDBCAPI简介(二)
  11. 今天使用overleaf生成个人简历
  12. java开根号函数_如何在Java中计算平方根和平方根?
  13. 引导扇区维护工具linux,bootice引导扇区维护工具下载
  14. 利尔达芯智行智能BMS系统方案,让电池的“大脑”更聪明
  15. windows下搭建自己的跨平台tts语音合成播报技术
  16. 富贵电玩 富贵旺旺 富贵精华版 富贵3 后门 格机问题研究
  17. NC65 用户密码重置
  18. Mac 开启局域网smb文件共享(附全平台连接方法)
  19. 点击按钮点击复制功能
  20. 中式装修之美,呈现出东方的诗意与唯美

热门文章

  1. Oracle 归档开启切换和归档日志删除(单实例和RAC)
  2. 查看Android 系统发送的广播
  3. 如何用代码编写四则运算?
  4. 002-一般处理程序(HttpHandler)
  5. Poisson泊松分布
  6. Spark Streaming源码解读之Driver中ReceiverTracker架构设计以具体实现彻底研究
  7. iOS字符串处理笔记(正则表达式、NSScanner扫描、CoreParse解析器)
  8. java 解析json的问题
  9. WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)
  10. 【Assembly】Mixed mode dll unable to load in .net 4.0