V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
vzyw
V2EX  ›  问与答

千人聊天室技术是如何实现的?

  •  
  •   vzyw · 2016-11-15 21:40:58 +08:00 · 4659 次点击
    这是一个创建于 2711 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近需要做一个作业,想实现一个聊天室,聊天室里有不同房间,每个房间支持几十个人同时在线。

    以前做过 java 实现的聊天室,工作原理就是:用户和服务器建立一个 socket 连接,服务器每连上一个用户就新建一个 socket 线程,有用户发消息过来就给所有线程进行广播,发送用户的消息,这样其他用户就能收到消息,实现聊天室功能。

    现在想做一个支持千人多房间聊天室,可是现在我的思路就是后端用 id 对应每个聊天室数组,一个数组内维护连接 n 各用户的 n 个 socket 线程,原理同上。但这样是不是达不到我想要的千人聊天室的效果,感觉自己想法很局限,只能是 socket 通信吗?现实中的聊天平台是如何实现的呢?后端真的是这么来做的吗?

    望各位大牛指点,后端想选用 nodejs , php 不知道可不可以。前端主要是 Android 和 iOS

    18 条回复    2016-11-16 09:38:04 +08:00
    douglas1997
        1
    douglas1997  
       2016-11-15 21:46:19 +08:00
    mark
    good
        2
    good  
       2016-11-15 21:47:40 +08:00
    socket.io swoole 都可以做聊天端 千人在线没什么压力的
    misaka19000
        3
    misaka19000  
       2016-11-15 21:48:58 +08:00 via Android
    一千个链接用 IO 多路复用会好点吧,开一千个线程的话貌似开销有点大
    FanError
        4
    FanError  
       2016-11-15 21:49:23 +08:00
    nio
    netty
    vzyw
        5
    vzyw  
    OP
       2016-11-15 21:50:34 +08:00
    @misaka19000 “ IO 多路复用” 我去了解下
    ipconfiger
        6
    ipconfiger  
       2016-11-15 21:50:49 +08:00
    首先, 每个 client 一个线程是不对的
    vzyw
        7
    vzyw  
    OP
       2016-11-15 21:50:55 +08:00
    @good 谢了 我去看看
    odirus
        8
    odirus  
       2016-11-15 21:51:19 +08:00 via Android
    如果是作业的话就 Netty

    如果商用的话就专门的消息交换服务器或者集群
    petelin
        9
    petelin  
       2016-11-15 21:52:51 +08:00 via Android
    socket 肯定不合适,最少也是个 websocket,推荐传统的轮询。 1000 个人在线,每秒 1000 请求一下服务器看有没有新消息。
    akira
        10
    akira  
       2016-11-15 21:58:37 +08:00
    最终还是 socket 了啦,没有什么黑科技的。 windows 下的话,传统的 win 轮询方案已经足够负荷千人聊天室了。
    aheadlead
        11
    aheadlead  
       2016-11-15 22:22:39 +08:00
    用 epoll 这样的 IO 复用吧

    也可以试试函数式语言……
    gamexg
        12
    gamexg  
       2016-11-15 23:29:07 +08:00
    记得 windows 下一个线程预留 2M 栈,开不了多少线程就挂了。

    nodejs 的话直接用 socket.io , android 下有线程的库, iOS 应该也有。
    另外不推荐用 socket ,用 socket.io 或 websocket 省事网页端能够一起实现了。
    feather12315
        13
    feather12315  
       2016-11-15 23:54:28 +08:00 via Android
    前几天扫过<<Linux 高性能服务器编程>>,上面给出了一些高性能的建议:
    IO 多路复用(活跃连接比较少的情况下, epoll 更佳);
    使用零拷贝函数(不拷贝数据至用户空间);
    proactor 比 reactor 设计模式更佳;
    采用进程 /线程池,避免创建的开销;
    共享内存,节约管道等 ipc 通信之间的开销;
    避免使用信号量、锁等。

    大概就这么多吧
    ericls
        14
    ericls  
       2016-11-16 00:01:50 +08:00 via iPhone
    erlang 表示毫无压力
    vzyw
        15
    vzyw  
    OP
       2016-11-16 00:24:29 +08:00 via iPhone
    @gamexg 谢谢提醒,打算用这个了
    @feather12315 谢谢这些建议,好多还不懂,学习学习
    lln133208
        16
    lln133208  
       2016-11-16 08:29:49 +08:00
    @feather12315 这本书哪里还可以买到吗?我找了很久
    feather12315
        17
    feather12315  
       2016-11-16 08:50:19 +08:00 via Android
    @lln133208 我在我们学校图书馆借的
    lln133208
        18
    lln133208  
       2016-11-16 09:38:04 +08:00
    @feather12315 我看的是同事的,想自己也买一本,但在亚马逊和京东上都找不到实体了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3558 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:40 · PVG 12:40 · LAX 21:40 · JFK 00:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.