后端系统开发之巧妙的双buffer技术

软件开发过程中总会遇到这样的需求或想法:如何在程序不重启的情况下,让某个配置参数动态生效?

不重启程序的原因有很多,例如程序分布在几十台甚至成上百台机器上,或者重启服务需要复杂的审批流程,重启代价很高;而配置参数在设计之初就预料到会被经常修改,例如黑名单或白名单配置,或者是一个经常被修改的普通配置文件。

我们知道,为了保证程序运行效率,程序在启动时会将配置信息加载到内存中使用,不会每次都请求数据库或者重新读取配置文件。这时,解决问题的最好办法就是采用双buffer技术。双buffer技术解决思路是这样的:

首先提供一个有两个元素的数组,同时提供读下标read_index和写下标write_index。显然,读下标和写下标的值只有两种情况:read_index为0,write_index为1,或者read_index为1,write_index为0。

将配置信息加载到读下标read_index对应的数组元素中;接下来开启一个检测线程用于定时检测配置信息变化,当检测到内容有变化时,就将最新的配置信息写入写下标write_index对应的数组元素中,最后交换read_index和write_index的值,完成双buffer切换。

程序在运行过程中使用配置参数时,需要调用双buffer的接口获取配置信息,接口的原理是首先获取当前读下标read_index的值,然后从读下标对应的数组元素中获取配置信息。由于配置文件更新会触发读、写下标的自动切换,从而保证程序能够使用最新的配置参数值。

可能有的朋友会思考这样一个问题,在高并发情况下,如何保证双buffer切换是安全的呢?

这就是双buffer切换设计巧妙的地方了!仔细分析会发现,由于检测线程是定时检测配置信息变化的,所以从读、写下标切换完成,到下一次新的读、写下标再次发生切换,这中间存在一个“旧数据失效缓冲期”,这意味着在这段时间内两个buffer虽然内容有新旧的差异,但是都是完整、可用的,因此不会导致程序读取数据时出现崩溃。

举个例子,央行在推行新版人民币、回收旧版人民币时,设置了一个缓冲期,这时候新、旧版人民币是可以共同使用的,当到了央行规定的截至日期时,市场上才几乎不再流通旧版人民币。

双buffer切换原理是一样的,在读、写下标切换过程中,必然存在新、旧数据同时在使用的情况,只要保证缓冲期足够长,那么切换就是很安全的。通常检测线程的检查周期是秒级的,而获取配置信息是毫秒级甚至微秒级的,因此缓冲期是完全足够的。

最后谈谈如何实现一个工业级别的双buffer,即实际工作中的双buffer应具备哪些特性。首先应设计友好的接口,接口应简单易用,同时不容易被误用;还需要支持多种文件格式:例如protobuf格式的二进制文件、普通文本文件等(存放在数据库表中的配置信息可以导出生成数据文件,即转换成普通文本文件)。

金句分享

股票是对未来的一种预期,是体现在企业的自身价值之上的,没有了企业业绩的根本,纯概念的炒股终将会随着泡沫的破裂而灰飞烟灭,价值的投资才是市场的根本。

摘自《从零开始学炒股——炒股绝招》

解读:做有价值的人,选有价值的公司和股票。

猜你喜欢

转载自blog.csdn.net/wanfang323/article/details/88216002