FeSa

develop & design


  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Search

MQ-重试(RETRY)-死信(DLQ)

Posted on 2019-06-10 | In 中间件

1.RocketMQ消息消费失败的处理策略

Consumer从Broker拉取到消息之后进行消费,但是消费并不一定都是顺利的,不可避免会遇到一些异常情况,这种情况下RocketMQ提供了怎样的处理机制?以PushConsumer为例来看下与之相关的操作。

2.Consumer消费异常处理流程

在Consumer使用的时候需要注册MessageListener,对于PushConsumer来说需要注册MessageListenerConcurrently,其中消费消息的接口会返回处理状态,分别是,

ConsumeConcurrentlyStatus.CONSUME_SUCCESS,消费成功
ConsumeConcurrentlyStatus.RECONSUME_LATER,推迟消费

MessageListener是在ConsumeMessageConcurrentlyService中被调用的,可以看到上述两个状态会分别映射到CMResult定义的枚举值,

CMResult.CR_SUCCESS,消费成功
CMResult.CR_LATER,推迟消费
CMResult.CR_ROLLBACK,事务消息回滚
CMResult.CR_COMMIT,事务消息投递
CMResult.CR_THROW_EXCEPTION,消费过程异常
CMResult.CR_RETURN_NULL,消费结果状态为null
消息消费的结果会在ConsumeMessageConcurrentlyService.processConsumeResult中进行处理。

从代码看返回ConsumeConcurrentlyStatus.RECONSUME_LATER状态之后的处理策略是将该组消息发送回Broker,等待后续消息。发送回的消息会设置重试Topic,重试Topic命名为:”%RETRY%” + Consumer组名。原先实际的Topic会暂存到消息属性当中,以及设置delayLevel以及reconsumeTimes。

Consumer消费的时候可以设置consumeMessageBatchMaxSize来控制传入MessageLisenter的消息数量,这里的失败处理策略是,其中只要有一条消息消费失败就认为全部失败,这一批消息都会发送回Broker。因此consumeMessageBatchMaxSize这个值的设置需要注意,否则容易出现消息重复消费问题。

3.Broker消费失败消息处理流程

Broker端对应的处理位于SendMessageProcessor.consumerSendMsgBack方法中。对于Consumer发送失败返回的消息,Broker会将其放入重试Topic中。

重试消息的重新投递逻辑与延迟消息一致,等待delayLevel对应的延时一到,Broker会尝试重新进行投递处理。

DelayLevel对应的延时级别是固定的,RocketMQ对应的配置为MessageStoreConfig.messageDelayLevel,默认的级别为,

1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
鉴于RocketMQ的实现机制,可以去调整每一个级别对应的时间,但可以看出一是时间精度不够细,二是级别为固定级别。

自定义消费失败处理

Consumer对消费失败可以进行一定程度的介入,默认失败后的级别设置为msg.getReconsumeTimes() + 1,如果Consumer明确知道未来可以成功消费的时间,那么就可以主动去设置重试次数与重试级别来进行控制。

顺序消息非顺序消息的差异
在消息失败处理上,顺序消息与非顺序消息是有明显差异的。对于顺序消息来说,如果消费失败后将其延迟消费,那么顺序性实际就被破坏掉了。

所以顺序消息消费失败的话,消息消费不会再推进,知道失败的消息消费成功为止。

4.死信

RocketMQ中的消息无法无限次重新消费,当然了,手动修改重试次数是可以的,不介入的话不行。当重试次数超过所有延迟级别之后。消息会进入死信,死信Topic的命名为:%DLQ% + Consumer组名。

进入死信之后的消息肯定不会再投递了,不过可以通过接口去查询当前RocketMQ中私信队列的消息。如果在上层实现自有命令,那么可以将消息从死信中移出并重新投递。

5.参考说明

转载:
http://blog.soliloquize.org/2018/09/02/RocketMQ-%E6%B6%88%E6%81%AF%E6%B6%88%E8%B4%B9%E5%A4%B1%E8%B4%A5%E7%9A%84%E5%A4%84%E7%90%86%E7%AD%96%E7%95%A5/

Canal使用手册

Posted on 2019-03-11 | In Canal

1.Canal同步介绍

项目地址:

https://github.com/alibaba/canal

Read more »

MongoDB集群搭建手册

Posted on 2019-03-06 | In MongoDB

1.安装

mongodb的集群搭建方式主要有三种,主从模式,Replica set模式,sharding模式, 三种模式各有优劣,适用于不同的场合,属Replica set应用最为广泛,主从模式现在用的较少,sharding模式最为完备,但配置维护较为复杂。本文我们来看下Replica Set模式的搭建方法。

下载:

https://www.mongodb.com/download-center/community

Read more »

MySQL-Galera集群搭建手册

Posted on 2019-03-05 | In MySQL

1.安装

首先配置yum源。在/etc/yum.repos.d/ 的目录下编辑gelare.repo文件。

Read more »

MySQL-Galera最佳实践

Posted on 2019-03-05 | In MySQL

1.查看Galera集群状态

show status like ‘wsrep%’;

Read more »

密码学入门

Posted on 2019-01-22 | In 密码学

1. 前言

在如今的信息安全领域,有各种各样的加密算法凝聚了计算机科学家门的智慧。从宏观上来看,这些加密算法可以归结为三大类:哈希算法、对称加密算法、非对称加密算法。

Read more »

Java优秀框架源码学习

Posted on 2019-01-21 | In 源码研究

1. 前言

通过研究优秀的框架源码,可以洞察到设计者的思想,对提高自身开发水平有很大的帮助。为设计新的系统打下良好的基础,站在巨人肩膀可以看得更远。

Read more »

编译/解释语言、静态/动态语言、静态类型/动态类型语言

Posted on 2018-12-25 | In 其它

1. 前言

编程语言根据不同角度有多种分类:
根据运行时程序是否为机器码可以分:编译语言、解释语言。
根据运行时代码可以根据某些条件改变自身结构可以分:静态语言、动态语言。
根据运行期间才去做数据类型检查可以分:静态类型语言,动态类型语言。

Read more »

分布式事务实现方案

Posted on 2018-12-05 | In 分布式

1. 前言

由集中式应用到分布式应用的转变,带来了诸多的变化,虽然分布式应用解决了单体应用复杂性高、可靠性差、扩展能力受限等诸多问题,但原来在单体应用中容易实现的特性,在分布式应用中不再那么轻松实现,比如事务,锁等场景。这带来了很大的挑战。通过不断的探索,每种问题都有不同程度的解决方案。

Read more »

RocketMQ中间件指南

Posted on 2018-12-05 | In 中间件

1. RocketMQ概述

“根据我们的研究,随着使用的队列和虚拟主题的增加,ActiveMQ IO模块成为瓶颈。我们尽力通过节流,断路器或降级解决这个问题,但效果不佳。因此,我们开始关注当时流行的消息传递解决方案Kafka。不幸的是,Kafka无法满足我们的要求,特别是在低延迟和高可靠性方面,详见 http://rocketmq.apache.org/rocketmq/how-to-support-more-queues-in-rocketmq/ ”

Read more »

12…8

lvyafei

74 posts
33 categories
41 tags
© 2019 lvyafei
Powered by Hexo
|
Theme — NexT.Mist v5.1.4