大佬们,开发环境中如果使用 websocket/tcp 协议,假如有一万个链接,如何保证这些链接保持畅通呢(高并发)?

2019-11-22 10:47:50 +08:00
 Acoolda

开发过程中使用了 websocket 协议,假如有大量链接(合理的,非可以攻击的),如何保证这些链接时刻通畅呢(客户端不故意断开),如何管理这些链接,保证时刻有效。我有看到网上一些管理 tcp 链接的,基本上都是开子线程管理用户链接,但是我觉的这个基本没什么实践意义,而且都是大家抄来抄去,向请问一下你们的想法和思路


条件

2270 次点击
所在节点    程序员
10 条回复
kiracyan
2019-11-22 10:53:58 +08:00
C10K ?
Acoolda
2019-11-22 11:10:27 +08:00
@kiracyan 我孤陋寡闻了,百度了一下才知道啥意思,差不多就是这个问题了,我想知道大佬们实践方案
fancy111
2019-11-22 11:16:51 +08:00
swoole 和 nodejs 就很好的解决了这个问题,当然是用多进程或协程处理多个连接,毕竟用户不是每时每刻都发送数据。
xiaotianhu
2019-11-22 11:25:47 +08:00
每个开发语言都有对应的框架解决问题啊。
一般都是基于 libevent 事件+异步 就搞定了。
bobuick
2019-11-22 12:41:36 +08:00
这要求不高. 现在随便拉出来各类语言实现的一些网络库都能达到了. 你也可以自己用 c,或者 cpp 撸一个简单的, 不复杂. 这方面很多开源的最基础的实现, 拿过来自己看看.
下层用 epoll, 我估计单个线程 accept, 然后放线程池里挂载 epoll 进行 epol_ctl 都能达到你要的性能.

已经封装号的多如牛毛, go 的随便 C100k, java 的 netty 也随便能到. 前提是你只是个网络层, 如果把其他逻辑加就另外一回事了
0ZXYDDu796nVCFxq
2019-11-22 12:52:39 +08:00
C10K 十年前就解决了
你只需要了解下调用哪些系统接口或者使用哪个库
sagaxu
2019-11-22 13:09:29 +08:00
10 年前,处理 C10K 还要点编程技巧。现在嘛,傻乎乎的开 10K 个 Java 线程也就多用个 2.5G 内存。协程或者 async/await 方案已经烂大街,C10K 也早换成 C10M 了。
ipwx
2019-11-22 13:14:45 +08:00
asio, epoll, kqueue。或者基于这些的库。基本思想是非阻塞,在一个线程里面和尽可能多的客户端通讯。计算交给线程池。
opengps
2019-11-22 13:17:49 +08:00
现在做 socket 开发的资料比以前多多了,这些公开资料已经解决了楼主考虑的问题。
关于链接的保活,依赖的是客户端心跳包协议和服务端 keepalive
Acoolda
2019-11-22 13:50:14 +08:00
@bobuick 懂了懂了,是我想多了

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

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

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

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

© 2021 V2EX