`

关于消息队列——ZeroMQ的router/dealer

 
阅读更多

为了不将服务端直接暴露给“客户端”,增加可扩展性,我们可以制作个中间层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中deale-route模式jave实现

    zeromq是一个强大的开源消息库,它提供了多种通信模式,如请求-响应(req-rep)、发布-订阅(pub-sub)、推拉(push-pull)以及我们这里关注的经销商-路由器(dealer-router)模式。在Java中使用zeromq,通常我们会...

    消息队列zeromq的c语言安装包czmq-4.2.1版本

    zeromq(ZeroMQ)是一个开源的消息中间件,它提供了高级消息队列的功能,可以实现进程间通信(IPC)和网络间通信(IPC),支持多种协议,如TCP、UDP、PGM以及PUB/SUB、REQ/REP、DEALER/ROUTER等多种消息模式。zeromq...

    zeromq中负载均衡模式的jave实现

    首先,"Dealer-Router"模式是zeromq提供的一个高级消息模式,适用于客户端-服务器架构,尤其适合实现负载均衡。Dealer作为客户端角色,它可以向多个Router发送消息,而Router则扮演服务端角色,它能接收来自多个...

    消息队列zeromq4.1.8版本安装包

    zeromq库是一个高效的消息队列系统,常用于构建分布式应用程序。它的设计目标是提供一个简单易用、高性能且可移植的接口,使得开发者能够轻松地实现进程间通信(IPC)和网络通信。zeromq提供了多种编程语言的API,...

    zeromq消息队列

    - **经销商/路由器(Dealer/Router)**:更灵活的请求/应答模型,支持多对多通信。 ZeroMQ的特性包括: 1. **轻量级**:ZeroMQ不需要中间服务器,而是直接在进程间通信,减少了系统的复杂性和开销。 2. **高并发*...

    消息队列模型

    2. **ZeroMQ(又称ØMQ)**: 这是一个轻量级的消息传递库,提供了多种消息模式,如PUB/SUB(发布/订阅)、REQ/REP(请求/响应)、DEALER/ROUTER(经销商/路由器)等。ZeroMQ可以在不同的语言中使用,并且可以跨网络...

    zeromq_java.rar_java zeromq_libzmq.lib _zeromq_zeromq java

    2. **Pattern(模式)**:ZeroMQ支持多种通信模式,如PUB/SUB(发布/订阅)、REQ/REP(请求/响应)、PUSH/PULL(推送/拉取)、DEALER/ROUTER(经销商/路由器)等,每种模式适用于不同的应用场景。 3. **Context(上...

    ZeroMq封装源码

    在本文中,我们将深入探讨ZeroMQ的封装源码,特别是关于客户端多线程、服务器多线程以及`router-dealer`模式的实现。 一、ZeroMQ概述 ZeroMQ提供了一种轻量级的、高性能的、模式化的通信机制,它可以在进程间、网络...

    zeromq简易demo搭建(java版本)

    ZeroMQ支持多种模式,包括PUB/SUB(发布/订阅)、REQ/REP(请求/响应)、DEALER/ROUTER(经销商/路由器)等。在上述示例中,我们使用了PUB/SUB模式,适合一对多的广播场景。在其他模式中,例如REQ/REP,客户端发送一...

    ZeroMQ 云时代极速消息通信库 PDF电子书下载

    ZeroMQ提供了多种套接字类型,如REQ/REP、DEALER/ROUTER、PUB/SUB、XREQ/XREP等,以适应不同的消息模式。REQ/REP套接字提供请求响应模式,常用于远程过程调用;PUB/SUB套接字用于发布订阅模式,适用于广播消息;...

    zeromq 源码 4.3.5

    - **dealer/router**:更灵活的请求/响应模型,允许多个请求和响应同时处理。 3. **高可用性与负载均衡** ZeroMQ的`DEALER`和`ROUTER`角色可以实现负载均衡和容错。`DEALER`可以将请求均匀分布到多个`ROUTER`,而...

    c# ZeroMQ 代码

    **零MQ(ZeroMQ)**是一种高性能、轻量级的消息队列系统,它在C#中的应用为开发者提供了高效的数据通信能力。ZeroMQ并非传统的中间件,而是一种库,可以直接集成到应用程序中,用于实现进程间通信(IPC)、网络通信...

    zeromq-2.2.0.zip_zeromq_中间件

    zeromq的工作模式主要包括四种模式:发布/订阅(Publish/Subscribe)、请求/响应(Request/Reply)、推拉(Push/Pull)和路由(Router/Dealer)。这些模式涵盖了大多数常见的通信场景,例如服务器端处理客户端请求、...

    zeroMQ初体验

    - **DEALER/ROUTER(经销商/路由器)**:更灵活的请求-响应模型,允许多个请求并发处理,以及异步响应。 - **PUSH/PULL(推/拉)**:用于线程间或进程间的单向数据流,拉模式的一端可以决定何时接收数据。 - **...

    用java调用zeromq

    ZeroMQ的核心概念有三类角色:`Publisher`(发布者)、`Subscriber`(订阅者)用于发布-订阅模式,`Dealer`(交易员)和`Router`(路由器)用于请求-响应模式,以及`Pusher`(推送者)和`Puller`(拉取者)用于工作...

    zeromq中多线程的jave实现

    zeromq是一个强大的开源消息库,它提供了多种高级通信模式,包括发布/订阅、请求/应答、推送/拉取以及本文重点讨论的Dealer-Router模式。在Java中,我们通常使用jeromq这个库来操作zeromq,因为它是对zeromq原生API...

    ZeroMQ官方文档中文版.pdf

    ZMQ提供了多种类型的套接字,如REQ/REP、DEALER/ROUTER等,以适应不同的通信需求。 使用套接字构建拓扑结构:在ZMQ中,可以通过套接字之间的连接方式构建出不同的通信拓扑结构,如点对点、发布-订阅、请求-应答等。...

    zeromq-4.2.0.tar.zip

    它支持多种通信模式,如PUB/SUB(发布/订阅)、REQ/REP(请求/响应)、DEALER/ROUTER(交易员/路由器)和PAIR(对等)等,以适应不同场景的需求。此外,ZeroMQ还支持高级特性,如身份认证、加密通信以及消息分片和...

    zeromq-3.2.5.zip

    zeromq是一个高效的消息队列库,其设计目标是提供一个简单、易用但功能强大的方式来进行进程间通信(IPC)以及网络通信。zeromq的3.2.5版本是一个较旧但仍然广泛使用的稳定版本,它包含了C++源码和其他语言(包括C#...

    zeromq-4.2.3.tar.gz

    在ZeroMQ中,套接字不仅仅是传统网络编程中的概念,它们提供了多种模式,如PUB(发布者)、SUB(订阅者)、REQ(请求者)、REP(响应者)、DEALER(经销商)和ROUTER(路由器),这些模式覆盖了常见的消息传递场景。...

Global site tag (gtag.js) - Google Analytics