发布个 golang 高性能异步网络框架 nbio,单机百万不是梦!

lesismal · · 2859 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

## 项目地址 - [https://github.com/lesismal/nbio](https://github.com/lesismal/nbio) - 主要特点:高性能、事件驱动、易用易扩展、省协程省内存、节能环保 ## 关于另一个框架 - [https://github.com/lesismal/arpc](https://github.com/lesismal/arpc) - [arpc](https://github.com/lesismal/arpc) 包括但不限于 rpc,网络交互模式完善推送、游戏、IM等业务也都可以使用。并且 [arpc](https://github.com/lesismal/arpc) 与 [nbio](https://github.com/lesismal/nbio) 也打通了,支持使用 nbio 作为网络层实现更大并发量的支持 ## 设计与实现的一些基本思考和细节方案 1. 跨平台支持:*nix 用 epoll、kqueue, windows用的 std/net 2. epoll LT,单次读最大可配,避免饿死 3. epoll 没有使用 trigger 模式,因为较新版本的内核 epoll 相关系统调用以及其他并行流 close 都是安全的,trigger模式的无锁对性能提升也是伪命题,额外的系统调用以及内核部分的锁仍然是开销,应用层有锁并且单个 Conn 竞争几乎可以忽略,所以 trigger 模式未必有优势 4. Write是直接写,写失败才挂到Conn的队列,再添加写事件,可写、flush后清理掉写事件,尽量减少了epoll/kqueue的系统调用 5. 支持writev 6. 实现了 net.Conn,支持 DeadLine ,并发安全,也方便业务层多个并行流随意操作 7. 连接的管理,*nix直接是 fd 做数组下标对应 Conn 8. 读缓冲、应用层最大写缓冲都可配 9. 用于读取的内存分配可由应用层定制,方便业务层做更适合的定制,这个不同场景可以玩很多姿势,简单的 pool 未必是最优 10. Conn 提供 Hash 方法,方便业务层用于消息分发到指定协程进行处理,从而保证每个连接的消息处理有序 11. 单独的 heap timer,不使用 time.AfterFunc 节约协程 12. 支持管理标准库的 net.Conn,比如使用 net.Listener Accept 或者 net.Dial 得到 net.Conn 放到 nbio.Gopher 里管理读写 13. 最少依赖,除了tls作为扩展是需要依赖我的另一个仓库以及go1.6,单纯作为异步框架,nbio只依赖标准库 14. server-side/client-side 都支持 - 可定制、扩展的挺多的,不一一列举 ## 与其他一些 golang 异步网络框架对比 1. 性能:我这里同样配置、参数压测,nbio qps基本最高,多个框架的 pprof 分析,nbio 的 syscall read/write 占比应该是最高的,进入到 syscall 后的部分是框架层没法再优化的,这说明同一段时间内,nbio 更多的时间是在执行系统调用进行读写、框架本身的消耗占比小于其他框架 2. 易用性:nbio 实现了 net.Conn,更加业务友好、方便扩展定制,所以我最近花了几天把 go 1.6 std 的 crypto/tls copy 了一份,并重写支持了 nbio 的 tls server-side、server-side,标准哭 tls 的读写buffer有点浪费,还有不少优化空间,但是暂时够用、不着急进一步魔改优化。 - 后续还考虑标准库的 http 是否也魔改一下支持异步,但是如果要改,工程量有点大,也是得慢慢搞了 ## 一些例子 ### 1. 使用 nbio 管理标准库 net.Conn - [std-net-echo-server](https://github.com/lesismal/nbio/blob/master/examples/netstd/server/server.go) - [std-net-echo-client](https://github.com/lesismal/nbio/blob/master/examples/netstd/client/client.go) ### 2. Echo - [echo-server](https://github.com/lesismal/nbio/blob/master/examples/echo/server/server.go) - [echo-client](https://github.com/lesismal/nbio/blob/master/examples/echo/client/client.go) ### 3. TLS Examples - [tls-server](https://github.com/lesismal/nbio/blob/master/examples/tls/server/server.go) - [tls-client](https://github.com/lesismal/nbio/blob/master/examples/tls/client/client.go) 更多示例请参考文档和代码 ## 欢迎关注 - 欢迎 issue / pr / fork , star 更好

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2859 次点击  
加入收藏 微博
2 回复  |  直到 2021-02-24 22:48:49
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传