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

[经验分享] rabbitmq实现一台服务器同时给所有的consumer发送消息(tp框架)(第四篇)

[复制链接]

尚未签到

发表于 2017-12-9 06:25:13 | 显示全部楼层 |阅读模式
DSC0000.png

  之前的学习了把消息直接publish到queue里面,然后consume掉,
  真实的情况,我们会把消息先发送到exchange里面,由它来处理,是发给某一个队列,还是发给某些队列,还是丢弃掉?
  exchange类型: direct,topic,headers,fanout
  下面以fanout为例子(把收到的消息,全部发给所有的队列)
  如何查看服务器上面的所有的exchanges?
  sudo rabbitmqctl list_exchanges
  如何查看服务器上面的所有的binding关系?
  sudo rabbitmqctl list_bindings
  前面几章消息发送是把$msg消息通过默认(如果第二个参数为‘ ’)的exchange发送给hello队列

$channel->basic_publish($msg, '', 'hello');
  为了实现一对所有发送同一个消息
  第一步:修改发送消息部分,这里basic-publish没有传递第三个参数,因为这里的消息是要发送给每个队列?
DSC0001.png

  第二步:保证每次连接rabbit 都会新产生一个全新的 消息为空的队列,我们可以通过服务器自动生成no-durable queue 同时名字是随机的类似:amq.gen-JzTY20BRgKO-HjmUJj0wLg.
      这样就能保证每次consumer断开和服务器的连接以后,队列自动释放掉,因为他是exclusive
DSC0002.png

  第三步:上面创建了一个fanout类型的exchange  和  一个任意名字的队列queue, exchange和queue之间的关系叫做binding(绑定?)
DSC0003.png

  经过上面这步: logs这个exchange就会把消息绑定到$queue_name这个队列,(但是$queue_name是随机生成的名字)
DSC0004.png

  consumer 代码:




DSC0005.gif DSC0006.gif


public function worker()
{
(0);
$connection = new AMQPStreamConnection('localhost', 5672, 'bitch', 'bitch');
$channel = $connection->channel();
#申明一个exchange名字叫logs,类型是fanout
$channel->exchange_declare('logs','fanout',false,false,false);
#申明一个由服务器自动命名的队列,这个队列会在连接结束以后 自动断掉
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
#把随机命名的队列绑定到绗棉新建的exchange
$channel->queue_bind($queue_name, 'logs');
#下面第四个参数如果为false表示开启确认模式,也就是消费以后会告知rabbitmq服务器该条消息已经处理完毕,这样可以方式消息处理一半挂掉了,结果服务器也删除了这条未处理完毕的消息
$receiver = new self();
$channel->basic_consume($queue_name, '', false, true, false, false, [$receiver, 'callFunc']);
while(true) {
$channel->wait();
}
$channel->close();
$connection->close();
}
View Code  publisher代码:





public function task()
{
$connection = new AMQPStreamConnection('localhost', 5672, 'bitch', 'bitch');
$channel = $connection->channel();
#申明一个exchange名字叫logs,类型是fanout
$channel->exchange_declare('logs','fanout',false,false,false);
$msg = new AMQPMessage('123');
#第二个参数是表示走什么exchange  第三个参数表示走什么队列
$channel->basic_publish($msg, 'logs');
echo "第".'1'.'发送完毕';
$channel->close();
$connection->close();
}
View Code  实验过程描述: .
  1 ,task 方法去publish 一条消息“123”,
  2,启动3个worker方法,这样系统自动生成3个不一样的随机名字的队列,然后去接受logs的exchange发送来的消息
DSC0007.png

  这样就实现了 一个服务器发送消息给所有的consumer
  注意: 如果worker没有先启动就发送了消息,在一对所有(publish/subscrible的模式下), 如果发消息后打开worker就无法收到消息


  ---恢复内容结束---

运维网声明 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-422305-1-1.html 上篇帖子: Bubble Sort 下篇帖子: RabbitMQ学习之spring配置文件rabbit标签的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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