|
|
|
|
公众号矩阵

以Rabbit MQ为例讲透消息队列

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

作者:陈峻来源:51CTO|2021-05-31 08:00

【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】

【编辑推荐】

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区
  2. 售前&产品&架构专题-如何准备售前方案汇报?
  3. 如何成为一名优秀的架构师? 你需要吸取这些经验
  4. Java架构师之企业级Jenkins的部署和案例教程
  5. 消息队列与工作流视频课程
  6. 架构师的盛宴(架构设计+设计模式+大数据+机器学习)系列视频课程
【责任编辑:华轩 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

带你轻松入门 RabbitMQ

带你轻松入门 RabbitMQ

轻松入门RabbitMQ
共4章 | loong576

7人订阅学习

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

8人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

40人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微