1 MQS简介
消息队列服务(Message Queue Service,简称MQS),是阿里云推出的分布式消息中间件服务。
MQS旨在提供可靠、海量、高并发的分布式消息队列服务,从而帮助应用开发者实现应用之间以及应用内部各组件之间的消息传递,解耦系统之间的依赖。
2 MQS功能特点
消息队列最早出现在操作系统中,解决了传统的进程通信模式中存在的很多弊端。消息队列具备的优点包括:
(1) 单独对消息的收、发进行管理,确保消息的成功传递。
(2) 提供异步的通信协议,消息产生者只需要将消息发送到消息队列中,即可立刻返回。
(3) 大大降低异构系统之间的耦合度。
在大数据时代,传统的消息队列无法满足日益增长的消息通信需求,用户个人搭建消息队列集群会带来较大的机器和运维成本;同时随着移动端规模的爆发式增长,对消息队列的安全性、可靠性以及可扩展性提出了挑战。阿里云推出的消息队列服务(MQS)是基于阿里云飞天云平台上的消息中间件服务,相比传统的消息队列而言,具备如下特点:
- 零运维、高性能、高可扩展。
- 数据多冗余架构,确保消息的可靠性。
- 在有效期内,保证每条消息至少可被消费一次(at-least-once)。
- 允许创建海量的消息队列。
- API接口简单易用,对平台无依赖。
- 不严格保证消息的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中显示了一条消息的整个生命周期。
在PutMessage之后,消息进入到队列中,即成为能够被取出的ActiveMessage;(如图2中A所示)
在消费者取出该条消息之后则转变为InactiveMessage;(如图2中B所示)
a) 如果在VisibilityTimeout时间段内,消费者将该条消息消费完毕,并发送删除请求,则该消息将会从队列中删除;(如图2中C所示)
b) 如果消费者未完成消费,则InactiveMessage将会在VisibilityTimeout之后自动转换成ActiveMessage,从而可以再次被取出消费;(如图2中D所示)
在消息有效时间过后,消息将变为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会将服务的稳定性和安全性放在首位,主要工作将包括:
开放账户访问权限授予的API接口;
增加队列状态监控报警机制;
同时,在功能和性能方面将进行更多的尝试:
长连接功能打开;
后端server采用更高效的异步处理模式;
死信队列,消息数据备份等。