阿里云消息中间件(MQ)探秘

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里云消息中间件(MQ)探秘相关的知识,希望对你有一定的参考价值。

参考技术A 阅读字数: 2513 | 5分钟阅读

获取嘉宾演讲视频及PPT ,请点击: http://t.cn/RDVY4JN

阿里巴巴中间技术专家不铭从功能特性、技术架构、最佳实践、案例分析四个方面进行了《Aliware-MQ消息队列》的分享。

Aliware-MQ是阿里云提供的企业级互联网架构的核心产品,基于高可用分布式集群技术,支持海量高并发和万亿级消息流转,支持海量的消息堆积,支持高可靠/高可用方案,提供了运维、监控等一系列完整的配套服务。

如上图所示,从消息的维度来看分为普通消息、顺序消息、定时消息和事务消息等四种消息,无论是发送哪种消息客户端都支持熔断机制,即如果发现发送目标节点有性能问题,客户端会自动进行熔断,把有问题的节点排出去,保证消息发往可靠性最高的机器。管理方面已经支持消息的查询、消息回溯、消息全链路轨迹和监控报警机制。性能上MQ已经达到了百亿级的堆积能力,毫秒级的投递延迟,支持万级节点高并发,集群水平热扩缩。消息消费方面,支持失败后的消息重投机制,失败的消息会重新投递到队列中去,现在最多支持16次重投。

上图是Aliware-MQ的功能架构。左边是控制台的管理,可以在上面做发布订阅管理。右边目前的接入方式是SDK支持TCP协议,同时也支持HTTP接口,以及面向手机终端的MQTT协议。

OpenAPI是MQ提供给用户的管控方式,用于实现一系列资源管理和运维功能,用户可以通过Open API查询所需要的任何东西。

上图中是我们今年推出的一个MQ移动物联网套件。之前的客户端,不管是上游还是下游收发都是用各自的服务器。但是今年我们有了移动物联网套件,可以直接面向终端设备。比如手机、汽车等移动设备利用移动物联网套件,通过一个网关就可以直接和消息系统打通。

Aliware-MQ的消息系统是基于队列。队列要保证数据安全,是支持高并发和高性能读写的最基本元素。

如上图所示,Producer是消息发送集群,下游的Consumer是消费者集群,都依赖于MQ的SDK。Broker是消息服务器,所有的消息都发送到Broker上面;Name Server和ZK功能类似,用来做服务发现。Producer要从Name Server获取到Topic在哪个节点上,订阅Topic时需要知道Topic从哪里取,同样需要Name Server。Broker上的Topic信息会定时在Name Server上注册,Producer和Consumer在交互之前会从Name Server上获取目标。

图中的master是主机,slave是备机,主备之间会做数据同步,有异步和同步两种方式。一个master可以布多个节点,这个根据自己的成本来决定。如果扩容的话,只要直接布一台master即可,它会定时地将Topic注册到Name Server上,发送方和订阅方也会定时地感知这个过程,整个扩容的过程对于用户来说大概30秒就能完成。

Aliware-MQ所有数据存储在Commit Log里,它在实现上就相当于一个文件夹,每次会生成一个1G的文件。不管哪个Topic写过来的消息都会直接写入这个文件中,这个文件写满后再直接写下一个。

针对每一个Topic,要在业务层面对它进行区分,所以我们做了一层索引。例如在上图中有5个队列,每个队列都会生成定长的索引文件,通过索引,可以找到这条消息当前处于哪个CommitLog文件的某个具体位置中。

这样存储结构,保证了无论多少个topic,CommitLog的写是顺序的,能较大的保证MQ的写入性能。

Aliware-MQ的负载均衡是按照队列维度来做的,消费的时候会把topic的队列平均分配给消费实例。比如有2个消费实例,topic队列是4个,那么每个消费实例就消费2个;而如果共有5个队列,那么就是是1个消费2个,另1个消费3个。一个队列同一时间只会被一个消费实例消费,所以当出现队列数量小于消费实例数量的情况时,就会有消费实例出现空闲,这个时候可以根据业务实际情况手动通过工具将队列数量调大。

消息写进来都是先放在Java堆里,然后再落盘。如果用户要消费的消息都在内存里,那么就可以很快的读取到。但是如果用户消息堆积比较久,消息已经不在内存里而是存储在了磁盘中,这个时候就需要去磁盘里取数据,然后加载到内存里面读取出来。

Aliware-MQ的刷盘策略有异步和同步两种。异步到内存就返回成功,同步写则一定是消息刷到磁盘中才会返回成功。这种刷盘方式可以根据业务的具体需求进行配置,从写入的性能来看,异步写的性能肯定是会比同步的好。

从发消息的角度来看,如果发送失败,会有补偿机制。MQ的客户端会做三次重发,一台机器发送失败之后会默认往另外两台机器再尝试,如果三次都失败了才会把最终的失败结果传回,这个时候用户需要自己对发送异常进行相关处理。

有幂等要求的业务,Consumer在使用的时候需要自己做去重操作,在一些场景下,如客户端本地等待超时等,是无法保证消息完全不重复的,因此用户在进行系统设计时需要考虑到这一点。

Aliware-MQ目前支持的消息最大是4M,消息越小,性能越高。定时消息是支持消息的定时投递,可以自行设置要投递的时间,最长是40天。事务消息通过两阶段的提交的方式,来解决分布式事务问题。顺序消息可以采用全局顺序、分区顺序,严格保证消息的顺序。

Aliware-MQ的使用场景主要有系统间异步解耦、分布式事务、异构数据复制与分发、双十一大促的削峰填谷、大规模机器的Cache同步、日志服务和IM实时通信以及实时计算分析。

MQ顺序消息分为全局有序和队列有序。全局有序是从指所有消息发出开始,下游的接收方都是按照顺序接收;队列有序则是将消息进行区块分区,同一个分区内的消息按照先入先出的顺序进行顺序消费,保证一个队列只会被一个进程消费。

当一个交易系统下单之后,会发一条消息到MQ,购物车接收消息把购物车里的状态清空。如果这时交易消息发送失败,购物车就无法清空,对于数据来说这就是一个脏数据。面对这种情况我们有事务消息可以解决这个问题,在交易开始时先发送一条半事务消息,然后交易系统开始下单,所有事情做完之后再提交半事务,这时只有主动提交成功,消息队列才会将这条消息实际发送给用户。如果交易下单过程失败,则可以主动回滚这条消息,购物车和交易系统之间可以做到没有脏数据。

双十一大促时,各个分会场会有玲琅满目的商品,每件商品的价格都会实时变化。使用缓存技术也无法满足对商品价格的访问需求,缓存服务器网卡跑满。访问较多次商品价格查询影响会场页面的打开速度。于是MQ提供了一种广播机制,本来一条消息只会被集群的一台机器消费。如果使用广播模式,那么这条消息会被集群下的所有节点消费一次,相当于把价格信息同步到需要的每台机器上,可以取代缓存的作用。

实时计算功能主要是做一个消息总线,业务系统自动采集数据,把消息分发达下游的实时计算系统里,根据实时计算结果来给业务方做服务。

我今天的分享就到这里,谢谢大家!

以上是关于阿里云消息中间件(MQ)探秘的主要内容,如果未能解决你的问题,请参考以下文章

初识MQ消息队列

消息中间件MQ详解及四大MQ比较

消息中间件MQ详解及四大MQ比较

消息中间件MQ详解及四大MQ比较

消息中间件MQ详解

消息中间件之MQ详解及四大MQ比较