之前的学习了把消息直接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没有传递第三个参数,因为这里的消息是要发送给每个队列?

第二步:保证每次连接rabbit 都会新产生一个全新的 消息为空的队列,我们可以通过服务器自动生成no-durable queue 同时名字是随机的类似:amq.gen-JzTY20BRgKO-HjmUJj0wLg.

    这样就能保证每次consumer断开和服务器的连接以后,队列自动释放掉,因为他是exclusive

    

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

    

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

    

consumer 代码:

public function worker()
{
set_time_limit(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();
}

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();
}

实验过程描述: .

1 ,task 方法去publish 一条消息“123”,

2,启动3个worker方法,这样系统自动生成3个不一样的随机名字的队列,然后去接受logs的exchange发送来的消息

这样就实现了 一个服务器发送消息给所有的consumer

注意: 如果worker没有先启动就发送了消息,在一对所有(publish/subscrible的模式下), 如果发消息后打开worker就无法收到消息


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

rabbitmq实现一台服务器同时给所有的consumer发送消息(tp框架)(第四篇)的更多相关文章

  1. rabbitmq实现一台服务器同时给指定部分的consumer发送消息(tp框架)(第六篇)

    previous article:  http://www.cnblogs.com/spicy/p/7989717.html 上一篇学习了,发送消息的时候用direct类型的exchange,绑定不同 ...

  2. 使用PowerShell收集多台服务器的性能计数器

    写在前面     当管理多台Windows Server服务器时(无论是DB.AD.WEB以及其他的应用服务器),当出现性能或其他问题后,参阅性能计数器都是一个非常好的维度从而推测出问题可能出现的原因 ...

  3. ElasticSearch 5学习(3)——单台服务器部署多个节点

    一般情况下单台服务器只会部署一个ElasticSearch node,但是在学习过程中,很多情况下会需要实现ElasticSearch的分布式效果,所以需要启动多个节点,但是学习开发环境(不想开多个虚 ...

  4. VMWare虚拟机实例拷贝到另一台服务器后出现Error in the RPC receive loop: RpcIn: Unable to send.错误的解决

    把一个VMWare虚拟机实例拷贝到另一台服务器后,在事件查看器中的应用程序日志中不断出现Error in the RPC receive loop: RpcIn: Unable to send.错误, ...

  5. 如何在一台服务器上安装两个mysql或者更多

    如何在一台服务器上安装两个mysql 1       前言 上篇写了在一台机器上源码编译安装一个mysql,那么如何在一台机器上源码编译安装两个mysql或者更多呢? 2       环境 mysql ...

  6. 记sql server 2008R2 两台服务器 使用非默认端口的发布订阅

    最近研究数据库的复制.因为要在两台服务器上,当使用数据库的默认1433端口时,订阅发布没有任何问题,考虑到数据库的安全性问题,需要改用其他端口.这里以10010为例. 有A.B两台服务器:A作为发布服 ...

  7. PHP文件上传至另一台服务器

    PHP程序上传文件时,想指定上传到另一台服务器. move_uploaded_file这个方法第二个参数指定的存放路径需要和php程序文件一个服务器,没办法指定其他服务器的地址,本人才疏学浅,哪位大哥 ...

  8. Centos 6.5 rsync+inotify 两台服务器文件实时同步

    rsync和inotify是什么我这里就不在介绍了,有专门的文章介绍这两个工具. 1.两台服务器IP地址分别为: 源服务器:192.168.1.2 目标服务器:192.168.1.3 @todo:从源 ...

  9. nodejs在同一台服务器上部署并同时运行两个或以上服务端时,一个服务用户登录后会挤掉另一个用户的问题

    问题描述:一台服务器,部署了两个或以上不同的Web服务,服务A的用户在登陆后,服务B的用户也登陆,此时服务A的用户在点击页面时,会返回登陆页面. 问题根源:浏览器保存的session相同,即cooki ...

随机推荐

  1. Mybatis实现原理探究-实现部分Mybatis功能(上)

    一.前言: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简 ...

  2. 《Forward团队-爬虫豆瓣top250项目-设计文档》

    成员:马壮,李志宇,刘子轩,年光宇,邢云淇,张良 设计方案: 1.能分析HTML语言: 2.提取重要数据,并保存为文本文档: 3.用PY代码调取文本文档的数据: 4.编写提取部分数据的python代码 ...

  3. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat, hprof使用详解

    JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat等小巧的工具,本博客希望能起抛砖引玉之用,让 ...

  4. Asp.net mvc验证用户登录之Forms实现

    这里我们采用asp.net mvc 自带的AuthorizeAttribute过滤器验证用户的身份,也可以使用自定义过滤器,步骤都是一样. 第一步:创建asp.net mvc项目, 在项目的App_S ...

  5. linux环境下(非UI操作)所有软件的安装与卸载总结

    UI界面的软件管理 linux下的软件一般都是经过压缩的,主要的格式有这几种:rpm.tar.tar.gz.tgz等.所以首先拿到软件后第一件事就是解压缩. 在xwindow下以rpm格式的软件安装比 ...

  6. hdu 2780 Su-Su-Sudoku(DFS数独)

    题目链接:hdu2780 #include<stdio.h> #include<string.h> #include<queue> #include<math ...

  7. 为MAC配置终端环境iTerm2+Zsh+oh-my-zsh

    首先展示下我的终端吧. 这就是我们为什么要配置iTerm2+Zsh+oh-my-zsh环境的原因: 我们使用zsh解释器,当然等你使用 zsh时就会知道zsh与bash对比的强大之处了. 至于我们的g ...

  8. matlab中使用正弦波合成方波(带动画)

    x=:*pi; :: s=; ::step s = s+/i*sin(i*x); end plot(s);set(figure(),'visible','off'); filename=[num2st ...

  9. SQL server经验分享:SQLSERVER 被标记为“可疑”的数据库处理方法

    --MyDB为修复的数据名USE MASTER GO SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE GO ALTER DATABAS ...

  10. WebAPI Token 验证

    WebAPI Token 验证 登录端 //HttpContext.Current.Session.Timeout = 10; ////生成Ticket //FormsAuthenticationTi ...