« coroutine 的回收利用 | 返回首页 | 如何安全的退出 skynet »

给 skynet 添加 mongo driver

前段时间 实现了 mongo 的 lua driver ,做了一些基础工作后,由于工作比较忙就放下了。

这几天有同学告诉我他们在用这个了,并找到了一处 bug 。我还真是受宠若惊啊。一咬牙决定把这个东东整合到 skynet 中去。

本来觉得挺简单,做起来后发现必须把 lua-mongo 里的 socket 部分剥离开,才能替换成 skynet 的 socket 库

这个分离工作花了我一天的时间,结果虽然会损失一点性能,但是 mongo 的底层协议解析模块就可以独立出来。

和 skynet 的整合工作在做完这个步骤后,要轻松的多了。只需要把 socket 模块替换成 skynet 提供的即可。

注意:我们的项目暂时还没有使用 MongoDB ,所以我只实现了最基本的 mongo driver 的特性。需要有兴趣的同学帮我完善,或者,等我们的项目开始用 mongo 的话,总有一天我会自己把这些工作做完的。

有兴趣的同学可以直接 pull request 到 lua-mongo ,我会整合新功能,并合并到 skynet 中。

目前最希望完成的是短线自动重连, replica set ,以及 write concern 这三项特性。它们应该都可以在 lua 层完成。

Comments

@fenglinnet

你可以帮忙完善一下 socket 部分。

我简单改了一下, 加了 MSG_WAITALL

今天测试了下lua-mongo,发现lua-socket模块中的一个bug。如果查询结果比较大的话,recv读取一次只会取到一部分数据,会导致lread直接返回0.

写的太好了,学习到了

@rand

我修改了两点

1. session 回绕后也永远是正数

2. socket 写失败会主动关闭

对你挺崇拜的,所以项目中用到了你的skynet的一些核心模块,很棒的设计。实际测试中发现gate模块存在非必现问题。在一定条件下,epoll未检测到socket断开,应用中不断向这个socket写数据,导致一直存放在发送缓冲区,因为socket已无法写入,导致epoll立刻返回,从而定时器的session很快加到负数,epoll无法被主动触发

Post a comment

非这个主题相关的留言请到:留言本