其他分享
首页 > 其他分享> > 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