有人用 Golang 写聊天室么?有 2 个问题请教

2014-12-20 15:31:50 +08:00
 mengzhuo
目前代码如下:
https://github.com/mengzhuo/go-chatroom

但是有两个问题:
使用里面的test.py测试时就会发现,
goroutine过多,十万级,怎么减少?
每个链接占用内存过多,直接就1M一个,3000个链接就3G……
1462 次点击
所在节点    Go 编程语言
11 条回复
lianghui
2014-12-20 15:36:41 +08:00
没有优化呀, golang 加redis 做chat 一进程能承受4w sockets 40w msg/s , 4w 套接字应该要耗2g内存的
mengzhuo
2014-12-20 15:44:34 +08:00
@lianghui

我断断续续地接触了2星期Golang,
所以先怀疑是自己的问题
我才3000个,就花了3G,看来有一堆要优化的地方
zealic
2014-12-20 16:10:41 +08:00
一个 Client 只要 以个 channel 就够了,不需要3个...
pathletboy
2014-12-20 16:13:15 +08:00
mengzhuo
2014-12-20 16:28:32 +08:00
@zealic
一个channel怎么实现呢?
两个是处理Message In/Out
一个虽然叫Quit,但是只是处理信号用的(一般就一次而已)
jybox
2014-12-20 16:32:17 +08:00
zealic
2014-12-20 16:45:04 +08:00
@mengzhuo Room 有个单独的 Channel,客户端发送的消息都到这个 Channel,退出信息自己造一条退出消息就行。
mengzhuo
2014-12-20 16:51:35 +08:00
@zealic
本来想用信号chan来阻塞select,好让其他消息的chan不要发送数据进来了,你这么一说我想到可以直接close chan了……
谢谢你的思路
defia
2014-12-20 17:17:51 +08:00
server.go 40 得continue,否则err==nil时,会空指针panic
client.go 66行 用fmt.Fprintf
message的content为什么是{}interface
client.go 78行 为什么不用[]bytes而用string,string会产生大量复制开销 建议做一个[]byte的pool去处理content
zhfsxtx
2014-12-21 00:11:44 +08:00
@defia 看的好认真
zeinimei
2014-12-23 19:09:38 +08:00
楼主用的数据库是mysql,pg还是mongodb等noSQL?

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

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

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

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

© 2021 V2EX