我正在开发一个使用Amazon Kinesis的应用程序,我想知道的一件事是如何在升级过程中滚动应用程序而不会在流中丢失数据。我听说过类似蓝色/绿色部署之类的事情,但我想知道升级数据流服务的最佳做法是什么,这样你就不会从流中丢失数据。
例如,我的应用程序有一个HTTP端点,它将数据作为一系列POST操作来接收。如果我想用新版本替换服务,我如何管理到我的端点的现有应用程序流?
一种常见的方法是使用具有虚拟IP的软件负载均衡器(LB);在该LB之后,在正常操作期间将至少有两个HTTP接收端点。在升级过程中,每个端点都会依次发布和升级。LB确保没有流量被转发到已宣布的输出端点。
(端点本身可以位于单独的VM、Docker容器或物理节点上)。
当然,流需要是有限的;TCP套接字/HTTP流由其中一个端点所拥有。然而,只要流可以正常停止,假设端点A拥有当前摄取,则以下流就可以工作:
- 告诉端点A不要接受新流。所有新流将仅由LB重定向到端点B
- 优雅地停止端点A上的现有流
- 升级A
- 宣布A重返赛场
- 冲洗并重复终点B
顺便说一句,如果您需要任何合理的正常运行时间和可靠性保证,您将需要两个具有负载平衡(或主/从)设置的端点。
有更多的定制方法允许在同一端点上进行热代码交换,但它们更为定制,并依赖于特定的内部设计(例如,通过IPC连接的网络和处理堆栈之间的单独过程)。