RabbitMQ的消息模型 骑猪看日落 2024-03-27 11:34 13阅读 0赞 #### 文章目录 #### * * 1、简单队列 * 2、work 模式 * 3、发布/订阅模式 * 4、路由模式 * * Fanout * Direct * 5、主题模式 * 6.工作模式总结 * 7、四种交换器 -------------------- RabbitMQ官方提供了5个不同的Demo示例,对应了不同的消息模型: ![image-20230202121015997][] ### 1、简单队列 ### 一个生产者对应一个消费者!! * publisher:消息发布者,将消息发送到队列queue * queue:消息队列,负责接受并缓存消息 * consumer:订阅队列,处理队列中的消息 ![image-20230202121318578][] ### 2、work 模式 ### 一个生产者对应多个消费者,但是一条消息只能有一个消费者获得消息!!! 轮询分发就是将消息队列中的消息,依次发送给所有消费者。一个消息只能被一个消费者获取。 ![image-20230202121758958][] ### 3、发布/订阅模式 ### 一个生产者将消息首先发送到交换器,交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费。 * Publisher:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机) * Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有以下3种类型: * Fanout:广播,将消息交给所有绑定到交换机的队列 * Direct:定向,把消息交给符合指定routing key 的队列 * Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列 * Consumer:消费者,与以前一样,订阅队列,没有变化 * Queue:消息队列也与以前一样,接收消息、缓存消息。 **Exchange(交换机)只负责转发消息,不具备存储消息的能力**,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失! ![image-20230202121824107][] ### 4、路由模式 ### #### Fanout #### ![在这里插入图片描述][ceef3df9e55a45fc9012a74b7876ceb0.png] 在**广播模式**下,消息发送流程是这样的: * 1) 可以有多个队列 * 2) 每个队列都要绑定到Exchange(交换机) * 3) 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定 * 4) 交换机把消息发送给绑定过的所有队列 * 5) 订阅队列的消费者都能拿到消息 #### Direct #### ![image-20230202122717317][] 在**Direct模型**下: * 队列与交换机的绑定,不能是任意绑定了,而是要指定一个`RoutingKey`(路由key) * 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 `RoutingKey`。 * Exchange不再把消息交给每一个绑定的队列,而是根据消息的`Routing Key`进行判断,只有队列的`Routingkey`与消息的 `Routing key`完全一致,才会接收到消息 生产者将消息发送到direct交换器,在绑定队列和交换器的时候有一个路由key,生产者发送的消息会指定一个路由key,那么消息只会发送到相应key相同的队列,接着监听该队列的消费者消费消息。 也就是让消费者有选择性的接收消息。 路由模式,是以路由规则为导向,引导消息存入符合规则的队列中。再由队列的消费者进行消费的。 ### 5、主题模式 ### ![image-20230202122815568][] 上面的路由模式是根据路由key进行完整的匹配(完全相等才发送消息),这里的通配符模式通俗的来讲就是模糊匹配。 符号“\#”表示匹配一个或多个词,符号“\*”表示匹配一个词。 与路由模式相似,但是,主题模式是一种模糊的匹配方式。 ### 6.工作模式总结 ### 这五种工作模式,可以归为三类: 生产者,消息队列,一个消费者; 生产者,消息队列,多个消费者; 生产者,交换机,多个消息队列,多个消费者; ### 7、四种交换器 ### 1、direct 如果路由键完全匹配的话,消息才会被投放到相应的队列。 2、fanout 当发送一条消息到fanout交换器上时,它会把消息投放到所有附加在此交换器上的队列。 3、topic 设置模糊的绑定方式,“\*”操作符将“.”视为分隔符,匹配单个字符;“\#”操作符没有分块的概念,它将任意“.”均视为关键字的匹配部分,能够匹配多个字符。 4、headerheaders 交换器允许匹配 AMQP 消息的 header 而非路由键,除此之外,header 交换器和 direct 交换器完全一致,但是性能却差很多,因此基本上不会用到该交换器 [image-20230202121015997]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/b659e5d03fa2412d8ef41c536e4097ac.png [image-20230202121318578]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/ec62ed4065264b858687d494fbea5fd2.png [image-20230202121758958]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/ac09f6c813ca476fa361145683c1015a.png [image-20230202121824107]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/10635e1cb8d746af88d07cd09c935e4f.png [ceef3df9e55a45fc9012a74b7876ceb0.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/af50e70ea76841589f8c52ce624e8d4c.png [image-20230202122717317]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/cd668a12762b4b799b47d7454bb576bd.png [image-20230202122815568]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/3230aeb668734e0e986ffde45ae3d287.png
还没有评论,来说两句吧...