最佳实践:如何使用消息服务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重新编辑 ]

时间: 2024-09-21 04:55:27

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

最佳实践:如何基于消息服务MNS实现严格有序队列

问题背景:阿里云消息服务提供的队列(queue)主要特点是高可靠.高可用.高并发.每个队列的数据都会被持久化三份到阿里云的飞天分布式平台:其中每个队列至少有2台服务器向外提供服务:同时每台服务器都支持高并发访问.这些分布式特性,也导致了消息服务队列无法像传统单机队列那样保证严格的消息FIFO特点,只能做到基本有序. 我们的队列如果同时有多个消息发送者(sender),由于并发和网络延迟不一等问题,消息的严格顺序本身就是失去了意义,因为在这种情况下,我们根本无法获知消息在多个sender上的实际发

Docker在云平台上的最佳实践: 当容器服务遇到深度学习

12月9日云栖计算之旅线下沙龙第2期<Docker在云平台上的最佳实践>,阿里云技术专家必嘫给大家带来了"当容器服务遇到了深度学习"的演讲.本文主要从深度学习的兴起开始谈起,进而介绍了Docker技术.阿里云容器服务,重点介绍了支持云上的高性能计算应用需要哪些,包括GPU的调度.隔离和监控. 视频回顾 深度学习 人工智能已经进入了深度学习时代.传统的让机器自动化的方式已经不再适合解决一些问题,机器学习开始兴起,让机器像小孩子一样自己去认识世界.而深度学习本身是机器学习的一个

使命必达--阿里云商用消息服务MNS初探

在2015杭州云栖大会上,阿里云飞天事业部资深总监李津发布了一款海量消息,使命必达的消息服务产品(http://www.aliyun.com/product/mns).该产品能够提供高效,可靠,安全,便捷,弹性扩展的消息服务:能够帮助我们轻松的构建松耦合,高并发的分布式系统:能够方便我们做跨域数据安全传输.目前,消息服务也是阿里云唯一商用消息产品,其服务稳定性和可靠性都有SLA保障.下面让我一起来详细了解一下这款产品.   架构优势带来海量,高可靠,高可用特性 在了解消息服务前,不得不提的是阿里

消息服务MNS日志的正确打开方式

消息成功发送到队列/主题,消费端却收不到消息,消息到底去哪儿了? 多个客户端,想知道某个客户端产生/消费的消息量? 队列/主题完整消息轨迹轻松查看? ... ... 按照下面的方式来,上面的需求通通搞定. 基本模式:将MNS的日志推送到LogService,然后登陆LogService控制台,各种查询你想要的~~ 首先,配置日志推送 1. 登陆阿里云官网,进入 MNS控制台,单击左侧 日志管理 进入日志管理页面: 2. 单击杭州地域右侧的 配置 进入LoggingBucket配置页面: 2.1

最佳实践:如何对MNS消息进行加密传输

问题背景阿里云消息服务MNS提供公网http可访问的服务.对于包含敏感信息的消息,如何进一步提高从用户客户端程序到阿里云的服务之间的网络链路上的安全性?目前有两种解决方案:    1.MNS提供https的服务域名(计划中,预计4月中旬可用),用户选用https服务地址.    2.用户对传输的消息体进行加密,防止被窃取. 下面提供了如何对MNS消息进行加密传输的最佳实践. 解决方案1在消息发送前先消息进行加密,然后在发送:2.在消息接收端先对消息进行解密,然后在消费: 代码说明(Java):附

最佳实践:如何基于MNS实现事务消息

事务消息的背景: 有时候我们需要实现本地操作和消息发送的事务一致性功能.即:消息发送成功,则本地操作成功:反之,如果消息发送失败,本地操作失败(成功也需要rollback).保证不出现操作成功但消息发送失败:或者操作失败但消息发送成功的情况: 另外,消费端,我们也希望消息一定被成功处理一次,不会因为消息端程序崩溃而导致消息没有成功处理,进而需要人工重置消费进度.   解决方案: 利用消息服务MNS的延迟消息来实现. 准备工作: 创建两个队列: 1.事务消息队列 消息的有效期小于消息延迟时间.即如

最佳实践:如何基于MNS和OSS实现无大小限制的消息传输

问题背景阿里云消息服务MNS的队列的消息大小最大限制是64K,这个限制基本能够满足在正常情况下消息作为控制流信息交换通道的需求.但是,在某些特殊场景下,消息数据比较大时,就只能采用消息分片的方式.那么如何能够基于MNS,又不做消息切片,传递大于64K的消息呢?解法是有的. 解决方案1.生产者在往MNS 发送消息前,如果发现消息体大于64K,则先将消息体数据上传到OSS上:2.然后,生产者把数据对应的Objcet信息作为消息发送到MNS上:3.消费者从MNS队列里读取消息,判断消息内容是否为OSS

最佳实践:如何基于MNS实现一对多拉取消息消费模型

如何实现一对多拉取消息消费模型 问题背景: 阿里云消息服务MNS 已经提供队列(queue)和主题(topic)两种模型.其中队列提供的是一对多的共享消息消费模型,采用客户端主动拉取(Pull)模式:主题模型提供一对多的广播消息消费模型,并且采用服务端主动推送(Push)模式.上面两种模型基本能满足我们大多数应用场景.   推送模式的好处是即时性能比较好,但是需要暴露客户端地址来接收服务端的消息推送.有些情况下,比如企业内网,我们无法暴露推送地址,希望改用拉取(Pull)的方式.虽然MNS不直接

一分钟了解阿里云产品:消息服务

一.             概述   阿里云发布了很多款产品,今天让我们一起来了解下阿里云消息服务(Message Service)吧.   什么是消息服务呢?我来给大家说说.   消息服务是阿里云唯一商用的消息中间件服务.消息服务是一种高效.可靠.安全.便捷.可弹性扩展的分布式消息服务.MNS能够帮助应用开发者在他们应用的分布式组件上自由的传递数据,构建松耦合系统.     那么,消息服务有什么独特之处呢?   与传统的消息中间件不同,消息服务一开始就是基于阿里云自主研发的飞天分布式系统来设