以PUSH / PULL模式丢失消息(Ratchet + PHP + ZeroMQ推送集成)

时间:2017-09-28 15:39:10

标签: php zeromq ratchet

我在我的网站上创建聊天,推送通知系统,用户活动小部件(即时更新)等。

我的网站建立在PHP之上,所以我决定使用Ratchet作为我的任务的websocket服务器。我已经安装了所有必需的组件,并且我在http://socketo.me/docs/push上学习了指南并开始编写代码。

这是在 ChatMsg( $item ){...} 文件中的 model.php 方法内。它创建了一个 PUSH 套接字访问点原型,并在数据库中插入新项后通过ZeroMQ向服务器发送带有JSON数据的消息:



$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($sData));




接下来是 push-server.php ,只创建一个 PULL 套接字访问点原型并等待新邮件,这些邮件将转移到推送脚本,向客户广播新通知,聊天消息和其他事件。



<?php 
require dirname(__DIR__) . '/vendor/autoload.php';

    $loop   = React\EventLoop\Factory::create();
    $pusher = new MyApp\Pusher;

    // Listen for the web server to make a ZeroMQ push after an ajax request
    $context = new React\ZMQ\Context($loop);
    $pull = $context->getSocket(ZMQ::SOCKET_PULL);
    $pull->setSockOpt(ZMQ::SOCKOPT_HWM, 0);
    $pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
    $pull->on('error', function ($e) {
        $f = fopen('push-server-error.log', "a");
        fwrite($f, $e->getMessage()."\n");
        fclose($f);
    });
    $pull->on('message', array($pusher, 'onNewEvent'));

    // Set up our WebSocket server for clients wanting real-time updates
    $webSock = new React\Socket\Server($loop);
    $webSock->listen(8081, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
    $webServer = new Ratchet\Server\IoServer(
        new Ratchet\Http\HttpServer(
            new Ratchet\WebSocket\WsServer(
                new Ratchet\Wamp\WampServer(
                    $pusher
                )
            )
        ),
        $webSock
    );

    $loop->run();
?>
&#13;
&#13;
&#13;

我使用监控工具Supervisor成功启动了 push-server.php ,我为WebSocket流量设置了NGINX代理,设置了客户端脚本(高速公路等)。

总的来说,我打算在生产中使用它。第一个小时我在我的网站上修改了新的聊天系统,我对它进行了测试,结果一切正常。

但是我稍后遇到了这个问题。通过ZeroMQ PUSH套接字发送后,一些ZeroMQ消息(只有部分,可能是5-10%)丢失。此时,自 push-server.php 进程启动以来发送大约300-400封邮件时会出现此问题。

我深信这个问题是在ZeroMQ内部(不是在JS客户端内部或者是带有业务逻辑的Pusher脚本),因为我试图修改&#34; ->on(){...} & #34; push-server.php 中的方法,以便在终端(控制台)上显示新消息,丢失的消息甚至不会显示在控制台上,即&#34; ->on(){...}&# 34;方法没有赶上它们。

ZeroMQ&#34; ->send() &#34;当消息成功发送或丢失时,方法总是返回一个空的ZeroMQ套接字对象。我只是通过在我的网站上发送聊天消息并获得回复(使用AJAX实现表单提交)来检查:

var_dump($socket->send(json_encode($sData)));

这可能是什么问题以及如何解决?

Server OS:      CentOS 6.9 (Final)
PHP version:           5.6.31
ZMQ extension version: 1.1.3
libzmq version:        4.2.2

1 个答案:

答案 0 :(得分:0)

我创建了 not persistent ZMQ::ContextZMQ::Socket,我的问题解决了:

$context = new ZMQContext(1, false);
$socket = $context->getSocket(ZMQ::SOCKET_PUSH);