ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RabbitMQ的工作模式概念详解

2022-05-30 14:34:35  阅读:177  来源: 互联网

标签:交换器 routingKey 队列 模式 详解 RabbitMQ 消费者 路由 消息


目录

一、核心概念

  • 生产者:发送消息的应用程序。
  • 消费者:接收消息的应用程序。
  • 队列:存储消息的缓冲区。
  • 消息:通过RabbitMQ从生产者发送给消费者的信息。
  • 连接:连接是应用程序和RabbitMQ代理之间的TCP连接。
  • 通道:通道是连接内的虚拟连接。当您从队列中发布或使用消息时 - 它们都是通过通道完成的。
  • Exchange:接收来自生产者的消息,并根据交换类型定义的规则将其推送到队列。要接收消息,需要将队列绑定到至少一个交换。
  • 绑定:绑定是队列和交换之间的链接。
  • 路由密钥:路由密钥是交换机查看的密钥,用于决定如何将消息路由到队列。路由密钥就像消息的地址。
  • AMQP:AMQP(高级消息队列协议)是RabbitMQ用于消息传递的协议。
  • 用户:可以使用给定的用户名和密码连接到RabbitMQ。可以为每个用户分配权限,例如在实例中读取,写入和配置权限的权限。

二、工作模式

2.1 simple简单队列

最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列。也称为点对点模式

660cfa5db41d45298debdcd6b9a08732.png

1.生交给默认的交换机(AMQP default)
2.交换机获取消息后交给绑定这个生产者的队列(关系是通过队列名称完成)
3.消费者监听当前队列的消费者获取消息,执行消费逻辑
应用场景:聊天(中间有一个过度的服务器;p端,c端)

2.2 work工作队列

生产者发消息,启动多个消费者实例来消费消息,每个消费者仅消费部分信息,可达到负载均衡的效果。

e6ed585f24c7ab026ea9c70b5ad8c5ce.png

1.循环分发,假如我们拥有两个消费者,默认情况下,RabbitMQ 将按顺序将每条消息发送给下一个消费者,平均而言,每个消费者将获得相同数量的消息,这种分发消息的方式称为轮询,可达到负载均衡的效果。

2.消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费?C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息。

3.(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)。

4.应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)。

2.3 publish/subscribe发布订阅(共享资源)

使用fanout类型交换器,routingKey忽略。每个消费者定义生成一个队列并绑定到同一个 Exchange,每个消费者都可以消费到完整的消息。消息广播给所有订阅该消息的消费者。

0aff369c26ef9dcbdca2f1e4dd319308.png

1.在RabbitMQ中,生产者不是将消息直接发送给消息队列,实际上生产者根本不知道一个消息被发 送到哪个队列。

2.生产者将消息发送给交换器。交换器非常简单,从生产者接收消息,将消息推送给消息队列。交换器必须清楚地知道要怎么处理接收到的消息。应该是追加到一个指定的队列,还是追加到多个队列,还是丢弃。规则就是交换器类型。

3.交换器的类型: direct 、 topic 、 headers 和 fanout 四种类型。发布订阅使 用fanout。fanout 交换器从名字就可以看出来(用风扇吹出去),将所有收到的消息发送给它知道 的所有的队列。

应用场景:邮件群发,广告

2.4 路由模式

使用 direct 类型的Exchange,发N条消费并使用不同的 routingKey ,消费者定义队列并将队 列、 routingKey 、Exchange绑定。此时使用 direct 模式Exchagne必须要 routingKey 完全匹配的 情况下消息才会转发到对应的队列中被消费。

img

1.消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;

2.在路由模式它会把消息路由到那些 binding key 与 routing key 完全匹配的 Queue 中,此模式也就是 Exchange 模式中的direct模式

3.从系统的代码逻辑中获取对应的功能字符串,以 routingKey="error" 发送消息到 Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…)。如果我们以 routingKey="info" 或 routingKey="warning" 来发送消息,则消息只会路由到 Queue2。如果我们以其他 routingKey 发送消息,则消息不会路由到这两个 Queue 中

应用场景:根据生产者的要求发送给特定的一个或者一批队列;错误的通报;

2.5 topic主题模式

使用 topic 类型的交换器,队列绑定到交换器、 bindingKey 时使用通配符,交换器将消息路由转发到具体队列时会根据消息 routingKey 模糊匹配,比较灵活。

6bcce34667f6299e699badc4f06794ce.png

1. P 表示为生产者、 X 表示交换机、C1C2 表示为消费者,红色表示队列。

2."*" 表示任何一个词 "#" 表示0或多个词

3.topics 模式与 routing 模式比较相近,topics 模式不能具有任意的 routingKey,必须由一个英文句点号“.”分隔的字符串(我们将被句点号“.”分隔开的每一段独立的字符串称为一个单词),比如 "lazy.orange.fox"。topics routingKey 中可以存在两种特殊字符“”与“#”。

4.如果一个消息的 routingKey 设置为 “xxx.orange.rabbit”,那么该消息会同时路由到 Q1 与 Q2,routingKey="lazy.orange.fox”的消息会路由到Q1与Q2;

routingKey="lazy.brown.fox”的消息会路由到 Q2;

routingKey="lazy.pink.rabbit”的消息会路由到 Q2(只会投递给Q2一次,虽然这个routingKey 与 Q2 的两个 bindingKey 都匹配);

routingKey="quick.brown.fox”、routingKey="orange”、routingKey="quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey。

5.如果在 topic 类型的交换器中 bindingKey 使用 # ,则就是 fanout 类型交换器的行为。

6.如果在 topic 类型的交换器中 bindingKey 中不使用 * 和 # ,则就是 direct 类型交换器的行为

标签:交换器,routingKey,队列,模式,详解,RabbitMQ,消费者,路由,消息
来源: https://www.cnblogs.com/jbjia/p/16326637.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有