394
阿里云
消息处理时长自适应__最佳实践_消息服务-阿里云
背景描述
阿里云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的情况的话,程序又会变得比较复杂。
目标
在一些即时性要求比较高,并且又希望尽快响应每一条消息的场景下,我们会希望:
队列的VisibilityTimeout比较短。比如是5分钟,这样的话,在发生了进程Crash之后,最多5分钟,之前未处理完的消息就会被某个worker接收到并处理。
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
最后更新:2016-11-23 17:16:08
上一篇:
广播拉取消息模型__最佳实践_消息服务-阿里云
下一篇:
长轮询__最佳实践_消息服务-阿里云
在哪里可以查到ECS的权限定义___云服务器(ECS)授权问题_授权常见问题_访问控制-阿里云
检索数据__从 SQL 到 NoSQL_快速入门_表格存储-阿里云
阿里云发布企业级产品家族,与跟随者甩开身位!
阿里云争抢万亿物联网市场 亚马逊、微软“云”业务或遭冲击
更新媒体-删除标签__媒体接口_API使用手册_视频点播-阿里云
配置自动快照随磁盘释放__快照_用户指南_云服务器 ECS-阿里云
查询query子句__搜索子句介绍_API参考手册_开放搜索-阿里云
按量付费计费规则说明__ECS购买须知_产品使用问题_云服务器 ECS-阿里云
错误编码:HSF-0001__HSF 常见问题_开发常见问题_产品常见问题_企业级分布式应用服务 EDAS-阿里云
步骤一:控制台配置__快速上线_Web 应用防火墙-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云