最佳实践:如何使用消息服务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
相关文章
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中Pod探针的TCPSocketAction
在K8s集群中,kubelet通过探针(如livenessProbe、readinessProbe和startupProbe)检查容器健康状态。探针支持HTTPGetAction、ExecAction和TCPSocketAction三种检查方法。本文重点介绍TCPSocketAction,它通过尝试建立TCP连接来检测容器的健康状况。示例中创建了一个Nginx Pod,并配置了两个探针(readinessProbe和livenessProbe),它们每隔5秒检查一次容器的8080端口,首次检查在启动后10秒进行。若连接失败,容器将重启。视频讲解和命令演示进一步详细说明了这一过程。
569 83
【赵渝强老师】K8s中Pod探针的TCPSocketAction
|
7月前
|
数据采集 机器学习/深度学习 人工智能
大模型应用:大模型性能评估指标:CLUE任务与数据集详解.10
CLUE(中文语言理解评估基准)是专为中文大模型设计的综合性评测体系,涵盖文本分类、自然语言推理、命名实体识别、阅读理解等任务,提供准确率、F1值、精确匹配等多维指标,并支持模块化评估与可视化分析,助力客观、全面衡量模型真实能力。(239字)
862 6
|
7月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器2核4G配置租用价格参考:u2a实例504.60元起,u1实例199元起,轻量应用服务器714元起
阿里云2核4G配置提供多类型服务器选择:轻量应用服务器714元/年,适配中小型网站快速搭建;通用算力型u1实例199元/年起,适合企业级应用;u2a实例504.6元/年起,性价比突出,支持企业通用场景;经济型e实例599.93元/年起,适合开发测试;计算型c9i实例1742元/年起,支撑高性能计算。
1789 8
|
8月前
|
缓存 运维 Prometheus
别再半夜敲命令了:用 LLM + 自动化脚本,把 Runbook 变成“会思考的运维同事”
别再半夜敲命令了:用 LLM + 自动化脚本,把 Runbook 变成“会思考的运维同事”
349 5
|
8月前
|
jenkins Java 持续交付
01-Jenkins前置配置
本文介绍Jenkins与GitLab集成的完整配置流程,包括在GitLab创建Jenkins账号、配置SSH密钥与API Token、Jenkins端的凭据管理、全局安全设置中禁用host key验证,并配置Git用户信息。同时详述节点服务器环境搭建,如JDK、Maven、Node.js安装与环境变量配置,以及通过SSH方式将节点接入Jenkins,实现远程构建与持续集成。
219 1
|
Ubuntu 图形学
在线体验Ubuntu:便捷与深入体验的两面性
或许许多人都曾渴望尝试Ubuntu,毕竟其易用性是众所周知的。然而,繁琐的安装与配置过程往往让许多人止步不前,毕竟,我们都有各自忙碌的生活。
|
数据采集 存储 前端开发
使用 rvest 包快速抓取网页数据:从入门到精通
本文介绍了如何使用 R 语言中的 `rvest` 包结合代理 IP 技术,快速抓取新闻网站的数据。以澎湃新闻为例,详细展示了如何配置代理、解析网页结构、提取新闻标题和摘要,并将数据保存为 CSV 文件。通过本教程,读者可以掌握 `rvest` 包的使用方法,提高爬虫抓取效率。
658 6
使用 rvest 包快速抓取网页数据:从入门到精通
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
613 2