为了账号安全,请及时绑定邮箱和手机立即绑定

Python-RabbitMQ fanout广播模式

标签:
Python

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

我们编辑两个消费者端来测试receive.py和receive2.py
https://img1.sycdn.imooc.com//5b2390e700017f6b08650480.jpg

https://img1.sycdn.imooc.com//5b2390f70001617608590481.jpg编辑完成后,开启两个消费者端,用生产者连续发消息测试,可以看到在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的队列就能收到消息

https://img1.sycdn.imooc.com//5b2390ff0001fe4304200160.jpg

看一下是怎么实现的
1、生产者端
https://img1.sycdn.imooc.com//5b2391100001cbcd08550428.jpg

代码中的channel.exchange_declare里面的参数没有写变量,比如exchange="logs",type="fanout",但是写上会报错,不知道什么原因。。。。
2、消费者端
https://img1.sycdn.imooc.com//5b23911900019cb508490262.jpg

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

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消