RocketMQ相关知识知多少(二)

简介: RocketMQ相关知识知多少(二)

RocketMQ相关知识知多少(一):https://developer.aliyun.com/article/1534543


1.PushConsumer:高度封装的消费类型,消费消息仅仅通过通过消费监听器监听并返回结果。 消息的获取、消费状态提交以及消费重试都通过 RocketMQ 的客户端 SDK 完成。


  • 返回消费成功:以 Java SDK 为例,返回,表示该消息处理成功,服务端按照消费结果更新消费进度。CosumeResult.SUCCESS


  • 返回消费失败:以 Java SDK 为例,返回,表示该消息处理失败,需要根据消费重试逻辑判断是否进行重试消费。ConsumeResult.FAILURE


  • 出现非预期失败:例如抛异常等行为,该结果按照消费失败处理,需要根据消费重试逻辑判断是否进行重试消费。

使用 PushConsumer 消费者消费时,不允许使用以下方式处理消息,否则 RocketMQ 无法保证消息的可靠性。

  • 错误方式一:消息还未处理完成,就提前返回消费成功结果。 此时如果消息消费失败,RocketMQ 服务端是无法感知的,因此不会进行消费重试。
  • 错误方式二:在消费监听器内将消息再次分发到自定义的其他线程,消费监听器提前返回消费结果。 此时如果消息消费失败,RocketMQ 服务端同样无法感知,因此也不会进行消费重试。


PushConsumer 严格限制了消息同步处理及每条消息的处理超时时间,适用于以下场景:


  • 消息处理时间可预估:如果不确定消息处理耗时,经常有预期之外的长时间耗时的消息,PushConsumer 的可靠性保证会频繁触发消息重试机制造成大量重复消息。

  • 无异步化、高级定制场景:PushConsumer 限制了消费逻辑的线程模型,由客户端 SDK 内部按最大吞吐量触发消息处理。 该模型开发逻辑简单,但是不允许使用异步化和自定义处理流程。

2.简单消费者:SimpleConsumer 是一种接口原子型的消费者类型,消息的获取、消费状态提交以及消费重试都是通过消费者业务逻辑主动发起调用完成。


  • SimpleConsumer 适用于以下场景:


  • 消息处理时长不可控:如果消息处理时长无法预估,经常有长时间耗时的消息处理情况。 建议使用 SimpleConsumer 消费类型,可以在消费时自定义消息的预估处理时长,若实际业务中预估的消息处理时长不符合预期,也可以通过接口提前修改。


  • 需要异步化、批量消费等高级定制场景:SimpleConsumer 在 SDK 内部没有复杂的线程封装,完全由业务逻辑自由定制,可以实现异步分发、批量消费等高级定制场景。


  • 需要自定义消费速率:SimpleConsumer 是由业务逻辑主动调用接口获取消息,因此可以自由调整获取消息的频率,自定义控制消费速率。

五、消费者过滤

消费者订阅了某个主题后,Apache RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息,可通过设置过滤条件在 Apache RocketMQ 服务端进行过滤,只获取到需要关注的消息子集,避免接收到大量无效的消息。【使用 Apache RocketMQ 的消息过滤功能,可以帮助消费者更高效地过滤自己需要的消息集合,避免大量无效消息投递给消费者,降低下游系统处理压力。】


过滤的含义指的是将符合条件的消息投递给消费者,而不是将匹配到的消息过滤掉。


Apache RocketMQ 的消息过滤功能通过生产者和消费者对消息的属性、标签进行定义,并在 Apache RocketMQ 服务端根据过滤条件进行筛选匹配,将符合条件的消息投递给消费者进行消费。

消息过滤主要通过以下几个关键流程实现:

  • 生产者:生产者在初始化消息时预先为消息设置一些属性和标签,用于后续消费时指定过滤目标。
  • 消费者:消费者在初始化及后续消费流程中通过调用订阅关系注册接口,向服务端上报需要订阅指定主题的哪些消息,即过滤条件。
  • 服务端:消费者获取消息时会触发服务端的动态过滤计算,Apache RocketMQ 服务端根据消费者上报的过滤条件的表达式进行匹配,并将符合条件的消息投递给消费者。

RocketMQ 支持Tag标签过滤和SQL属性过滤,这两种过滤方式对比如下:


六、消费重试

消费重试指的是,消费者在消费某条消息失败后,Apache RocketMQ 服务端会根据重试策略重新消费该消息,超过一定次数后若还未消费成功,则该消息将不再继续重试,直接被发送到死信队列中。

