我正在使用Azure ServiceFabric上的ReliableActors框架构建应用程序。随着我们的规模扩大,我正在研究蓝/绿部署。我可以看到如何在无状态系统中实现此操作。但是,在有状态演员的情况下是否有方法可以做到这一点?
我正在使用Azure ServiceFabric上的ReliableActors框架构建应用程序。随着我们的规模扩大,我正在研究蓝/绿部署。我可以看到如何在无状态系统中实现此操作。但是,在有状态演员的情况下是否有方法可以做到这一点?
Service Fabric强调的是滚动升级,而不是像VIP交换一样进行部署切换。无状态和有状态服务都可以使用同一种方式进行升级,但是在有状态服务方面有一些额外细节需要稍后提到。
所谓滚动升级,是指应用程序的升级在原地完成,一次仅升级一个升级域,因此没有停机时间和突然切换。在Service Fabric中,滚动升级可以在安全的“受管理”模式下进行,平台会在进入下一个升级域之前执行健康检查,并且如果健康检查失败,自动回滚。
听起来很不错,但当升级始终是滚动升级时,如何进行蓝/绿部署呢?
这就涉及到应用程序类型和版本。Service Fabric不是拥有两个可以容纳两个运行应用程序的“环境”,而是拥有这个概念:基于版本的应用程序类型,可以从中创建应用程序实例。以下是它的工作原理示例:
假设我想创建一个名为Foo的应用程序。我的Foo应用程序被定义为一个应用程序类型,称为FooType。这类似于在C#中定义一个类。与C#中的类一样,我可以创建我的类型的实例。每个实例都有一个唯一的名称,类似于类的对象实例具有唯一的变量名。但与C#中的类不同,我的FooType有一个版本号。然后我可以在群集中“注册”应用程序类型和版本:
FooType 1.0
注册完毕后,我可以创建该应用程序的一个实例:
"fabric:/FooApp" of FooType 1.0
假设我开发了应用程序的 2.0 版本。那么我就需要在集群中注册 FooType 的 2.0 版本:
FooType 1.0
FooType 2.0
现在我已经注册了FooType的两个版本,并且仍然有一个1.0版本的实例正在运行:
"fabric:/FooApp" of FooType 1.0
这里变得有趣了。我可以做一些有趣的事情:
我可以把“fabric:/FooApp” - FooType 1.0的一个实例 - 升级到FooType 2.0。这将是正在运行的应用程序的滚动升级。
或者..我可以不管“fabric:/FooApp”,并创建一个我的版本2.0应用程序的新实例:
"fabric:/FooApp" of FooType 1.0
"fabric:/FooAppv2Test" of FooType 2.0
现在我有两个应用程序在同一个集群中并行运行。其中一个是1.0版本的实例,另一个是2.0版本的实例。通过一些端口和应用程序终点的配置,我可以确保用户仍然访问1.0版本的实例,同时测试2.0版本的实例。