V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
v2li32
V2EX  ›  WebSocket

websocket 如何投递消息到 http

  •  
  •   v2li32 · 10 天前 · 590 次点击

    我在构思微服务下如何通过 websocket 作为交互。

    运行流程

    client => http => server => ws/tcp => server2 收到 => server2 通过 unixsocket 投递消息到 work 处理完成后 => 通过 ws 写消息回去 => server 的 ws 收到消息

    这个时候 如果正常处理 加工收到的消息, 写入消息到 client 的 fd,close 掉 client 连接 应该是可行的。

    平常业务代码

    client => server(伪代码)=> return

    <?php
    
    func add(){
    	$get= $_REQUEST_PARAMS;
    	return success("code=>200,data=$get,msg=''");
    }
    
    

    如果换成上面通过 websocket 交互

    都不需要返回了, server 收到 server2 结果后 fwrite($client_fd,$data); close($client_fd);

    <?php
    
    func add(){
    	$get= $_REQUEST_PARAMS;
        (new Ws)->send($get);
    }
    
    

    上面写好奇怪的样子。。 我想实现下面的写法有办法吗(代码直观看着舒服),比如

    <?php
    
    func add(){
    	$get= $_REQUEST_PARAMS;
        $res = (new Ws)->send($get);
    
        return success("code=>200,data=$res,msg=''");
    }
    

    如果想实现上面这样子,需要在加一个队列(起到 while true 阻塞效果?)。

    开辟 1 片内存 $arr[$client_fd] => $data; 数据回来后写入。然后 pop 消息。

    这样子就好像成 select 了。。 无时无刻在遍历,有数据在返回,性能问题很大。。

    然后好像为了解决问题又引入新的问题。

    大佬们给点思路呢

    7 条回复    2024-05-13 17:18:41 +08:00
    RedBeanIce
        1
    RedBeanIce  
       10 天前
    请直接说,你在做什么,想实现什么目标。
    sentinelK
        2
    sentinelK  
       10 天前
    需要楼主提炼一下问题。
    1 、问题只问核心就行了,不需要掺杂业务。
    2 、目前你遇到的问题是什么?
    3 、“写着舒服”是个什么概念?
    tool2dx
        3
    tool2dx  
       10 天前
    我猜测一下,OP server1 要返回客户端的 http 请求,但是内容是来自于 server2 。

    而 server2 -> server1 是用 websocket 协议通讯。

    所以 OP 说,server1 就需要傻等 server2 返回的结果,用 whire true 卡住 CPU ,死等??
    v2li32
        4
    v2li32  
    OP
       10 天前
    @tool2dx 是的。这个如何解决呢。while true 太不优雅了
    tool2dx
        5
    tool2dx  
       10 天前
    @v2li32 JS 都是异步回调,php 没用过不太清楚。
    v2li32
        6
    v2li32  
    OP
       10 天前
    @tool2dx js 的怎么个异步法呢,比如 node, server 回来的 ws 数据跟 客户的 client 他们没有桥梁。 所以才想到搞一个队列阻塞 被动查询是否有数据。
    julyclyde
        7
    julyclyde  
       10 天前
    按说 HTTP upgrade 之后就不能再 downgrade 了吧?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1256 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:13 · PVG 02:13 · LAX 11:13 · JFK 14:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.