gpt4 book ai didi

deployment - Slack bot 的零停机部署

转载 作者:行者123 更新时间:2023-12-04 12:52:47 25 4
gpt4 key购买 nike

我们使用 BotKit 开发机器人,现在我们尝试以最少的部署停机时间解决问题。

该服务器上运行着服务器和 docker 容器。在容器内运行与 RTM-server (Slack) 连接的 bot-app 实例。
当我开始部署机器人应用程序的新版本 (v2) 时,我希望停机时间为零,用户不应看到“机器人离线”。

timeline

部署脚本使用新版本的 bot-app 运行第二个 docker 容器。并且 bot-app 也连接到 RTM-server。通过这种方式,当两个应用程序运行、连接到 RTM 服务器并响应用户命令时,有几秒钟的时间(并且用户将看到他的命令的两个答案)。

如果一方面我们希望获得零停机时间,另一方面我们希望防止用户同时与两个实例交互,我可以得到什么最佳决策?

决定 1:
当两个实例都响应用户命令时,允许发生碰撞的可能性很小。

决定 2:
放弃零停机部署。在这种情况下,部署脚本首先停止第一个 docker-container,然后再启动另一个。该应用程序不会响应在停止当前版本的应用程序和完全启动新版本的应用程序之间发送的用户命令。

决定 3:
通过并行运行当前和新版本的应用程序或互斥锁的交互。一般示意图:
1) 当前版本的应用程序正在运行
2)部署脚本启动新版本的应用程序
3)当新版本的应用程序几乎运行并准备连接到RTM服务器时,它发送到当前版本的应用程序命令以关闭RTM连接。
4) 当前版本的应用程序关闭了 RTM 连接
5) 新版app开放RTM-connection

我认为还有其他好的解决方案。

您将如何在您的应用程序中解决这个问题?

最佳答案

(抱歉第二次回复;有另一个想法。)

我之前描述的方法会对您现有的代码造成很大的破坏,因为您可能需要停止使用 botkit(或者至少不要使用它来进行 RTM API 通信)。一种可能不那么具有破坏性的方法是使用某种外部方式来表示给定的消息已经被处理。

例如,使用 Redis,让机器人在收到消息时执行以下命令:

SET message:<message timestamp> 1 NX PX 30000
NX选项意味着此命令仅在 key 不存在时才会成功。因此,设法执行此操作的机器人的第一个实例将成功,而另一个实例将失败。如果此命令成功,机器人应该只处理消息并响应。

( PX 30000 设置了 30 秒的过期时间,因此 Redis 不会装满这些键。)

这应该让您可以通过重叠正在运行的机器人实例来进行零停机升级,而不必担心消息被处理两次。

请注意,如果机器人以非正常方式关闭,则在此方案中仍有可能完全删除消息。 (它可能会在调用 SET 命令之后但在实际处理消息之前死亡。)具有两阶段“获取/删除”的真实队列会更好,但随后您又回到了我的另一个答案。 :-)

关于deployment - Slack bot 的零停机部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36669664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com