消费流程



消费者组: 一个逻辑概念,在使用消费者时需要指定一个组名。一个消费者组可以订阅多个Topic。

消费者实例: 一个消费者组程序部署了多个进程,每个进程都可以称为一个消费者实例。

订阅关系: 一个消费者组订阅一个 Topic 的某一个 Tag,这种记录被称为订阅关系。RocketMQ规定消费订阅关系(消费者组名-Topic-Tag)必须一致——在此,笔者想提醒读者,一定要重视这个问题,一个消费者组中的实例订阅的Topic和Tag必须完全一致,否则就是订阅关系不一致。订阅关系不一致会导致消费消息紊乱。

消费模式

RocketMQ目前支持集群消费模式和广播消费模式,其中集群消费模式使用最为广泛

集群消费模式

在同一个消费者组中的消费者实例,是负载均衡(策略可以配置)地消费Topic中的消息,假如有一个生产者(Producer)发送了 120 条消息,其所属的 Topic 有 3 个消费者(Consumer)组,每个消费者组设置为集群消费,分别有2个消费者实例,如图所示。



Consumer Group A 的两个实例 Consumer Instance A1 和 Consumer Instance A2 分别负载均衡地消费60条消息。由此我们可以得出使用负载均衡策略时,每个消费者实例消费消息数=生产消息数/消费者实例数,在本例中是60=120/2

适用场景: 目前大部分场景都适合集群消费模式,RocketMQ 的消费模式默认是集群消费。比如异步通信、削峰等对消息没有顺序要求的场景都适合集群消费。因为集群模式的消费进度是保存在Broker端的,所以即使应用崩溃,消费进度也不会出错。

广播消费模式

广播消费,顾名思义全部的消息都是广播分发,即消费者组中的全部消费者实例将消费整个 Topic 的全部消息。比如,有一个生产者生产了 120 条消息,其所属的 Topic 有 3个消费者组,每个消费者组设置为广播消费,分别有两个消费者实例,如图所示。



Consumer Group A 的两个实例 Consumer Instance A1 和 Consumer Instance A2 分别消费120条消息。整个消费者组收到消息120×2=240条。由此我们可以得出广播消费时,每个消费者实例的消费消息数=生产者生产的消息数,整个消费者组中所有实例消费消息数=每个消费者实例消费消息数×消

费者实例数,本例中是240=120×2

适用场景: 广播消费比较适合各个消费者实例都需要通知的场景,比如刷新应用服务器中的缓存,如图所示。



生产者发一个刷新缓存的广播消息,消费者组如果设置为广播消费,那么每个应用服务中的消费者都可以消费这个消息,也都能刷新缓存。

广播消费的消费进度保存在客户端机器的文件中。如果文件弄丢了,那么消费进度就丢失了,可能会导致部分消息没有消费

可靠消费

RocketMQ是一种十分可靠的消息队列中间件,消费侧通过重试-死信机制、Rebalance机制等多种机制保证消费的可靠性。

重试-死信机制

我们假设有一个场景,在消费消息时由于网络不稳定导致一条消息消费失败。此时是让生产者重新手动发消息呢,还是自己做数据补偿?

横向看,RocketMQ的消费过程分为 3个阶段:正常消费、重试消费和死信。在引进了正常Topic、重试队列、死信队列后,消费过程的可靠性提高了。RocketMQ的消费流程如图所示

正常Topic: 正常消费者订阅的Topic名字。

重试Topic: 如果由于各种意外导致消息消费失败,那么该消息会自动被保存到重试Topic中,格式为“%RETRY%消费者组”,在订阅的时候会自动订阅这个重试Topic。

进入重试队列的消息有16次重试机会,每次都会按照一定的时间间隔进行。RocketMQ 认为消费不是一锤子买卖,可能由于各种偶然因素导致正常消费失败,只要正常消费或者重试消费中有一次消费成功,就算消费成功

死信Topic: 死信Topic名字格式为“%DLQ%消费者组名”。如果正常消费1次失败,重试16次失败,那么消息会被保存到死信Topic中,进入死信Topic的消息不能被再次消费。RocketMQ认为,如果17次机会都失败了,说明生产者发送消息的格式发生了变化,或者消费服务出现了问题,需要人工介入处理。

Rebalance机制

Rebalance(重平衡)机制,用于在发生Broker掉线、Topic扩容和缩容、消费者扩容和缩容等变化时,自动感知并调整自身消费,以尽量减少甚至避免消息没有被消费。后面会详细讲述Rebalance的过程。

死信队列

当一条消息初次消费失败,消息队列RocketMQ版会自动进行消息重试,达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息。此时,消息队列RocketMQ版不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。

在消息队列RocketMQ版中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)

死信消息具有以下特性:

  • 不会再被消费者正常消费。
  • 有效期与正常消息相同,默认为3天,3天后会被自动删除。因此,请在死信消息产生后的3天内及时处理。

死信队列具有以下特性:

  • 一个死信队列对应一个Group ID, 而不是对应单个消费者实例。
  • 如果一个Group ID未产生死信消息,消息队列RocketMQ版不会为其创建相应的死信队列。
  • 一个死信队列包含了对应Group ID产生的所有死信消息,不论该消息属于哪个Topic。

