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

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

  •  
  •   Acoolda · 2019-11-22 10:47:50 +08:00 · 2280 次点击
    这是一个创建于 1829 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


    条件

    • 机器性能相同进程线程内存什么的都是固定不变的( 我们忽略服务器配置 )
    • 用户请求是合理的,不存在什么非法请求
    • 保证尽可能多的用户 tcp/websocket 请求能正常链接上服务器( 通常说的高并发 )
    • 保证服务器能及时(1s 内吧 )响应在线的任意一个用户
    • 不讨论用户忘记关闭链接的情况
    • 请说明一下原理和思路方便大家一起讨论(无需代码,伪代码即可)
    kiracyan
        1
    kiracyan  
       2019-11-22 10:53:58 +08:00   ❤️ 1
    C10K ?
    Acoolda
        2
    Acoolda  
    OP
       2019-11-22 11:10:27 +08:00
    @kiracyan 我孤陋寡闻了,百度了一下才知道啥意思,差不多就是这个问题了,我想知道大佬们实践方案
    fancy111
        3
    fancy111  
       2019-11-22 11:16:51 +08:00
    swoole 和 nodejs 就很好的解决了这个问题,当然是用多进程或协程处理多个连接,毕竟用户不是每时每刻都发送数据。
    xiaotianhu
        4
    xiaotianhu  
       2019-11-22 11:25:47 +08:00
    每个开发语言都有对应的框架解决问题啊。
    一般都是基于 libevent 事件+异步 就搞定了。
    bobuick
        5
    bobuick  
       2019-11-22 12:41:36 +08:00
    这要求不高. 现在随便拉出来各类语言实现的一些网络库都能达到了. 你也可以自己用 c,或者 cpp 撸一个简单的, 不复杂. 这方面很多开源的最基础的实现, 拿过来自己看看.
    下层用 epoll, 我估计单个线程 accept, 然后放线程池里挂载 epoll 进行 epol_ctl 都能达到你要的性能.

    已经封装号的多如牛毛, go 的随便 C100k, java 的 netty 也随便能到. 前提是你只是个网络层, 如果把其他逻辑加就另外一回事了
    0ZXYDDu796nVCFxq
        6
    0ZXYDDu796nVCFxq  
       2019-11-22 12:52:39 +08:00 via Android
    C10K 十年前就解决了
    你只需要了解下调用哪些系统接口或者使用哪个库
    sagaxu
        7
    sagaxu  
       2019-11-22 13:09:29 +08:00 via Android
    10 年前,处理 C10K 还要点编程技巧。现在嘛,傻乎乎的开 10K 个 Java 线程也就多用个 2.5G 内存。协程或者 async/await 方案已经烂大街,C10K 也早换成 C10M 了。
    ipwx
        8
    ipwx  
       2019-11-22 13:14:45 +08:00 via Android
    asio, epoll, kqueue。或者基于这些的库。基本思想是非阻塞,在一个线程里面和尽可能多的客户端通讯。计算交给线程池。
    opengps
        9
    opengps  
       2019-11-22 13:17:49 +08:00 via Android
    现在做 socket 开发的资料比以前多多了,这些公开资料已经解决了楼主考虑的问题。
    关于链接的保活,依赖的是客户端心跳包协议和服务端 keepalive
    Acoolda
        10
    Acoolda  
    OP
       2019-11-22 13:50:14 +08:00
    @bobuick 懂了懂了,是我想多了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1066 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:23 · PVG 07:23 · LAX 15:23 · JFK 18:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.