network-programming - 将邮件卡在ZeroMQ中

标签 network-programming message-queue zeromq

我在ZeroMQ上遇到了一个奇怪的问题,其中一些消息被卡住,而新消息到达时才被卡住。就像新邮件将卡住的邮件推送到门上一样(我知道这很糟糕)。

我的代码很简单:

rep.php

$context = new ZMQContext;
$receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$receiver->connect("tcp://localhost:8022");
$receiver2 = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$receiver2->connect("tcp://localhost:8024");

for (;;) {
    echo $receiver->recv() . PHP_EOL;
    echo $receiver2->recv() . PHP_EOL;
}

cnt.php和cnt2.php(相同的代码,不同的端口)
$context = new ZMQContext;
$work = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$work->bind('tcp://*:8022');
$work->send('Hello World');

cnt.php发送到8022,cnt2.php发送到8024。它们不时执行,并将消息发送到rep.php。但是,某些消息被卡住了。如果我从cnt.php发送了4条消息,则什么也没收到,但是当我从cnt2.php发送1条消息时,我立即收到5条消息。有任何想法吗?

最佳答案

我不是PHP专家,但猜测语法和功能。如果我错了请指正我

echo $receiver->recv() . ' - ' . $receiver2->recv();

recv()应该是一个阻塞调用。
  • $receiver->recv()阻止,直到接收到某些消息为止。
  • 但是echo不会立即回显消息
  • 您再次被阻止在$receiver2->recv()
  • 只有当您从其他文件发送消息时,echo才起作用,因为它正在等待$receiver2->recv()

  • 由于要独立处理套接字recv(),因此应使用轮询或基于事件的异步I / O。

    [尝试的解决方案]
    $poll = new ZMQPoll();
    $poll->add($receiver, ZMQ::POLL_IN);
    $poll->add($receiver2, ZMQ::POLL_IN);
    $readable = $writeable = array();
    while(true) {
         $events = $poll->poll($readable, $writeable);
         foreach($readable as $socket) {
                   $message = $socket->recv();
                   echo $message, PHP_EOL;
         }
    }
    

    改编自:http://zguide.zeromq.org/php:rrbroker

    关于network-programming - 将邮件卡在ZeroMQ中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164474/

    相关文章:

    sockets - socket编程和Http编程的区别

    javascript - 如何向用户显示 ERR_NAME_NOT_RESOLVED 错误

    java - 如何在 RBDMS 或 NOSQL 数据存储或其他消息系统(例如 rabbitmq)之上实现类似分布式队列的东西?

    java - android中MessageQueue中的内存泄漏?

    java - Windows 7 上 0MQ/ZeroMQ 和 Java 的明确万无一失的步骤?

    Android NetworkInfo.getTypeName() 返回值

    c# - 将有毒消息移至处理队列

    linux - 1 个线程与 5 个线程用于分布式系统通信?

    c - C 语言的 ZeroMQ 示例无法编译;官方文档可能有错吗?

    network-programming - 检查 WebRTC 连接 - 可靠的方法