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

[ Python ] 关于轮询的问题 http 还是 socketIO

  •  
  •   hhhhhh123 · 2022-10-08 17:30:51 +08:00 · 1727 次点击
    这是一个创建于 776 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在就是有个长轮询的场景, 反正结果是在 redis 中, 现在就是考虑更好的进行交互。

    1. http 长轮询, 不过缺点挺明显的。1.不及时(假设 1s),2.服务器压力大
    2. socketIo 为什么用 socketIo 因为 socket 一对多要开很多线程,socketIo 支持异步, 原理没有深究 都是第一次用。

    后端架构 flask + gunicorn (后期在加 nginx 均衡 多台服务器) gunicorn 采用多进程+ 多线程 配置

    1. 如果是用 http 轮询的话,除了压力比 socketIO 大,感觉问题不大。(采用这个方案更简单实现)
    2. 如果用 socketIO ,那问题就多了, 官网显示 gunicorn + socketIO 只能采用单进程。而且如果要 nginx 动态均衡的话会出现 粘性会话 问题。

    下面是官网原话

    带有 Gunicorn 的 Eventlet 
    如上所述运行 eventlet WSGI 服务器的替代方法是使用 gunicorn ,这是一个功能齐全的纯 Python Web 服务器。gunicorn 下启动应用程序的命令如下所示:
    
    $ gunicorn -k eventlet -w 1 module:app
    由于其负载均衡算法的限制,gunicorn 只能与一个工作进程一起使用,因此该-w 选项不能设置为大于 1 的值。单个 eventlet 工作人员可以处理大量并发客户端,每个客户端由一个 greenlet 处理.
    
    

    采用 socketIO + nginx 动态均衡(假设端口 5000 ,5001) ,会出现 连接 5000 后,如何保证后续所有的 socketIo 请求 全部指向 5000 而不是 5001 ,反之一样。

    唉 如果采用 socketIO + Gunicorn 那么 Gunicorn 只能开一个进程。 如果采用 http + Gunicorn 可多进程多线程 但消息不及时。服务器压力大。感觉也不是很好。毕竟都 2022 了。

    个人还是倾向 socketIO , 很纠结啊 有没有经验的兄弟 socketIO + Gunicorn 部署过的。有什么要注意的吗? 资料太少了

    12 条回复    2022-10-09 18:41:57 +08:00
    superrichman
        1
    superrichman  
       2022-10-08 18:28:17 +08:00 via Android
    nginx 用 iphash
    hhhhhh123
        2
    hhhhhh123  
    OP
       2022-10-08 18:30:51 +08:00
    @superrichman ok , wo 看看
    dongtingyue
        3
    dongtingyue  
       2022-10-08 19:23:20 +08:00
    http 不会比 socket 压力大,socket 反而要一直保持连接。
    ixuuux
        4
    ixuuux  
       2022-10-08 23:12:14 +08:00 via iPhone
    客户端 http 轮询,每次请求过来,服务端阻塞住,比如阻塞个一分钟两分钟的,在阻塞的这段时间内,服务端一直查询相应的数据,查询到了或者规定的阻塞时间到了,返回响应,客户端相应的延长超时等待。

    我之前这么干过,场景是客户端取任务,服务端需要从 redis 队列中取任务,服务端的阻塞其实就是从 redis 队列中阻塞取数据,运行良好没啥问题,仅供参考。
    hhhhhh123
        5
    hhhhhh123  
    OP
       2022-10-09 08:55:27 +08:00
    @dongtingyue http 每次都要建立连接的
    hhhhhh123
        6
    hhhhhh123  
    OP
       2022-10-09 08:56:28 +08:00
    @dongtingyue 每次建立连接释放 三次握手四次挥手
    Soaringflight
        7
    Soaringflight  
       2022-10-09 09:25:42 +08:00 via iPhone
    可以用 tornado 的 websocket ,我们用这个做过实时聊天。
    fcfangcc
        8
    fcfangcc  
       2022-10-09 09:36:41 +08:00
    关键字:长轮询
    lscexpress
        9
    lscexpress  
       2022-10-09 10:16:27 +08:00
    web 页面支付回调?那么就用轮询。
    web 页面聊天?那肯定 socketio 。

    你的服务器带宽足够,然后 linux 也优化过,那么单机 socketio 2w+的链接不成问题(因为我目前做过的业务,最多就这么多)。如果这个数据还不满足,那么说明你们业务很大了,也很挣钱了,那就花钱请更专业更厉害的人帮你解决吧。
    hhhhhh123
        10
    hhhhhh123  
    OP
       2022-10-09 11:10:12 +08:00
    @lscexpress RGBbCB_sMygtvVE9AAAA: Sending packet PING data None
    gmEyC5Sj3nARgQ3aAAAB: Sending packet PING data None
    l3DRs5EnjDWGkUS1AAAC: Sending packet PING data None
    gmEyC5Sj3nARgQ3aAAAB: Received packet PONG data
    这种日志有很多 这是啥原因呀? 有没有发消息 只是建立了连接
    lscexpress
        11
    lscexpress  
       2022-10-09 13:57:48 +08:00
    有日志是正常的,其余的我回答不了你,因为程序是你在写,云调试的前提是开源项目。

    介于你表现的比较新手的感觉,我友善提醒一点。socketio 是一个库,用于实现双端通信,socketio 包含但不等于 websocket 。在 websocket 无法建立的时候,socketio 就会 http 轮询。
    dongtingyue
        12
    dongtingyue  
       2022-10-09 18:41:57 +08:00
    @hhhhhh123 keepalive
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2858 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:56 · PVG 11:56 · LAX 19:56 · JFK 22:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.