RocketMQ - 消费者概述的更多相关文章

  1. RocketMQ消费者示例程序

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本博客实现了一个简单的RocketMQ消费者的示例,MQ里存储的是经过Avro序列化的消息数据,程序读取数据并反序列化后, ...

  2. 深入研究RocketMQ消费者是如何获取消息的

    前言 小伙伴们,国庆都过的开心吗?国庆后的第一个工作日是不是很多小伙伴还沉浸在假期的心情中,没有工作状态呢? 那王子今天和大家聊一聊RocketMQ的消费者是如何获取消息的,通过学习知识来找回状态吧. ...

  3. RocketMQ消费者实践

    最近工作中用到了RocketMQ,现记录下,如何正确实现消费~ 消费者需要注意的问题 防止重复消费 如何快速消费 消费失败如何处理 Consumer具体实现 防止重复消费 重复消费会造成数据不一致等问 ...

  4. RocketMQ 消费者

    本文分析 DefaultMQPushConsumer,异步发送消息,多线程消费的情形. DefaultMQPushConsumerImpl MQClientInstance 一个客户端进程只有一个 M ...

  5. rocketmq消息存储概述

    了解消息存储部分首先需要关注的几个方法,load()--Load previously stored messages.start()--Launch this message store.putMe ...

  6. RocketMQ学习分享

    消息队列的流派 什么是 MQ Message Queue(MQ),消息队列中间件.很多人都说:MQ 通过将消息的发送和接收分离来实现应用程序的异步和解偶,这个给人的直觉是——MQ 是异步的,用来解耦的 ...

  7. RocketMQ入门案例

    学习RocketMQ,先写一个Demo演示一下看看效果. 一.服务端部署 因为只是简单的为了演示效果,服务端仅部署单Master模式 —— 一个Name Server节点,一个Broker节点.主要有 ...

  8. rocketmq 控制台 trackType NOT_CONSUME_YET

    1. 问题描述 rocketmq消费者偶有没有收到消息,查看后台, 显示NOT_CONSUME_YET 2. 分析 mq控制台 显示有该条消息数据 只是状态为未消费 那么问题应该出在 消费者一方 诶? ...

  9. SpringBoot2.0 整合 RocketMQ ,实现请求异步处理

    一.RocketMQ 1.架构图片 2.角色分类 (1).Broker RocketMQ 的核心,接收 Producer 发过来的消息.处理 Consumer 的消费消息请求.消息的持 久化存储.服务 ...

  10. RocketMQ之一:RocketMQ整体介绍

    常用MQ介绍及对比--<MQ详解及四大MQ比较> RocketMQ环境搭建--<RocketMQ之三:RocketMQ集群环境搭建> RocketMQ物理部署结构 Rocket ...

随机推荐

  1. chrom jsonview的使用

    在开发中,我们可能要为不同的系统提供接口,并以说明文档的形式提供接口说明,但我们提供的返回json往往会在页面上乱成一团. 这里我们推荐chrome浏览器的小插件jsonview,他不但有利于我们对接 ...

  2. KVC原理与数据筛选

    作者:宋宏帅 1 前言 在技术论坛中看到一则很有意思的KVC案例: @interface Person : NSObject @property (nonatomic, copy) NSString ...

  3. Leetcode-SQL学习计划-SQL入门-584:寻找用户推荐人

    建表语句: Create table If Not Exists Customer (id int, name varchar(25), referee_id int) Truncate table ...

  4. JavaEE Day14 Servlet&HTTP&Request

    今日内容 1.Servlet 2.HTTP协议 3.Request 一.Servlet 1.概念 2.步骤 3.执行原理 4.生命周期 5.Servlet 3.0注解配置 6.Servlet体系结构 ...

  5. Docker常用命令、Docker Compose、DockerFile实践

    〇.简介 https://hub.docker.com/ 1.架构 2.目录 镜像操作 容器操作 容器运行 Docker示例-MySQL Docker示例-Redis Docker示例-Nacos 使 ...

  6. Go语言性能剖析利器--pprof实战

    作者:耿宗杰 前言 关于pprof的文章在网上已是汗牛充栋,却是千篇一律的命令介绍,鲜有真正实操的,本文将参考Go社区资料,结合自己的经验,实战Go程序的性能分析与优化过程. 优化思路 首先说一下性能 ...

  7. APP异常测试点汇总

    在测试APP时异常测试是非常必要的. 安装卸载中的异常测试 一.安装 安装过程中设备重启 安装过程中息屏 安装过程中断网 安装过程中切换网络 安装过程中收到短信提醒 安装过程中收到来电提醒 安装过程中 ...

  8. 一次TiDB GC阻塞引发的性能问题分析

    背景 前不久从项目一线同学得到某集群的告警信息,某个时间段 TiDB duration 突然异常升高,持续时间6小时左右,需要定位到具体原因. 分析过程 第一招,初步判断 由于项目条件苛刻,历经苦难才 ...

  9. Python免杀过360

    本文章仅供参考学习 作者:mantou 博客地址:https://www.cnblogs.com/mantou0/ 分离免杀 这个我就不多说了,效果确实不错,网上关于分离免杀的也有很多文章 不分离过3 ...

  10. [0x11] 130.火车进站问题【卡特兰数】

    题意 link(more:129.,P1044) 简化题意:给定严格从 \(1\thicksim n\) 这 \(n(n\leqslant 6\times10^4)\) 个整数,规定每个数都要进出栈各 ...