当前位置: 首页>后端>正文

消息队列和管道 消息队列通信

消息队列(Message Queue,MQ)其实是一个古老的计算机术语,UNIX进程间通信就是用到了消息队列技术:一个进程把数据写入某个特定的队列中,其他进程可以读取队列中的数据,从而实现异步通信能力。而后来我们所说的“消息队列”通常指独立的消息队列中间件。不管是最早的进程间通信的消息队列还是独立的消息队列中间件,他们相对于RPC通信来说都有以下很明显的优势。

  1. 程序、模块之间的耦合性大大降低。
  2. 消息、事件、请求的顺序性与数据的可恢复性。
  3. 异步通信能力。
  4. 缓冲能力。

前两个优势不用多解释了,我们重点分析后面两个优势。

首先是异步通信能力,我们知道RPC通信是一个同步的过程,这意味着当前线程调用必须要等到整个RPC方法调用完成之后才能继续下面的逻辑,这对于系统的并发性及用户界面的友好性都是一个挑战。而消息队列天然的异步模式(单方面接受消息)则很好的在这方面弥补了RPC的不足,但由于异步通信也存在程序设计和编程方面的复杂度,所以我们看到现在的大型分布式系统往往结合了RPC与消息队列这两种机制来解决多进程的通信问题,比较经典的案例就是OpenStack。

缓冲能力是消息队列的另一种重要及独特的能力。由于消息队列的容量可以设计得很大 ,如果采用磁盘存储消息,则几乎等于“无限”容量,这样一来,高峰期的消息可以被积压起来,在随后的时间内平滑处理完成,而不至于让系统无法承载并导致崩溃。在电商网站的秒杀抢购这种突发性流量很强的业务场景中,消息队列的强大缓冲能力可以很好的起到“抵抗洪峰”的作用。

在一个秒杀系统中,消息队列就像一个巨大的蓄水池,将大量的并发请求先缓冲下来,并且基本保持了请求的先后顺序,后端服务再慢慢处理队列中的秒杀信息,并把抢购成功的请求保存在数据库中备查。

鉴于消息中间件在分布式架构设计及性能优化方面有着非常重要的地位,很多大型的门户网站和商业平台的架构栈里都包含了某种消息中间件,如阿里、腾讯、京东等。由于消息中间件在大型电商网站中的作用越来越大,所以不断有新的消息中间件诞生,而LinkedIn新一代消息中间件Kafka的开源更是引爆了互联网。

目前市面上的消息队列从“年龄”及“技术先进性”这两个方面评价,基本上可以划分为老中新三代。

第一代是J2EE时代的产物,强调企业级特性,比如消息持久性与事务的要求,都遵循JMS规范。其中最著名的产品就是ActiveMQ了。

第二代是后Java时代的产物,由于在Java(J2EE)时代,消息中间件都是围绕Java语言和Java生态圈发展的,并且这个市场主要被IBMTibco (—家超过20年历史的老牌中间件公司)两家公司垄断,这种高度封闭和垄断的市场无论对于软件供应商还是用户来说都不是一个健全和健康的市场,于是就出来了一些“搅局者”,这些人由银行等大财团(消息中间件的大客户)与一些小的供应商所组成,他们密谋制定了一个开放性的、没有专利从而能够免费的消息中间件协议 AMQP( Advanced Message Queuing Protocol),希望 AMQP 能够像 HTTP、HTML这样的IT标准一样,吸引更多的软件开发商去实现兼容AMQP的各种消息中间件产品,从而打破巨头们的垄断,促进这个领域的健康持续发展。他们真的做到了!作为第一个也是最知名的开源AMQP消息中间件产品,RabbitMQ基于Erlang开发,诞生于2007年,十年之后,己经发展成为最流行的开源消息中间件产品,全球各地的生产部署案例己经超过35000个!AMQP的成功也影响了 Java领域的消息中间件,比如Apache专门开源了 Qpid这个基于AMQP协议的消息中间件项目,提供了包括Java和C++在内的多语言版本Server,同时ActiveMQ在2013年就开始支持AMQP协议了,后来Apache还推出了名为ActiveMQ Apollo的新项目,也实现了包括AMQP在内的多种消息协议。

第三代是互联网时代的产物,他们在设计思路上大胆采用了新一代的分布式系统设计理念,比如一开始就面向分布式,并采用Zookeeper实现去中心化的集群管理。第三代消息中间件以Linkedln开源的Kafka为代表,Kafka使用Scala编写,也属于Java领域的开源软件。 Kafka由于其良好的水平扩展能力及高性能(高吞吐率)被广泛使用,从而为Java扳回一局,它常常被作为多种类型的数据管道和消息系统使用,当前越来越多的重量级开源分布式处理系统如Cloudera、Apache Storm、 Spark都支持与Kafka集成。由于Kafka优势突出,国内多家公司都先后用Java语言高仿Kafka,其中搜狐的高仿开源项目叫作Jafka;阿里巴巴则放弃了之前基于MySQL存储的消息中间件Notify,转而高仿出了被称为阿里巴巴的第三代分布式消息中间件的RocketMQ,RocketMQ在阿里巴巴集团内被广泛应用在订单、交易、充值、流计算、消息推送、日志流式处理、 binglog分发等场景中。 RocketMQ于2012年开源,开源之后基本没人维护了(这似乎是阿里巴巴一贯的做法,闭源产品持续发展但开源项目停滞不前)。2016年阿里巴巴又将RocketMQ捐献给了 Apache,而阿里巴巴内部则继续发展RocketMQ的闭源版本,实现了阿里云平台上收费的消息中间件产品,在收费的产品中增加了诸如发送者事务、消息轨迹等高级功能。

以Kafka为代表的第三代消息中间件的诞生和迅猛发展,不仅意味着MQ并没有死亡和停止发展,而且意味着新一代MQ在新兴物联网和大数据领域会发回越来越大的作用。

参考:架构揭秘从分布式到微服务



https://www.xamrdz.com/backend/3mn1937769.html

相关文章: