设为首页 收藏本站
查看: 1309|回复: 0

[经验分享] Python-RabbitMQ fanout广播模式

[复制链接]

尚未签到

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

  我们编辑两个消费者端来测试receive.py和receive2.py
DSC0000.jpg

DSC0001.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的队列就能收到消息  

DSC0002.jpg

  看一下是怎么实现的
  1、生产者端
DSC0003.jpg

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

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548626-1-1.html 上篇帖子: Python-RabbitMQ消息分发机制 下篇帖子: python脚本之ftp上传日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表