Python-RabbitMQ fanout广播模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-RabbitMQ fanout广播模式相关的知识,希望对你有一定的参考价值。

现实生活中,机器的配置不同,有的性能高,有的性能低,有可能A机器处理了四条消息,B机器一条消息还没处理完,要是按照轮询方式来分发消息的话,那就是A机器一直是空闲,B机器有一大丢消息处理不完。我们在部署集群的时候,往往要添加一个服务器的权重值,那个服务器性能好就多给它点儿任务,那么在RabbitMQ怎么办呢?RabbitMQ里的公平分发是指你有多大本事就干多少活儿,比如A机器处理速度快RabbitMQ就多给它发,B机器处理速度慢就给它少发。
RabbitMQ是这样做的,Server端在给Client发消息时会先检查Client端还有多少条消息没有处理完,如果当前队列里消息大于1就不发,队列里为空就发。
只需要在**消费者**端加一条短短的代码channel.basic_qos(prefetch_count=1)即可。

我们编辑两个消费者端来测试receive.py和receive2.py
技术分享图片

技术分享图片
编辑完成后,开启两个消费者端,用生产者连续发消息测试,可以看到在receive2没有处理完的时候,生产者的消息是不会发送给它的。

以上例子都是一对一的发消息,也就是说生产者发一条消息,只有一个消费者能接收,那现在学习一下让所有消费者都能接收到(广播效果),这时候就要用到Exchange了,Exchange一端接收生产者的消息,一段是把消息投递到Queue中,Exchange必须精确的知道投递的精确对象,是投递到某一个Queue呢,还是投递到很多的Queue呢,还是删除?Exchange在定义的时候是有类型的,以决定到底哪些Queue符合条件,可以接收消息。我们可以理解它为"转发器"。

Exchange类型:

1、fanout:所有绑定到此Exchange的Queue都可以接收消息
2、direct:通过routing_key和Exchange决定的那个唯一的Queue可以接收信息
3、topic:所有符合routing_key(可以是表达式)的routing_key所绑定的Queue可以接收消息
4、headers:通过headers决定把消息发给哪些Queue

fanout就是纯广播,只要绑定到此Exchange的队列就能收到消息

技术分享图片

看一下是怎么实现的
1、生产者端
技术分享图片

代码中的channel.exchange_declare里面的参数没有写变量,比如exchange="logs",type="fanout",但是写上会报错,不知道什么原因。。。。
2、消费者端
技术分享图片

生产者发消息,多开几个消费者端,可以看到能同时接收到消息(消费者端执行格式:python publisher.py 你们好)。

注意:在测试的时候我先打开的生产者端,按常理讲我再开消费者端的时候是能够接收到消息的,但事实是没有消息。。。。原因很简单,我们想象一下收音机的功能,当你关闭收音机的时候是听不到广播的,只有当你打开收音机的时候才能听到,比如12点打开的收音机,你只能听到12点的广播,你是不能听到11点半的广播的,说简单点也就是实时的。 以上就是我们所说的消息的订阅与发布。

以上是关于Python-RabbitMQ fanout广播模式的主要内容,如果未能解决你的问题,请参考以下文章

Python-RabbitMQ消息队列的发布与订阅

RabbitMQ 学习---- Fanout 广播模型

RabbitMQ 学习---- Fanout 广播模型

RabbitMQ 学习---- Fanout 广播模型

2020-03-17 20:18:50springboot整合rabbitmq

广播模式下的生产者与消费者fanout模式