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

2016-11-15 21:40:58 +08:00
 vzyw

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

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

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

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

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

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

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

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

大概就这么多吧
ericls
2016-11-16 00:01:50 +08:00
erlang 表示毫无压力
vzyw
2016-11-16 00:24:29 +08:00
@gamexg 谢谢提醒,打算用这个了
@feather12315 谢谢这些建议,好多还不懂,学习学习
lln133208
2016-11-16 08:29:49 +08:00
@feather12315 这本书哪里还可以买到吗?我找了很久
feather12315
2016-11-16 08:50:19 +08:00
@lln133208 我在我们学校图书馆借的
lln133208
2016-11-16 09:38:04 +08:00
@feather12315 我看的是同事的,想自己也买一本,但在亚马逊和京东上都找不到实体了。

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

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

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

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

© 2021 V2EX