消息重试的触发条件

  • 消费失败,包括消费者返回消息失败状态标识或抛出非预期异常。


消息处理超时,包括在PushConsumer中排队超时。


消息重试策略主要行为


  • 重试过程状态机:控制消息在重试流程中的状态和变化逻辑。


  • 重试间隔:上一次消费失败或超时后,下次重新尝试消费的间隔时间。


  • 最大重试次数:消息可被重试消费的最大次数。

消息重试策略差异

根据消费者类型不同,消息重试策略的具体内部机制和设置方法有所不同,具体差异如下:


PushConsumer消费消息时,消息的几个主要状态如下:


  • Ready:已就绪状态。消息在Apache RocketMQ服务端已就绪,可以被消费者消费。
  • Inflight:处理中状态。消息被消费者客户端获取,处于消费中还未返回消费结果的状态。
  • WaitingRetry:待重试状态,PushConsumer独有的状态。当消费者消息处理失败或消费超时,会触发消费重试逻辑判断。如果当前重试次数未达到最大次数,则该消息变为待重试状态,经过重试间隔后,消息将重新变为已就绪状态可被重新消费。多次重试之间,可通过重试间隔进行延长,防止无效高频的失败。


  • Commit:提交状态。消费成功的状态,消费者返回成功响应即可结束消息的状态机。


  • DLQ:死信状态。消费逻辑的最终兜底机制,若消息一直处理失败并不断进行重试,直到超过最大重试次数还未成功,此时消息不会再重试,会被投递至死信队列。您可以通过消费死信队列的消息进行业务恢复。

SimpleConsumer消费消息时,消息的几个主要状态如下:


  • Ready:已就绪状态。消息在Apache RocketMQ服务端已就绪,可以被消费者消费。
  • Inflight:处理中状态。消息被消费者客户端获取,处于消费中还未返回消费结果的状态。
  • Commit:提交状态。消费成功的状态,消费者返回成功响应即可结束消息的状态机。
  • DLQ:死信状态。消费逻辑的最终兜底机制,若消息一直处理失败并不断进行重试,直到超过最大重试次数还未成功,此时消息不会再重试,会被投递至死信队列。您可以通过消费死信队列的消息进行业务恢复。
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
6月前
|
消息中间件 存储 JSON
RocketMQ概论
RocketMQ概论
41 0
|
6月前
|
消息中间件 存储 Apache
RocketMQ相关知识知多少(一)
RocketMQ相关知识知多少(一)
|
6月前
|
消息中间件 存储 缓存
技术好文:RocketMQ之一:RocketMQ整体介绍
技术好文:RocketMQ之一:RocketMQ整体介绍
65 0
|
消息中间件 存储 Cloud Native
RocketMQ 5.0 VS RocketMQ 4.x 变化知多少?
RocketMQ 5.0 VS RocketMQ 4.x 变化知多少?
398 0
|
消息中间件 存储 中间件
吐血总结——消息队列之RocketMQ知识梳理
消息队列主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。今天我就首先分析一下RocketMQ,目前公司用的也是这个,因此在进行一下梳理,加深一下印象。
274 0
|
消息中间件 存储 负载均衡
RocketMQ极简入门-RocketMQ的工作原理
RocketMQ架构上主要分为四部分,如上图所示 Producer 消息发布的角色,支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集 群队列进行消息投递,投递的过程支持快速失败并且低延迟。 Consumer 消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时 也支持集群方式和广播方式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求。 Broker Broker主要负责消息的存储、投递和查询以及服务高可用保证。 NameServer NameServer是一个Broker与Topic路由的注册中心
298 0
|
消息中间件 存储 负载均衡
二.RocketMQ极简入门-RocketMQ的工作原理
RocketMQ极简入门-RocketMQ的工作原理
|
消息中间件 中间件 RocketMQ
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ相关的消费问题以及原理分析总结
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ相关的消费问题以及原理分析总结
167 1
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ相关的消费问题以及原理分析总结
|
消息中间件 Kafka RocketMQ
消息中间件(RocketMQ)笔记
分布式消息中间件,主要是实现分布式系统中解耦、异步消息、流量销锋、日志处理等场景。生产中用的最多的消息队列有Activemq,rabbitmq,kafka,rocketmq等。 以 Jms 规范和 rocketmq 为主来分享。版本基于 3.2.6 。 主要分享:JMS规范、Rocketmq的介绍、部署方式、特性的一些使用。
消息中间件(RocketMQ)笔记