现在使用nodejs做tcp方面的开发工作,使用了redis和mongodb作为基础数据的支撑,因为系统需要长期地运行,所以不确定当中途某个数据库连接断掉之后会发生什么情况,暂时不从源代码入手吧,先手动尝试观察一下,先观察表象,再深入理解


经过测试,发现通过nodejs的redis客户端获取的连接在中途发生断线之后(模拟场景有手动Kill掉TCP连接和手动关闭redis-server两种情况)会进行自动重连,而且在中途进行操作,回调函数中会返回错误信息,这样的话至少代码不会爆掉,进程也不会挂,最神奇的是之前获取到的操作句柄还能够正常使用,重连发生在这个操作对象内部,对开发者是不可见,应该来说很友好吧,最神奇的是nodejs驱动开发者考虑到了很多细节的问题,比如开始的时候客户端订阅了某个频道,在进行重连后还会初始化一次(内部机制之后看源代码之后才能下结论),看来真是省心啊。


mongodb的官方nodejs驱动有个很厉害的地方,当操作过程中连接被断掉后(直接手动关闭mongodb-server),如果后续还有操作,将会被暂时存储起来,当连接被重新建立之后,所有“缓冲区”的数据将会被写入数据库,看来还是很不错的哦,但是目前待思考的地方是如果有大量数据,“缓存区”会在什么情况下清空呢?(看来研究一下驱动很有必要了)


他们的共同点就是第一次必须先获取操作对象,否则代码直接会爆掉的(不过这点上redis就做得比较好了,无论是否连接上客户端都返回一个操作对象,看来mongodb其实还可以改进一下),这个当然好理解,所以现在系统在最开的时候会有一个初始化阶段,负责初始化数据缓存池连接(包括redis和mongodb),接下来就不怕啦,即使是中途tcp断掉一段时间还是可以接受的


无论在使用mongo还是redis在进行写操作的时候,都一定使用回调函数,这样才能更加保险,否则很有可能都没有写进去,又或者是数据在重连成功前被清除掉了呢。


@todo mongodb nodejs drive buffer size before connected again...


odirus
107 声望1 粉丝