关于workerman做客户端进行中转求解

special_mkbk

问题描述

需要用ws链接其他服务器的,然后收到数据后转发给自己的客户端
现在用的是AsyncTcpConnection

看文档AsyncTcpConnection 定义在onWorkerStart中但是worker有多个进程会导致启动多个

想的有几个方案哪个方案比较好呢,或者有没有更好的方案推荐

// 方案1:
//  一个channel
//  workerA 去链接外部服务器  收到消息使用channel发给客户端  并监听workerB客户端的消息
//  workerB 在onWorkerStart中 监听channel的消息  发给客户端 并监听客户端消息发给workerA

$channel_server = new Channel\Server();

// workerA负责接收其他服务器信息并发布给B
$workerA = new Worker();
$workerA->onWorkerStart = function($worker){

    Channel\Client::connect('127.0.0.1', 2206);

    $otherServer = new AsyncTcpConnection("ws://0.0.0.0:8765");
    $otherServer->onMessage = function($con, $data){
        Channel\Client::publish('newData','新数据');
    };
    $otherServer->connect();

    //监听客户端要给other发消息
    Channel\Client::on('clientData', function($event_data)use($otherServer){
        $otherServer->send($event_data);
    });
};

//workerB负责接收信息并发布给客户端
$workerB = new Worker("websocket://0.0.0.0:1002");
$workerB->count = 4;
$workerB->onWorkerStart = function($worker){

    Channel\Client::connect('127.0.0.1', 2206);
    Channel\Client::on('newData', function($event_data)use($worker){
        // 向所有客户端广播消息
        foreach($worker->connections as $connection)
        {
            $connection->send($event_data);
        }
    });
};
$workerB->onMessage = function($con,$data){
    Channel\Client::publish('clientData','客户端给other发消息');
};

Worker::runAll();

另外使用全局变量是否可行呢

$otherServer;
$workerA = new Worker();
$workerB = new Worker("websocket://0.0.0.0:1002");
$workerB->count = 4;

$workerA->onWorkerStart = function($worker){
    global $otherServer;
    $otherServer = new AsyncTcpConnection("ws://0.0.0.0:8765");
    $otherServer->onMessage = function($con, $data){
        global $workerB;
        foreach($workerB->connections as $connection)
        {
            $connection->send($data);
        }
    };
    $otherServer->connect();
};

$workerB->onMessage = function($con,$data){
    global $otherServer;
    $otherServer->send($data);
};

Worker::runAll();
389 1 0
1个回答

muyu
  • special_mkbk 2024-08-14

    感觉这个方式比较乱

  • muyu 2024-08-14

    那你就用类似redis的订阅的方式

  • latin 2024-08-14

    就一个if判断怎么会比较乱

  • special_mkbk 2024-08-14

    和channel 一样吧

  • special_mkbk 2024-08-14

    因为想要一个进程只负责访问远程服务器这块 如果用进程编号的话 他不仅操作了远程服务器还进行了其他业务逻辑的处理 如果再用上路由 那就又麻烦了

  • muyu 2024-08-14

    gatewayworker配合redis之类的订阅也能实现

  • special_mkbk 2024-08-14

    用多个worker么,一个推送 一个订阅?那客户端发给other呢也用订阅么,收到客户端消息 推送,other监听

  • 故人重来 2024-08-14

    我觉得用专业的消息中间件,一个ws只管接收然后发布到MQ里面。另外启动一个程序专门来消费MQ消息。

  • special_mkbk 2024-08-14

    那就不是服务器主动推送了

  • 故人重来 2024-08-15

    ???你这样可以解耦啊。ws拉别人服务器专门一台,自己推送一台

×
🔝