0%

线上代码更新操作如何才能具有原子性?

之前思考过一个问题,PHP代码如何在不停用服务的情况下进行更新,直接 COPY 是绝对不可以的,使用 Git 拉取仓库代码实则也不是原子性操作。

Nginx

先卖个关子…哈哈哈

有空一定要研究一下 Nginx 的源码,组内有个学习讨论,最近分享的是 Nginx,确实学到了很多的知识。

……

怎么突然讲到 Nginx ?因为 Nginx 已经帮我们解决了这个问题了。
Nginx 中获取时间并不是直接调用系统函数,确实可以,但不推荐。
Nginx 缓存了一份时间,具体格式为:

图片走丢啦。。。

Nginx会在很多操作发生的时候进行缓存时间的更新,但 Nginx 本身就是一个支持高并发的应用,很可能时间更新到一半,缓存时间又被调用了,这样就会出现脏数据,取出来的时间是错误的。
为了解决这个问题,Nginx 使用了一个长度为 64 的数组,缓存时间变为一个指向数组的指针,每次更新时间就更新当前指向的下一个时间,然后在更新指针。指针的操作是原子性的,这样就能够保证取出的时间一定是正确的时间(格式上正确)。

服务更新

因为PHP服务一般都不是分布式的,无法像分布式应用那样更新。为了解决原子性更新操作的问题,有人提出来一个想法,将服务的文件夹设为软链,这样每次更新只需要更新软链即可。

不知道是不是受 Nginx 启发:sweat_smile: