最近需要做一个作业,想实现一个聊天室,聊天室里有不同房间,每个房间支持几十个人同时在线。
以前做过 java 实现的聊天室,工作原理就是:用户和服务器建立一个 socket 连接,服务器每连上一个用户就新建一个 socket 线程,有用户发消息过来就给所有线程进行广播,发送用户的消息,这样其他用户就能收到消息,实现聊天室功能。
现在想做一个支持千人多房间聊天室,可是现在我的思路就是后端用 id 对应每个聊天室数组,一个数组内维护连接 n 各用户的 n 个 socket 线程,原理同上。但这样是不是达不到我想要的千人聊天室的效果,感觉自己想法很局限,只能是 socket 通信吗?现实中的聊天平台是如何实现的呢?后端真的是这么来做的吗?
望各位大牛指点,后端想选用 nodejs , php 不知道可不可以。前端主要是 Android 和 iOS
1
douglas1997 2016-11-15 21:46:19 +08:00
mark
|
3
misaka19000 2016-11-15 21:48:58 +08:00 via Android
一千个链接用 IO 多路复用会好点吧,开一千个线程的话貌似开销有点大
|
4
FanError 2016-11-15 21:49:23 +08:00
nio
netty |
5
vzyw OP @misaka19000 “ IO 多路复用” 我去了解下
|
6
ipconfiger 2016-11-15 21:50:49 +08:00
首先, 每个 client 一个线程是不对的
|
8
odirus 2016-11-15 21:51:19 +08:00 via Android
如果是作业的话就 Netty
如果商用的话就专门的消息交换服务器或者集群 |
9
petelin 2016-11-15 21:52:51 +08:00 via Android
socket 肯定不合适,最少也是个 websocket,推荐传统的轮询。 1000 个人在线,每秒 1000 请求一下服务器看有没有新消息。
|
10
akira 2016-11-15 21:58:37 +08:00
最终还是 socket 了啦,没有什么黑科技的。 windows 下的话,传统的 win 轮询方案已经足够负荷千人聊天室了。
|
11
aheadlead 2016-11-15 22:22:39 +08:00
用 epoll 这样的 IO 复用吧
也可以试试函数式语言…… |
12
gamexg 2016-11-15 23:29:07 +08:00
|
13
feather12315 2016-11-15 23:54:28 +08:00 via Android
前几天扫过<<Linux 高性能服务器编程>>,上面给出了一些高性能的建议:
IO 多路复用(活跃连接比较少的情况下, epoll 更佳); 使用零拷贝函数(不拷贝数据至用户空间); proactor 比 reactor 设计模式更佳; 采用进程 /线程池,避免创建的开销; 共享内存,节约管道等 ipc 通信之间的开销; 避免使用信号量、锁等。 大概就这么多吧 |
14
ericls 2016-11-16 00:01:50 +08:00 via iPhone
erlang 表示毫无压力
|
15
vzyw OP |
16
lln133208 2016-11-16 08:29:49 +08:00
@feather12315 这本书哪里还可以买到吗?我找了很久
|
17
feather12315 2016-11-16 08:50:19 +08:00 via Android
@lln133208 我在我们学校图书馆借的
|
18
lln133208 2016-11-16 09:38:04 +08:00
@feather12315 我看的是同事的,想自己也买一本,但在亚马逊和京东上都找不到实体了。
|