vzyw
V2EX  ›  问与答

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

  •  
  •   vzyw · Nov 15, 2016 · 5232 views
    This topic created in 3491 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

    也可以试试函数式语言……
    gamexg
        12
    gamexg  
       Nov 15, 2016
    记得 windows 下一个线程预留 2M 栈,开不了多少线程就挂了。

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

    大概就这么多吧
    ericls
        14
    ericls  
       Nov 16, 2016 via iPhone
    erlang 表示毫无压力
    vzyw
        15
    vzyw  
    OP
       Nov 16, 2016 via iPhone
    @gamexg 谢谢提醒,打算用这个了
    @feather12315 谢谢这些建议,好多还不懂,学习学习
    lln133208
        16
    lln133208  
       Nov 16, 2016
    @feather12315 这本书哪里还可以买到吗?我找了很久
    feather12315
        17
    feather12315  
       Nov 16, 2016 via Android
    @lln133208 我在我们学校图书馆借的
    lln133208
        18
    lln133208  
       Nov 16, 2016
    @feather12315 我看的是同事的,想自己也买一本,但在亚马逊和京东上都找不到实体了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3812 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 04:22 · PVG 12:22 · LAX 21:22 · JFK 00:22
    ♥ Do have faith in what you're doing.