给 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
云大,什么时候可以支持一下mongo事务,现在无状态服务越来越多了,有迫切需求
Posted by: allen | (6) July 22, 2022 10:44 AM
@fenglinnet
你可以帮忙完善一下 socket 部分。
我简单改了一下, 加了 MSG_WAITALL
Posted by: Cloud | (5) August 8, 2013 03:55 PM
今天测试了下lua-mongo,发现lua-socket模块中的一个bug。如果查询结果比较大的话,recv读取一次只会取到一部分数据,会导致lread直接返回0.
Posted by: fenglinnet | (4) August 6, 2013 05:21 PM
写的太好了,学习到了
Posted by: 弹簧合页 | (3) August 5, 2013 08:32 AM
@rand
我修改了两点
1. session 回绕后也永远是正数
2. socket 写失败会主动关闭
Posted by: Cloud | (2) August 2, 2013 11:11 AM
对你挺崇拜的,所以项目中用到了你的skynet的一些核心模块,很棒的设计。实际测试中发现gate模块存在非必现问题。在一定条件下,epoll未检测到socket断开,应用中不断向这个socket写数据,导致一直存放在发送缓冲区,因为socket已无法写入,导致epoll立刻返回,从而定时器的session很快加到负数,epoll无法被主动触发
Posted by: rand | (1) August 1, 2013 09:17 PM