增强了 skynet 的 socket 库
今天想在 skynet 下访问外部的 http 接口, 所以试了一下前几天新写的非阻塞 socket 库。
由于测试的时候用的 URL 被墙了,所以发现了问题:connect 目前是阻塞模式的。连接一个有问题的服务器可能被阻塞很久。所以花了点时间把 connect 接口改成非阻塞的了。
我以前没处理过这种情况,所以也就按书上的写法写写,异步 connect 做起来挺麻烦的。如果有用 skynet 的同学这方面经验丰富,烦请用之前帮忙 review 一下新打的 patch 。
另外,为了处理 http 的需求,给 socket 库增加了新接口 readall ,可以读 socket 上的所有数据(直到对方 close 再返回)。
socket.read 和 socket.readline 也改进了,如果对方关闭了连接,那么最后一次调用除了返回 nil 外,也把最后发送过来的数据返回。这样,readline 就可以处理最后一行没有分割符的情况了。
另外一个小改进是针对上次 两步初始化 lua 服务 的。
我在 lua 服务启动模块中增加了出错通知,这样 launcher 服务就可以拿到启动的出错信息了。
当然,我觉得 Hive 里处理服务启动的方式更漂亮一些。就是独立出一个服务启动协议,把启动参数用消息传进去,目前这样用长字符串传递启动消息的方式非常容易出错。
可惜我们已经在目前的 skynet 上积累了太多代码,想改比较困难了。
Comments
同步connect在一些情况下会成为灾难,血的的教训~~
Posted by: wstc | (4) July 25, 2013 02:53 PM
对于connect的问题,我是比较偷懒的做法,直接弄一个线程管理连接/重连和搬数据,与上层通过消息队列或回调传数据。
Posted by: zelor | (3) July 24, 2013 05:20 PM
@qiaojie
skynet 里的服务很轻量, 类似于 erlang 的进程. 承受不了独立进程的额外开销.
Posted by: Cloud | (2) July 23, 2013 10:47 AM
我的设计比较简单,把服务做成一个可以接受命令行的程序,启动和关闭过程可以通过一条或者多条命令来完成,另外还可以实现一些额外的命令干别的事情,非常容易扩展。在外面套个守护进程,就可以远程进行管理了。
Posted by: qiaojie | (1) July 22, 2013 11:51 PM