重写了 skynet 中的 socket 库
前几天在做 skynet 的 mongodb driver ,感觉以前为 skynet 做的 socket 库不太好用。
以前 skynet 对外的网络连接是通过 connection 服务实现的,这个服务会自动推送绑定的 socket 的上行数据到指定的位置。接下来,需要自己用 coroutine 去分析这个数据流。这样做比设计一个询问应答接口来获取 socket 上的数据流要高效一些,但用起来很不方便。
我希望能有一个看起来和传统的 socket api 类似的接口,直接 read/write 即可,但又不想失去性能。而且 read 不能阻塞住系统线程。
这次重新实现了 connection 服务,就把接口也改过来了,新的服务叫 socket 以便于和之前区分。
新的 socket 服务除了读数据外,也加上了写缓冲。这个改动类似于前几天对 gate 服务的修改。修改过程中,我把 epoll 和 kqueue 相关的代码抽取出来,独立在一个 event.h 的头文件去了。
api 改动最大的是 socket.lua 这个库,增加了 read write readline 等接口。由于 skynet 的 service 在分发包的时候可以利用 coroutine 并发。如果直接用 read 去解析数据包的话,若有多个 coroutine 同时解析同一个 fd ,就有可能产生混乱。我增加了对 fd 的锁来回避这个问题。
当然,一般是不会直接使用 socket 这个底层库的。一个应用 socket 库的案例是重新编写的 redis 库。
老版的 redis 是先建立一个 redis-cli.lua 的服务,统一和外部 redis server 交互。有了新版 socket 库后,直接去和外部 redis server 建立连接就可以了。
Comments
Posted by: ling0kill | (12) August 10, 2018 11:27 AM
Posted by: szzg007 | (11) June 20, 2017 09:18 PM
Posted by: 晨旭 | (10) November 4, 2013 03:50 PM
Posted by: cd | (9) June 25, 2013 09:14 PM
Posted by: cd | (8) June 25, 2013 08:45 PM
Posted by: Anonymous | (7) June 25, 2013 09:26 AM
Posted by: szzg007 | (6) June 24, 2013 02:45 PM
Posted by: Anonymous | (5) June 22, 2013 03:33 PM
Posted by: Cloud | (4) June 22, 2013 12:45 PM
Posted by: Anonymous | (3) June 21, 2013 11:18 PM
Posted by: Anonymous | (2) June 21, 2013 10:37 PM
Posted by: szzg007 | (1) June 21, 2013 09:03 PM