以Rabbit MQ为例讲透消息队列

译文
开发 前端
本文向您简单介绍了消息队列模型Rabbit MQ的基本特点,并讨论了不同类型的交换,可作为消息队列的初学者指南。

【51CTO.com快译】在早年的单体架构时代,由于应用程序的内部组件存在着紧密的耦合关系,因此它们之间存在着千丝万缕的直接关联。例如,在一个简单的电子商务应用中,其结帐服务需要与支付网关服务保持通信。这就得依靠TCP的直接连接来完成。由此,我们很容易碰到如下限制场景:

  • 一旦结帐消息被发出后,应用需要能够及时侦听到,并予以答复,方可继续执行下一个任务。
  • 如果库存服务出现了故障,应用将进行反复尝试,直至连接被成功建立为止。
  • 如果同时有大量的支付请求产生,库存服务将由于供不应求,而导致整个系统陷入瘫痪。

可以说,这些都是创建消息队列和代理(message queues/brokers)的“刚需”。

什么是消息队列

如下图所示,消息队列往往处于需要彼此通信的两个服务之间:

通信服务的流程图

如上图所示,系统1通常作为生产者(producer)会将消息添加到队列中,以便立即执行下一个任务。

在准备就绪后,系统2作为使用者(consumer)会从队列中获取消息,予以处理,并在完成后立即转向下一条消息。据此,两个应用系统实现了逻辑上的解耦关系。

同时,消息代理也有助于提高系统的可扩展性。当系统中有大量并发的“获取”操作时,队列会出现拥堵,这就意味着我们需要提供更多的取出服务。那么在上述例子的系统2中,如果有多个使用者要从队列中读取内容,以满足由大量用户的支付请求所产生的负载时,应用系统需要具一定的可扩展能力。

此外,消息队列的另一个好处是:队列本身可以被构建在计算机或服务器的内部,以分担Web应用程序的某些工作,进而提高系统的整体性能。

生产者和使用者的流程图

不知您是否听说过RabbitMQ?它是高级消息队列协议(Advanced Message Queuing Protocol,AMQP)模型的实现。

在此类消息模型中,生产者会去获取那些由服务产生的消息。就效率而言,与其我们直接产生一个消息队列,不如产生消息的交换节点。而交换节点恰好可以像中转邮局一样,去接收所有的消息,然后根据它们的处理方式予以分发。

如上图所示,一个交换节点可以连接多个队列。在上面的例子中,使用者1、2、3在系统中扮演等待队列连接的使用者。它们需要用到(consume)结帐服务。也就是说,在该流程中,结帐操作将发送一条消息给交换节点。而此类交换是通过各种绑定(bindings)被连接到不同的队列上。当然,我们可以通过绑定键(binding key),来引用这些绑定,以方便它们进入应用程序中使用者服务的子队列。

生产者和交换的流程图

我们之所以要采用消息这种方式,主要是利用其能够在系统中按需移动的灵活性。而这种灵活性在很大程度上,取决于可用于交换的不同类型。下面,让我们来讨论几种常见的交换类型:

扇出交换(Fanout Exchange)

扇出交换是将消息路由到与其绑定的所有队列,同时忽略其路由键。如果我们将N个队列绑定至扇出交换,那么在有新的消息被发布到该交换处时,此消息的副本将会被传递到所有N个队列中。

简而言之,生产者产生待交换的消息,而交换会在收到该消息后予以复制,并将其发送到自己知晓的每个队列处。可见,扇出交换是对消息进行广播路由的理想选择。

扇出交换

直接交换(Direct Exchange)

作为消息单播路由的理想选择,直接交换会基于消息路由密钥(message routing key),将消息传递到队列处。

简而言之,生产者产生待交换的消息。该消息带有对应的路由密钥信息。交换会将路由密钥与已绑定密钥进行比较,如果完全匹配的话,消息则会被转移至相应地系统中。 


直接交换

主题交换(Topic Exchange)

我们事先会将队列绑定到交换主题的模式上,然后将其与消息路由键进行匹配,进而将不同的消息分别路由到一个或多个队列处。

简而言之,通过主题交换,我们可以在路由键和绑定键之间进行部分匹配。因此,该交换通常被用于消息的多播路由。

主题交流

头部交换(Header Exchange)

头部交换并不关注路由键的属性,而是根据不同的消息头部值,将各种消息路由到相应的队列中。

简而言之,路由密钥会被完全忽略,而消息会根据其头部值在系统中移动。

标头交换

默认交换(Default Exchange)

默认交换是一种由代理(broker)预先声明的不带名称(即:空字符串)的直接交换方式。简而言之,消息的路由键与队列的名称是联系在一起的。

由于每个被创建的队列都会使用与队列名称相同的路由键,来自动绑定到正确的队列上,因此它对于简单的应用而言,非常实用。

默认交换

除了上述五种灵活的交换类型,Rabbit MQ的优点还包括:云计算友好、容错能力、跨语言能力、通信安全性、消息确认能力、以及开源等特点。

原文标题:Message Queue (Rabbit MQ): A Beginners IntroductionMessage Queue (Rabbit MQ): A Beginners Introduction,作者: Vijay Thakare

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:华轩 来源: 51CTO
相关推荐

2019-08-23 12:12:49

MQ消息队列

2020-07-30 08:03:36

MQ死信队列

2021-08-02 09:50:47

Vetur源码SMART

2009-08-06 16:21:09

点对点消息队列

2019-10-22 08:12:49

消息队列分布式系统

2016-12-20 12:34:46

存储MySQL流程

2018-08-22 16:40:51

前端JavascriptVue

2017-10-11 15:08:28

消息队列常见

2011-07-08 09:55:02

数据中心防震

2021-04-20 08:32:51

消息MQ队列

2009-03-02 16:57:34

LinuxUbuntu配置完全方案

2022-01-10 12:23:00

TypeScript ESLint前端

2021-01-14 09:00:00

开发FedoraUbuntu

2009-06-14 17:18:55

ibmdwWebSphereMQ

2023-06-29 10:10:06

Rocket MQ消息中间件

2023-10-24 07:50:18

消息中间件MQ

2022-02-14 14:28:57

驱动开发鸿蒙系统

2021-04-16 08:20:00

Flink CEP直播监控

2020-03-12 09:02:34

数据思维统计学大数据

2015-05-07 11:24:13

DockerIT技术评价新技术
点赞
收藏

51CTO技术栈公众号