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

2022-10-08 17:30:51 +08:00
 hhhhhh123

现在就是有个长轮询的场景, 反正结果是在 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 部署过的。有什么要注意的吗? 资料太少了

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

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

你的服务器带宽足够,然后 linux 也优化过,那么单机 socketio 2w+的链接不成问题(因为我目前做过的业务,最多就这么多)。如果这个数据还不满足,那么说明你们业务很大了,也很挣钱了,那就花钱请更专业更厉害的人帮你解决吧。
hhhhhh123
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
2022-10-09 13:57:48 +08:00
有日志是正常的,其余的我回答不了你,因为程序是你在写,云调试的前提是开源项目。

介于你表现的比较新手的感觉,我友善提醒一点。socketio 是一个库,用于实现双端通信,socketio 包含但不等于 websocket 。在 websocket 无法建立的时候,socketio 就会 http 轮询。
dongtingyue
2022-10-09 18:41:57 +08:00
@hhhhhh123 keepalive

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885328

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX