消息队列服务(MQS)技术浅析

1    MQS简介

         消息队列服务(Message Queue Service,简称MQS),是阿里云推出的分布式消息中间件服务。

         MQS旨在提供可靠、海量、高并发的分布式消息队列服务,从而帮助应用开发者实现应用之间以及应用内部各组件之间的消息传递,解耦系统之间的依赖。

2    MQS功能特点

         消息队列最早出现在操作系统中,解决了传统的进程通信模式中存在的很多弊端。消息队列具备的优点包括:

(1)     单独对消息的收、发进行管理,确保消息的成功传递。

(2)     提供异步的通信协议,消息产生者只需要将消息发送到消息队列中,即可立刻返回。

(3)     大大降低异构系统之间的耦合度。

        在大数据时代,传统的消息队列无法满足日益增长的消息通信需求,用户个人搭建消息队列集群会带来较大的机器和运维成本;同时随着移动端规模的爆发式增长,对消息队列的安全性、可靠性以及可扩展性提出了挑战。阿里云推出的消息队列服务(MQS)是基于阿里云飞天云平台上的消息中间件服务,相比传统的消息队列而言,具备如下特点:

l  零运维、高性能、高可扩展。

l  数据多冗余架构,确保消息的可靠性。

l  在有效期内,保证每条消息至少可被消费一次(at-least-once)。

l  允许创建海量的消息队列。

l  API接口简单易用,对平台无依赖。

l  不严格保证消息的FIFO属性。

3    MQS基本架构

         MQS的基本架构如图1所示。可以分为四部分:

l  OAuth、Authorization验权验证模块。接入阿里云的账号验证体系,用户需首先在阿里云官网(www.aliyun.com)申请账号并开通服务之后方可使用MQS服务。

l  Http Front模块。主要负责对用户的HTTP请求进行解析、处理,并接入阿里云的验证验权模块,最终在MQS的后端服务集群执行完请求后将结果返回给用户。

l  MQS Master模块。主要负责Message数据的切片调度,实现分布式的load balance。

l  Message Data Server集群。基于阿里云飞天分布式计算平台的MQS后端服务集群,是MQS的核心模块,实现了关于队列、消息的所有操作。

图1 MQS架构图

3.1      数据多冗余

         如图1所示,写入到MQS的所有消息数据都会对应三份拷贝,从而确保数据的高可靠性。

3.2      Qos控制

         在Message Data Server层针对每个队列都设置有单独的QoS控制,针对该队列的访问请求量不得超过其QoS上限值。

3.3      数据多切片分布

         队列的消息数据是按照特定的算法进行切片分布的,并由MQS Master进行集中管理,这不仅有效的实现了load balance,同时还能够动态的进行集群规模的弹性扩展。

4    MQS队列中消息存活周期

         在具体介绍队列中消息存活周期之前,首先介绍下MQS涉及到的相关术语。

         Active Message(活跃消息)

        队列中可以被取出消费的消息。

         Inactive Message(非活跃消息)

         队列中已经被取出但未删除的消息,非活跃消息将保持一段时间(队列的VisibilityTimeout属性值)无法被其他人取出。

         Expired Message (过期消息)

        当队列中的某条消息超过了消息有效时间(TTL)之后仍未被取出,则该消息将变为过期消息,会被后台GC模块回收。

         在介绍完一些基本术语之后,图2中显示了一条消息的整个生命周期。

  1. 在PutMessage之后,消息进入到队列中,即成为能够被取出的ActiveMessage;(如图2中A所示)
  2. 在消费者取出该条消息之后则转变为InactiveMessage;(如图2中B所示)

a)       如果在VisibilityTimeout时间段内,消费者将该条消息消费完毕,并发送删除请求,则该消息将会从队列中删除;(如图2中C所示)

b)       如果消费者未完成消费,则InactiveMessage将会在VisibilityTimeout之后自动转换成ActiveMessage,从而可以再次被取出消费;(如图2中D所示)

  1. 在消息有效时间过后,消息将变为ExpiredMessage,从队列中删除。(如图2中E.1和E.2所示)

 

图2 队列中消息的生命周期

5    MQS中多样的队列模式  

         在满足普通的消息收发模式的同时,MQS还向用户提供了多样的队列模式,分别包括延迟队列、长轮询队列以及优先级队列等。

5.1            延迟队列

         在延迟队列中,发送到队列中的每一条消息都会保持一段等待时间,在等待时间过后才可以被取出消费。延迟队列可以帮用户轻松实现任务定时分发等功能。目前延迟队列支持最大的延迟时间长达7天。

5.2            长轮询队列

         由于MQS实现的是基于HTTP协议的API接口,用户是通过拉(pull)的方式进行消息的获取,从而可能会出现消息数据获取不及时或者频繁发送空取消息的无用请求。MQS通过长轮询(long polling)的方式确保了用户能够在减少无用请求的基础上,又能及时获取到消息。

5.3            优先级队列

         优先级队列能够为用户提供具备消息优先级别的队列。发送到队列中的每条消息都会设置有相应的优先级别;在进行消费时,较高优先级别的消息将会先被取出。目前优先级队列暂时无法确保百分百的优先级顺序。

