This topic created in 2363 days ago, the information mentioned may be changed or developed.
开发过程中使用了 websocket 协议,假如有大量链接(合理的,非可以攻击的),如何保证这些链接时刻通畅呢(客户端不故意断开),如何管理这些链接,保证时刻有效。我有看到网上一些管理 tcp 链接的,基本上都是开子线程管理用户链接,但是我觉的这个基本没什么实践意义,而且都是大家抄来抄去,向请问一下你们的想法和思路
条件
- 机器性能相同进程线程内存什么的都是固定不变的( 我们忽略服务器配置 )
- 用户请求是合理的,不存在什么非法请求
- 保证尽可能多的用户 tcp/websocket 请求能正常链接上服务器( 通常说的高并发 )
- 保证服务器能及时(1s 内吧 )响应在线的任意一个用户
- 不讨论用户忘记关闭链接的情况
- 请说明一下原理和思路方便大家一起讨论(无需代码,伪代码即可)
 | | 3 fancy111 Nov 22, 2019 swoole 和 nodejs 就很好的解决了这个问题,当然是用多进程或协程处理多个连接,毕竟用户不是每时每刻都发送数据。 |
 | | 4 xiaotianhu Nov 22, 2019 每个开发语言都有对应的框架解决问题啊。 一般都是基于 libevent 事件+异步 就搞定了。 |
 | | 5 bobuick Nov 22, 2019 这要求不高. 现在随便拉出来各类语言实现的一些网络库都能达到了. 你也可以自己用 c,或者 cpp 撸一个简单的, 不复杂. 这方面很多开源的最基础的实现, 拿过来自己看看. 下层用 epoll, 我估计单个线程 accept, 然后放线程池里挂载 epoll 进行 epol_ctl 都能达到你要的性能.
已经封装号的多如牛毛, go 的随便 C100k, java 的 netty 也随便能到. 前提是你只是个网络层, 如果把其他逻辑加就另外一回事了 |
 | | 7 sagaxu Nov 22, 2019 via Android 10 年前,处理 C10K 还要点编程技巧。现在嘛,傻乎乎的开 10K 个 Java 线程也就多用个 2.5G 内存。协程或者 async/await 方案已经烂大街,C10K 也早换成 C10M 了。 |
 | | 8 ipwx Nov 22, 2019 via Android asio, epoll, kqueue。或者基于这些的库。基本思想是非阻塞,在一个线程里面和尽可能多的客户端通讯。计算交给线程池。 |
 | | 9 opengps Nov 22, 2019 via Android 现在做 socket 开发的资料比以前多多了,这些公开资料已经解决了楼主考虑的问题。 关于链接的保活,依赖的是客户端心跳包协议和服务端 keepalive |