为了不将服务端直接暴露给“客户端”,增加可扩展性,我们可以制作个中间层broker(参照官方示例代码)
比如request-reply这种最简单的模型,我们可以通过一个中间组件将后面的服务透明化,增强系统的可扩展性,后台只需要增加service数目就可以增强服务能力
架构模型如下:
1,服务端worker.php
(不用bind端口,只需要"监听"中间件broker的套接口即可)
<?php
/*
* Hello World server
* Connects REP socket to tcp://*:5560
* Expects "Hello" from client, replies with "World"
* @author Ian Barber <ian(dot)barber(at)gmail(dot)com>
*/
$context = new ZMQContext();
// Socket to talk to clients
$responder = new ZMQSocket($context, ZMQ::SOCKET_REP);
$responder->connect("tcp://localhost:5560");
while (true) {
// Wait for next request from client
$string = $responder->recv();
printf ("Received request: [%s]%s", $string, PHP_EOL);
// Do some 'work'
sleep(1);
// Send reply back to client
$responder->send("World");
}
?>
2,客户端client.php
<?php
/*
* Hello World client
* Connects REQ socket to tcp://localhost:5559
* Sends "Hello" to server, expects "World" back
* @author Ian Barber <ian(dot)barber(at)gmail(dot)com>
*/
$context = new ZMQContext();
// Socket to talk to server
$requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);
$requester->connect("tcp://localhost:5559");
for ($request_nbr = 0; $request_nbr < 10; $request_nbr++) {
$requester->send("Hello");
$string = $requester->recv();
printf ("Received reply %d [%s]%s", $request_nbr, $string, PHP_EOL);
}
?>
3,中间件broker.php
不处理任务,只是转发消息,通过poll实现异步IO(连接客户端client的不能再是REP而应该是ROUTER,同理连接服务端worker的不能是REQ而应该是DEALER)
<?php
/*
* Simple request-reply broker
* @author Ian Barber <ian(dot)barber(at)gmail(dot)com>
*/
// Prepare our context and sockets
$context = new ZMQContext();
$frontend = new ZMQSocket($context, ZMQ::SOCKET_ROUTER);
$backend = new ZMQSocket($context, ZMQ::SOCKET_DEALER);
$frontend->bind("tcp://*:5559");
$backend->bind("tcp://*:5560");
// Initialize poll set
$poll = new ZMQPoll();
$poll->add($frontend, ZMQ::POLL_IN);
$poll->add($backend, ZMQ::POLL_IN);
$readable = $writeable = array();
// Switch messages between sockets
while (true) {
$events = $poll->poll($readable, $writeable);
foreach ($readable as $socket) {
if ($socket === $frontend) {
// Process all parts of the message
while (true) {
$message = $socket->recv();
// Multipart detection
$more = $socket->getSockOpt(ZMQ::SOCKOPT_RCVMORE);
$backend->send($message, $more ? ZMQ::MODE_SNDMORE : null);
if (!$more) {
break; // Last message part
}
}
} elseif ($socket === $backend) {
$message = $socket->recv();
// Multipart detection
$more = $socket->getSockOpt(ZMQ::SOCKOPT_RCVMORE);
$frontend->send($message, $more ? ZMQ::MODE_SNDMORE : null);
if (!$more) {
break; // Last message part
}
}
}
}
?>
运行broker.php以及多个worker.php,然后运行client.php(也可以是多个),可以看到10个任务被分担给多个worker.php运行了。
这样就很简单的实现一个n:m的通信了
根据这个模型我们还可以定制一个支持负载均衡的broker,详细代码可以参照
https://github.com/imatix/zguide/blob/master/examples/PHP/lbbroker.php
- 大小: 10.8 KB
分享到:
相关推荐
消息队列zeromq的go语言测试实例包,为学习安装部署zeromq的同学提供,注意该安装包中的测试实例为go语言版本,要根据各位安装的zeromq版本下载。
zeromq的dealer-router模式的jave实现,Eclipse下的maven工程,相关引用已在pom文件引入,可以直接运行。含有三个客户端、三个服务器端,代理实现了两种方式。
ZeroMQ提供的ROUTER / DEALER组合模式,可以轻松地构建一个高级异步的C / C ++后台服务框架。ROUTER可以高效的接收客户端的请求,而DEALER可以负载均衡的调度工人工作。多,逐步工人处理不过来,需要增加工人的时候...
消息队列zeromq学习的安装包之一libsodium,为学习zeromq安装部署的同学们提供帮助,zeromq是消息队列中的一种技术,安装过程中要注意版本对应。
消息队列zeromq的c语言安装包czmq-4.2.1版本,为学习安装部署zeromq的同学提供c语言版本的安装包,要注意跟zeromq的版本对应,否则后期会报错。
消息队列zeromq4.1.8版本安装包,为学习安装zeromq的但不能上github.com同学提供,该安装包为github版,结合各位安装的语言版本要与其他安装包对应。
该文件包含三部分文件: 一个是zmq2.2的lib包下的libzmq.dll,libzmq.lib 一个是jzmq的lib包下jzmq.dll、zmq.jar包, 一个是jzmq的src包下的java源码,在...使用这些文件,可以在window下进行zeroMQ的java语言的开发。
zeromq消息队列
zeroMQ/jzmq java例子,包含基本的req/rep,pub/sub,push/pull以及代理和多数据来源的demo,适合入门了解。
zeromq是一个基于内存的消息队列,支持windows,linux和各种平台,支持python,java,php,.net等各种语言。
zeroMQ 推/拉演示 介绍 我正在第 4 章 最后一个项目是一个使用PUSH / PULL套接字 ( 0MQ ) 和 Node.js 集群技术的程序。 任务 启动一个由 3 个工人组成的池并在他们之间分配 30 个工作(整个程序可能不到 100 行代码...
zeromq的dealer-router模式的jave实现,Eclipse下的maven工程,相关引用已在pom文件引入,可以直接运行。
ZeroMQ(简称ZMQ)是一个基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。
ZeroMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架...下载地址:https://github.com/zeromq/jzmq(右下角zip) 为了方便使用ZMQ,在这里提供了编译好的zeroMq和jzmq库,并附带了编译方法和常见问题解决办法!
zeroMq 开发指南 消息通信库zeroMq 开发指南 消息通信库zeroMq 开发指南 消息通信库zeroMq 开发指南 消息通信库
gcc terminal.c -o a.out -I /root/zeromq/include -L /root/zeromq/lib -lzmq -DZMQ_BUILD_DRAFT_API 或arm-linux-gnueabihf-gcc terminal.c -I /root/zeromq-arm/include -L /root/zeromq-arm/lib -lzmq -lstdc++
zeromq 云时代极速消息通信库, zeromq详细教程,学习高性能网络编程的好资料
ZeroMQ云时代极速消息通信库PDF版本,带书签,完整目录,高清版。
ZeroMQ的用户手册,适合C++、Java、Go、Python等通过MQ订阅消息的形式进行通信,低延迟,支持多语言SDK;手册内包含了ZeroMQ的基础入门知识,适合新手学习;介绍了ZeroMQ的集中模式包括高级请求-应答模式; 手册目录...
zeromq 编译很麻烦,特别是java开发人员通常没有装vs2008,及g++等工具,所以我编译了上传上来,像普能jar一样使用,不需要再拷贝 dll so等。 修改了org.zeromq.ZMQ,自动copy动态库到java.library.path的一个目录。...