我们有一个用 PHP 编写的应用程序。前端大量使用javascript。通常,对于需要重新加载页面的普通应用程序,持续部署并不是真正的问题,因为:
- 该应用程序可以使用构建标签进行部署:
myapp-4-3-2013-b1
、、myapp-4-3-2013-b2
等。 - 当用户加载页面时(我们使用的是前端控制器模式),我们可以注入构建标签,并且文件会从应用目录加载正确的构建标签。
- 我们不需要将较旧的构建保留太久,因为随着较旧的请求完成,它们将移动到较新的构建标签。
- 数据库和用户数据不兼容的问题并不是很高,因为我们在人们的请求完成后将他们转移到较新的版本(稍后会详细介绍)。
现在,我们的应用程序的问题在于它大量使用 AJAX 来实现平滑的页面加载。此外,因为当人们浏览应用程序时根本没有页面刷新,所以人们可以将他们未保存的数据保留在他们当前的浏览器会话中,只要浏览器没有被刷新就可以重新访问它。
如果我们要实现持续部署,这会导致更大的问题:
我们可以将用户的构建标签保留在他们的会话中(在他们发出第一个请求时设置),并且仅在注销并再次登录后切换到更新的构建标签。这显然很糟糕,因为如果数据库架构发生变化或要写入磁盘的文件格式在较新的版本中发生变化,则无法协调这一点。
我们强制所有新请求使用新的构建标签,但是如果我们立即强制所有有会话的人使用新的构建标签,我们可能会更改客户端 javascript 并且会破坏很多事情。
显然,我们推送的每个构建都不会发生上述情况,希望不会发生很多,但我们希望构建一个万无一失的流程,以便可以部署通过我们测试的每个构建。同时,我们希望确保每个已部署和通过测试的构建不会无意中在运行会话的客户端中中断,从而导致一大堆问题。
我做了一些调查,谷歌所做的(至少在谷歌组中)是他们向客户端推送消息以刷新应用程序(浏览器窗口)。但是,在他们的情况下,所有未保存的客户端数据(如未保存的消息等)都将丢失。
鉴于现在使用 AJAX 和本地数据的应用程序非常普遍,有哪些更智能的方法可以处理这种情况,从而将对用户/客户的干扰降至最低?