最佳实践:如何使用消息服务MNS的ChangeMessageVIsibility

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介:
一.  背景
阿里 云MNS消息 服务 的规范中,每条Message都有个默认的VisibilityTImeout,worker在接收到消息后,timeout就开始计时了。
如果Worker在timeout时间内没能处理完Message,那么消息就有可能被其他Worker接收到并处理。

Timeout计时的好处是:消息处理完之后需要显式地DeleteMessage,那么如果Worker进程Crash等情况发生,这条Message还有机会被其他Worker处理。

一些用户会将队列的默认VIsibilityTimeout设置得比较长,以确保消息在被Worker处理完之前不会超时释放。

二. 问题
但是,在一些应用场景中,我们假设:
队列的VisibilityTimeout是6个小时。
A worker接收到了Message M1,但是worker在处理完消息之后,进程发生了Crash或者机器发生了重启。
那么M1这条消息至少在6个小时之后才会被某个Worker接收到并处理。而 己写代码处理Failover的情况的话,程序又会变得比较复杂。

三. 目标
在一些即时性要求比较高,并且又希望尽快响应每一条消息的场景下,我们会希望:
1. 队列的VisibilityTimeout比较短。比如是5分钟,这样的话,在发生了进程Crash之后,最多5分钟,之前未处理完的消息就会被某个worker接收到并处理。
2. worker处理消息的过程中,耗时很有可能超过5分钟,那么消息在被处理的过程中,不能超时。

四. 方案
对于这样的场景,我们提供一个BestPractice的C# Demo:(请见附件)
具体的做法是,在worker处理消息的过程中,为消息定期检查是否需要做ChangeVisibility,worker处理完之后依然是主动deleteMessage。


如果有任何问题,欢迎大家在 论坛 发帖 ,或者直接加入我们的官方MNS技术支持旺旺群 (群号51222373)。

下面是对于程序的几点说明:

1. 运行前需要  填写 accessId, accessKey, endPoint
2. 变量说明:
         MessageMinimalLife 是消息 注册 时必须有的最少的Life长度。需要这个的原因是,比如消息register的时候已经只剩下0.1秒的超时时间了,那么注册进来也来不及ChangeVisibility延长生命。所以,  MessageMinimalLife是为了确保Message能活到被ChangeVisibility,用户可以自己根据业务压力来设置。

        TimerInterval是Manager内部的Timer的Interval。只需要确保在Message到达 MessageMinimalLife之前,Timer会被启动就足够了。时间可以设置得比较短(检查得就比较频繁)。



        QueueMessageVisibilityTimeout是Sample里Message的默认超时时间,是Queue的属性。Sample里每次ChangeVisibility的时候,会把消息的VisibilityTimeout设置为QueueMessageVisibilityTimeout
, 所以它的值需要大于 TimerInterval+ MessageMinimalLife,以确保消息不会超时。



        MessageTimeout是Message在Manager里面的超时时间,比如某个worker卡住了,消息在5个小时之后依然没有处理完毕(假设5个小时远远超出消息的正常处理时间),那么Manager就不会再为Message做ChangeVisibility了,会放任Message的Visibility超时。




3. 流程说明:
        Worker在ReceiveMessage之后,会先做RegisterMessage,然后处理Message,最后再调用Manager的deleteMessage。

        Manager在消息第一次注册进来之后,调用ThreadPool调度一个ChangeVisibilityTask检查是否需要ChangeVisibility,并且把Message加到内部的messages列表中


        Manager内部的Timer,会定时调用Parallel启动  ChangeVisibilityTask检查messages列表里的所有message



        "Manager.ChangeMessageVisibility (ChangeVisibilityTask )"相关的具体事情,在流程图里有显示。流程图如下
240_1365541074971606_d01fd39f0d8512e.png
ChangeMessageVisibilitySample.zip





[ 此帖被消息小二在2015-11-23 18:04重新编辑 ]
相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
27天前
|
消息中间件 弹性计算 物联网
MQTT常见问题之发布MQTT主题消息失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
27天前
|
消息中间件 物联网 RocketMQ
MQTT常见问题之RocketMQ到MQTT的消息轨迹查询失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
3月前
|
消息中间件 API RocketMQ
RocketMQ-初体验RocketMQ(07)-使用API操作RocketMQ_顺序消息 ordermessage
RocketMQ-初体验RocketMQ(07)-使用API操作RocketMQ_顺序消息 ordermessage
30 0
|
消息中间件 存储 运维
厚积薄发--一文带您了解阿里云 RocketMQ 轻量版消息队列(MNS)
MNS 重点聚焦在基准消息队列的核心能力建设,MNS 经过多年迭代与打磨,尽管内部极为复杂,但一直努力保持其在客户端的简单易用,围绕轻量和集成两个命题,着力建设更易用的消息队列产品。
1573 0
厚积薄发--一文带您了解阿里云  RocketMQ 轻量版消息队列(MNS)
|
消息中间件 运维 安全
MNS 的最佳实践及案例|学习笔记
快速学习 MNS 的最佳实践及案例
241 0
|
消息中间件 安全 Serverless
消息队列 MNS 特性|学习笔记
快速学习消息队列 MNS 特性
198 0
|
消息中间件 运维 RocketMQ
消息队列 MNS 简史|学习笔记
快速学习消息队列 MNS 简史
343 0
消息队列 MNS 简史|学习笔记
|
消息中间件 监控 Java
手把手系列:消息队列 MNS 实操讲|学习笔记
快速学习手把手系列:消息队列 MNS 实操讲
575 0
手把手系列:消息队列 MNS 实操讲|学习笔记
|
消息中间件 XML 监控
消息服务MNS之初见
简要介绍阿里云消息服务MNS(Message Service)及基础操作
消息服务MNS之初见
|
消息中间件 存储 运维
厚积薄发--一文带您了解阿里云 RocketMQ 轻量版消息队列(MNS)
MNS 重点聚焦在基准消息队列的核心能力建设,MNS 经过多年迭代与打磨,尽管内部极为复杂,但一直努力保持其在客户端的简单易用,围绕轻量和集成两个命题,着力建设更易用的消息队列产品。
厚积薄发--一文带您了解阿里云 RocketMQ 轻量版消息队列(MNS)