公司使用的消息队列主要是RocketMQ,之前没有接触过。上网找RocketMQ的学习资料,基本都是零零碎碎的博客。最好的参考就是官网的资料的,但是官网的资料对于我这个英文比较差并且不懂java代码的运维来说实在是太不友好了。后来找到了这本书,里面虽然也有大量的java代码,但是这本书对于运维来说还是很友好,看过之后对RocketMQ的原理和实战都有一定的了解了。下面是书本的一些自认为关键的内容,不包含java代码的解析。(书中的示例用的是rocketmq4.2.0版本的,我实验用的是4.4.0)
本章可以让读者了解RocketMQ 和分布式消息队列的功能,然后搭建好单机版的消息队列,进而能够发送并接收简单的消息。
1.1 消息队列功能介绍
简单来说,消息队列就是基础数据结构课程里“先进先出”的一种数据结构,但是如果要消除单点故障,保证消息传输的可靠性,并且还能应对大流量的冲击,对消息队列的要求就很高了。现在互联网“微架构”模式兴起,原有大型集中式的IT 服务因为各种弊端,通常被分拆成细粒度的多个“微服务”,这些微服务可以在一个局域网内,也可能跨机房部署。一方面对服务之间松耦合的要求越来越高,另一方面,服务之间的联系却越来越紧密,对通信质量的要求也越来越高。分布式消息队列可以提供应用解耦、流量消峰、消息分发等功能,已经成为大型互联网服务架构里标配的中间件。
1.1.1 应用解耦
复杂的应用里会存在多个子系统, 比如在电商应用中有订单系统、库存系统、物流系统、支付系统等。这个时候如果各个子系统之间的耦合性太高,整体系统的可用性就会大幅降低。多个低错误率的子系统整合在一起,得到的是一个高错误率的整体系统。
以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。
如图1-1 所示, 当转变成基于消息队列的方式后,系统可用性就高多了,比如物流系统因为发生故障,需要几分钟的时间来修复,在这几分钟的时间里,物流系统要处理的内容被缓存在消息队列里,用户的下单操作可以正常完成。当物流系统恢复后,补充处理存储在消息队列里的订单信息即可,终端用户感知不到物流系统发生过几分钟的故障。
1.1.2 流量削峰
每年的双十一,淘宝的很多活动都在0 点的时候开启,大部分应用系统流量会在瞬间猛增,这个时候如果没有缓冲机制,不可能承受住短时大流量的冲击。通过利用消息队列,把大量的请求暂存起来,分散到相对长的一段时间内处理,能大大提高系统的稳定性和用户体验。
举个例子,如果订单系统每秒最多能处理一万次下单,这个处理能力应对正常时段的下单是绰绰有余的,正常时段我们下单后一秒内就能返回结果。在双十一零点的时候,如果没有消息队列这种缓冲机制,为了保证系统稳定,只能在订单超过一万次后就不允许用户下单了;如果有消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单后十几秒才能收到下单成功的状态,但是也比不能下单的体验要好。
使用消息队列进行流量消峰,很多时候不是因为能力不够,而是出于经济性的考量。比如有的业务系统,流量最高峰也不会超过一万QPS ,而平时只有一千左右的QPS 。这种情况下我们就可以用个普通性能的服务器(只支持一千左右的QPS 就可以),然后加个消息队列作为高峰期的缓冲,无须花大笔资金部署能处理上万QPS 的服务器。
1.1.3 消息分发
在大数据时代,数据对很多公司来说就像金矿,公司需要依赖对数据的分析,进行用户画像、精准推送、流程优化等各种操作, 并且对处理的实时性要求越来越高。数据是不断产生的,各个分析团队、算法团队都要依赖这些数据来进行工作,这个时候有个可持久化的消息队列就非常重要。数据的产生方只需要把各自的数据写人一个消息队列即可数据使用方根据各自需求订阅感兴趣的数据,不同数据团队所订阅的数据可以重复也可以不重复,互不干扰,也不必和数据产生方关联。
如图1-2 所示,各个子系统将日志数据不停地写人消息队列,不同的数据处理系统有各自的Offset ,互不影响。甚至某个团队处理完的结果数据也可以写人消息队列,作为数据的产生方,供其他团队使用,避免重复计算。在大数据时代,消息队列已经成为数据处理系统不可或缺的一部分。
除了上面列出的应用解耦、流量削峰、消息分发等功能外,消息队列还有保证最终一致性、方便动态扩容等功能。
1.2 RocketMQ 简介
阿里的消息中间件有很长的历史,从2007 年的Notify 到2010 年的Napoli, 2011 年升级后改为MetaQ ,然后到2012 年开始RocketMQ, RocketMQ 使用Java 语言开发,于2016 年开源。第一代的Notify 主要使用了推模型,解决了事务消息;第二代的MetaQ 主要使用了拉模型,解决了顺序消息和海量堆积的问题。RocketMQ 基于长轮询的拉取方式, 兼有两者的优点。
每一次产品迭代,都吸取了之前的经验教训,目前RocketMQ 已经成为 Apache 顶级项目。在阿里内部, RocketMQ 很好地服务了集团大大小小上千个应用,在每年的双十一当天,更有不可思议的万亿级消息通过RocketMQ 流转(在2017 年的双十一当天,整个阿里巴巴集团通过RocketMQ 流转的线上消息达到了万亿级,峰值TPS 达到5600 万),在阿里大中台策略上发挥着举足轻重的作用。
此外, RocketMQ 是使用Java 语言开发的,比起Kafka 的Scala 语言和RabbitMQ 的Erlang 语言,更容易找到技术人员进行定制开发。
1.3 快速上手RocketMQ
本节介绍如何安装配置单机版的RocketMQ ,以及简单地收发消息。读者也可以参考RocketMQ 官网的说明文档。(可以看我的对应博客 )
1.4 本章小结
本章介绍了消息队列的功能,以及RocketMQ 这个消息队列从阿里诞生的历史。然后基于快速上手的目的, 本章直接给出了一些命令示例, 读者跟着操作即可快速启动一个RocketMQ 服务,并且可以尝试发送和接收简单的消息。有了本章的初步体验后,下一章将介绍如何在生产环境使用RocketMQ 。