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

简介:
一.  背景
阿里 云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 )"相关的具体事情,在流程图里有显示。流程图如下

ChangeMessageVisibilitySample.zip





[ 此帖被消息小二在2015-11-23 18:04重新编辑 ]
相关实践学习
通过轻量消息队列(原MNS)主题HTTP订阅+ARMS实现自定义数据多渠道告警
本场景将自定义告警信息同时分发至多个通知渠道的需求,例如短信、电子邮件及钉钉群组等。通过采用轻量消息队列(原 MNS)的主题模型的HTTP订阅方式,并结合应用实时监控服务提供的自定义集成能力,使得您能够以简便的配置方式实现上述多渠道同步通知的功能。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
8月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器2核4G配置租用价格参考:u2a实例504.60元起,u1实例199元起,轻量应用服务器714元起
阿里云2核4G配置提供多类型服务器选择:轻量应用服务器714元/年,适配中小型网站快速搭建;通用算力型u1实例199元/年起,适合企业级应用;u2a实例504.6元/年起,性价比突出,支持企业通用场景;经济型e实例599.93元/年起,适合开发测试;计算型c9i实例1742元/年起,支撑高性能计算。
1998 8
|
9月前
|
机器学习/深度学习 人工智能 芯片
当算力变成“新石油”:AI 芯片的战争、底层逻辑与未来爆点
当算力变成“新石油”:AI 芯片的战争、底层逻辑与未来爆点
521 15
|
9月前
|
人工智能 自然语言处理 API
全面认识MCP:大模型连接真实世界的“USB-C接口”
MCP(模型上下文协议)是Anthropic推出的开放标准,被誉为AI时代的“USB-C接口”,旨在统一大模型与外部工具、数据源的连接方式。它通过标准化通信,让AI智能体能高效调用天气、数据库等各类工具,打破“工具孤岛”,简化开发流程,推动AI应用从对话走向真实世界任务执行,加速构建安全、可扩展的智能生态。
|
关系型数据库 测试技术 PostgreSQL
|
弹性计算 安全 Cloud Native
带你读《云原生机密计算最佳实践白皮书》——Intel TDX: Intel安全虚拟化技术
带你读《云原生机密计算最佳实践白皮书》——Intel TDX: Intel安全虚拟化技术
3093 0
|
存储 Unix Linux
[✔️] android so库的相关命令
[✔️] android so库的相关命令
754 0
|
Linux Go iOS开发
Golang:交叉编译到Linux、macOS、windows并运行
Golang:交叉编译到Linux、macOS、windows并运行
1137 0
|
关系型数据库 数据库 C语言
Greenplum 源码安装
数据库规划 1 master - standby 5 segment(s) - segment mirror(s) 硬件规划 6台主机 master节点配置(cpu 8核, mem 16G, network 1GB, disk 1*250G) segments配置 建议规划
11120 3