我们使用BotKit开发机器人,现在我们试图解决最小化部署停机时间的问题。
服务器和Docker容器正在该服务器上运行。容器内运行连接到RTM服务器(Slack)的bot-app实例。 当我开始部署bot-app的新版本(v2)时,我希望获得零停机时间,用户不应看到“ bot离线”。
部署脚本运行第二个Docker容器,并使用bot-app的新版本。 bot-app也连接到RTM服务器。以这种方式,在两个应用程序同时运行,连接到RTM服务器并响应用户命令(用户将看到两个答案)之前有几秒钟。
如果我们既想获得零停机时间,又想防止用户同时与两个实例进行交互,我们可以采取以下最佳决策:
决策1:允许两个实例同时响应用户命令的可能性较小。
决策2:放弃零停机时间部署。在这种情况下,部署脚本首先停止第一个Docker容器,然后启动另一个Docker容器。此时,应用程序将无法响应用户命令,这些命令被发送在当前应用程序版本停止和新应用程序完全启动之间。
决策3:采用并行运行当前应用程序和新版本应用程序或互斥锁的交互。一般原理如下: 1)当前应用程序版本正在运行 2)部署脚本启动新的应用程序版本 3)当新的应用程序版本几乎运行并准备好连接到RTM服务器时,它向当前应用程序版本发送关闭RTM连接的命令。 4)当前应用程序版本关闭RTM连接 5)新的应用程序版本打开RTM连接
我认为还有其他不错的解决方案。
你的应用程序中,你会如何解决这个问题呢?
服务器和Docker容器正在该服务器上运行。容器内运行连接到RTM服务器(Slack)的bot-app实例。 当我开始部署bot-app的新版本(v2)时,我希望获得零停机时间,用户不应看到“ bot离线”。
部署脚本运行第二个Docker容器,并使用bot-app的新版本。 bot-app也连接到RTM服务器。以这种方式,在两个应用程序同时运行,连接到RTM服务器并响应用户命令(用户将看到两个答案)之前有几秒钟。
如果我们既想获得零停机时间,又想防止用户同时与两个实例进行交互,我们可以采取以下最佳决策:
决策1:允许两个实例同时响应用户命令的可能性较小。
决策2:放弃零停机时间部署。在这种情况下,部署脚本首先停止第一个Docker容器,然后启动另一个Docker容器。此时,应用程序将无法响应用户命令,这些命令被发送在当前应用程序版本停止和新应用程序完全启动之间。
决策3:采用并行运行当前应用程序和新版本应用程序或互斥锁的交互。一般原理如下: 1)当前应用程序版本正在运行 2)部署脚本启动新的应用程序版本 3)当新的应用程序版本几乎运行并准备好连接到RTM服务器时,它向当前应用程序版本发送关闭RTM连接的命令。 4)当前应用程序版本关闭RTM连接 5)新的应用程序版本打开RTM连接
我认为还有其他不错的解决方案。
你的应用程序中,你会如何解决这个问题呢?