6    技术展望

         作为消息通讯的中间件服务,MQS会将服务的稳定性和安全性放在首位,主要工作将包括:

  1. 开放账户访问权限授予的API接口;
  2. 增加队列状态监控报警机制;

同时,在功能和性能方面将进行更多的尝试:

  1. 长连接功能打开;
  2. 后端server采用更高效的异步处理模式;
  3. 死信队列,消息数据备份等。
时间: 2024-09-13 11:20:18

消息队列服务(MQS)技术浅析的相关文章

流行消息队列服务

一.简单消息队列服务 HTTPSQS HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储. 队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出.加入元素的一头叫"队头",取出元素的一头叫"队尾".利用消息队列可以很好地异步

云服务厂商都在推荐轻量级的存储队列服务,用来取代原有的比较重的消息队列服务

这个小玩意源于上周在研究Azure的时候,发现云服务厂商都在推荐轻量级的存储队列服务,用来取代原有的比较重的消息队列服务,具体来说,比如阿里云就推荐使用消息服务替代消息队列,在Azure中,就有一个轻量级的存储队列(Storage Queue)可以替代服务总线(Service Bus), 简单试用了一下Azure的Storage Queue后,发现这玩意很好用,于是决定全面的深入研究一下,再将公司电商系统内的相关任务处理均重构成使用存储队列服务,而深入研究得找个案例呀,于是就想到了做个分布式爬虫

阿里云云消息队列服务稳定吗

问题描述 在阿里云论坛上看到一个帖子,http://bbs.aliyun.com/read.php?tid=145878,发现阿里云推出来云消息服务队列,加入群拿到文档,简单试用了一下,貌似跟aws的消息队列服务很像,不知道稳定性怎么样,有谁试用过吗? 解决方案 本帖最后由 zjliwenzhao 于 2013-09-11 13:29:25 编辑解决方案二:没有人用过吗?解决方案三:没有人用过吗?

C#中使用消息队列服务

C#中使用Windows消息队列服务 http://www.cnblogs.com/xinhaijulan/archive/2010/08/22/1805768.html http://h2appy.blog.51cto.com/609721/184323 http://www.cnblogs.com/isdavid/archive/2012/08/16/2642867.html http://www.cnblogs.com/beniao/archive/2008/06/26/1229934.h

[置顶]【结果很简单,过程很艰辛】记阿里云Ons消息队列服务填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的时候,会开放思路.当然不得不说,Ons的.NET接口还很不完善,甚至没有独立在Windos 2008/2012服务器测试过,希望官方加把力. 1.阿里云ONS介绍    ONS(Open Notification Service)即开放消息服务,是基于阿里开源消息中间件MetaQ(Rocke

一分钟了解阿里云产品:消息队列

一.             概述   阿里云发布的产品种类繁多,今天让我们一起来了解下消息队列(Message Queue,简称MQ)吧.     什么是消息队列呢?   消息队列是企业级互联网架构的核心服务,基于高可用分布式集群技术,搭建了包括发布订阅.接入.管理.定时(延时).监控报警等一套完整的高性能.高性价比消息云服务.MQ是阿里云正式商用的互联网消息中间件,帮您实现分布式计算场景中所有异步解耦功能.MQ由阿里巴巴集团中间件技术部自主研发,是原汁原味的阿里集团中间件技术精华之沉淀,是可

WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识 (1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的 基础文章.在那篇文章里,我们详细介绍了MSMQ消息队列的基本概念.安装.部 署.开发.调试等相关问题.今天我们来学习WCF分布式开发步步为赢(13):WCF 服务离线操作与消息队列MSMQ.在WCF框架下使用MSMQ消息队列服务编程. 这 里我会给出一个使用WCF MSMQ实现离线请求的DEMO示例程序. 全文结构是:[1]MSMQ基本概念

消息总线VS消息队列

前段时间实现了一个基于RabbitMQ的消息总线,实现的过程中自己也在不断得思考.总结以及修正.需要考虑各个维度:效率.性能.网络.吞吐量.甚至需要自己去设想API可能的使用场景.模式.不过能有一件事情,自己愿意去做,在走路.吃饭.坐公交的时候都在思考如何去改进它,然后在实践的过程中,促使去思考并挖掘自己知识面的空白,也是一件让人开心的事情. 借此记录下自己在实现的过程中,以及平时的一些想法. 这是第一篇,先谈谈消息总线跟消息队列的区别,以及对于企业级应用需要将消息队列封装成消息总线的必要性.

分布式系统解决之道:目录、消息队列、事务系统及其他

目录服务(ZooKeeper)   分布式系统是一个由很多进程组成的整体,这个整体中每个成员部分,都会具备一些状态,比如自己的负责模块,自己的负载情况,对某些数据的掌握等等.而这些和其他进程相关的数据,在故障恢复.扩容缩容的时候变得非常重要.   简单的分布式系统,可以通过静态的配置文件,来记录这些数据:进程之间的连接对应关系,它们的IP地址和端口等等.然而,一个自动化程度高的分布式系统,必然要求这些状态数据都是动态保存的.这样才能让程序自己去做容灾和负载均衡的工作.   一些程序员会专门自己编