gansidui / gotcp Goto Github PK
View Code? Open in Web Editor NEWA Go package for quickly building tcp servers
License: MIT License
A Go package for quickly building tcp servers
License: MIT License
请问gotcp 框架的处理性能你有测试过吗?
安装下列两种情况,使用gotcp作为server端的处理性能大概是多少呢?
1.client---->gotcp_server 这种情况下的gotcp_server 的处理量是多少每秒?
2.client---->interface---->gotcp_server 这种情况下的gotcp_server 的处理量是多少每秒?
你好,
首先感谢您写的这个框架,有个疑问,在conn.go的101行,是不是有可能会导致崩溃?所以有一个recover?
谢谢
wg := sync.WaitGroup{}
go func() {
wg.Add(1)
defer wg.Done()
}()
wg.Wait()
这样的代码会出现预想 goroutine 还没来得及被调度,主 goroutine 就已经执行到 wg.Wait()
直接 Game Over
正确的处理应该是:
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
}()
wg.Wait()
wg.Add(1)
和 wg.Wait()
需要在同一个 goroutine 中。使用 go run -race
也会提示 DATA RACE
具体如下:
$ go run -race examples/echo/server/server.go
listening: [::]:8989
^CSignal: interrupt
==================
WARNING: DATA RACE
Write by main goroutine:
sync.raceWrite()
/usr/local/Cellar/go/1.5.1/libexec/src/sync/race.go:41 +0x2e
sync.(*WaitGroup).Wait()
/usr/local/Cellar/go/1.5.1/libexec/src/sync/waitgroup.go:124 +0xf9
github.com/gansidui/gotcp.(*Server).Stop()
/Users/larry/src/github.com/gansidui/gotcp/server.go:63 +0x6a
main.main()
/Users/larry/src/github.com/gansidui/gotcp/examples/echo/server/server.go:63 +0x9cf
Previous read by goroutine 7:
sync.raceRead()
/usr/local/Cellar/go/1.5.1/libexec/src/sync/race.go:37 +0x2e
sync.(*WaitGroup).Add()
/usr/local/Cellar/go/1.5.1/libexec/src/sync/waitgroup.go:66 +0xfa
github.com/gansidui/gotcp.(*Server).Start()
/Users/larry/src/github.com/gansidui/gotcp/server.go:35 +0x52
Goroutine 7 (running) created at:
main.main()
/Users/larry/src/github.com/gansidui/gotcp/examples/echo/server/server.go:54 +0x415
==================
Found 1 data race(s)
exit status 66
客户端链接会话保存到redis,根据情况单独发送数据。
示例都是echo或者telnet的场景实际上很少
当客户端关闭连接的时候 , HandleChannel还在处理其中的Packet, 结果这个时候直接调用了Close,导致HandleChannel直接关闭不可用,这样就丢了其中的消息,能否在关闭的时候加个超时或者处理完再关闭
Hello,
Is there a solution to detail with half packet data?
Thanks,
zhangkai
通过三个goroutine异步去服务一个连接, 是一个比较好的考虑.
但是通过select去一个chan里拿数据:https://github.com/gansidui/gotcp/blob/master/conn.go#L141
会存在一定的问题.
如果服务器还在write数据, 此时readloop继续去chan里select数据, 结果为eof, 这样会导致defer关闭conn,从而阻断服务器写数据的操作, 引起客户端异常.
仿照echo server写了接收程序,在ReadPacket可正常接收数据,而数据时常无法传递到OnMessage。
已经设置PacketReceiveChanLimit=200000
不知道其他朋友是否遇到此问题,打算尝试gtcp
example /server 运行后, 使用nc 127.0.0.1 8989 连接后 发送任何内容都可以 使服务 崩溃。
这个gotcp 必须 使服务端 和客户端 统一 在发送内容前面加生 一个 type 用于区分。客户端如果不加 就不能使用。
如何平滑重启或者停止server
closechan里的消息, 是在什么地方放进去的?
而且 read, handle, 和write三个loop都会去接收里面的消息, 然后执行关闭操作.
那其余两个没收到, 会因为close(chan)而关闭其余的goroutine吗?
我评论了这次commit
bc20b14
我觉得从代码维护性上来看, 如果一个goroutine需要Done, 那么应该在本函数Add, 这样不用分散的去找哪里add的.
这里有个讨论的帖子:
http://stackoverflow.com/questions/19208725/example-for-sync-waitgroup-correct
func asyncDo(fn func(), wg *sync.WaitGroup) { wg.Add(1) go func() { fn() wg.Done() }() }
如果是telnetprotol中的例子。考虑一个粘包问题:
客户端连续发送:
echo 123 [\r\n]
echo 456 [\r\n]
这个时候ReadPacket只能处理echo 123,echo 456就被丢弃了..
我想用该框架开发一个后台系统,收到包之后顺序转发给后面的server1, 然后等待后端server1回包再请求server2,server2回包再给前端回包。
我的做法是在OnMessage里面创建goroutine使用tcp短连接发包后端server, 然后等待后端server回包。也就是SendAndRecv的过程,但是这样每个请求都要创建连接开销有点大。
另外想到的一种做法是参考异步网络框架,将连接后端server的socket也放到主线程中readloop,但是这样的话又需要维护一个状态机,不如协程做法复杂性低。请问楼主是怎么做的?
server-->db_pool_conn
-->client_conns
-->add_port1<--->protocol(增加监听端口)
-->add_port2<--->protocol(tcp、udp、其他协议)
event--->conect
event--->close
event--->task(耗时任务)
event--->recieve
我觉得可以按照计划,一步步实现这些功能,这样就是一个强大的tcp框架了
以后再引入model、rpc等
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.