是否可以添加或删除 Service Fabric 有状态服务命名分区

Posted

技术标签:

【中文标题】是否可以添加或删除 Service Fabric 有状态服务命名分区【英文标题】:Can you add or remove Service Fabric statefull service named partitions 【发布时间】:2021-07-04 12:00:52 【问题描述】:

文档中提到,在服务部署后,我们无法更改服务结构状态服务的分区数。如果使用命名分区,是否也是类似情况。我们可以在 statefull 服务的生命周期内添加或删除新的命名分区吗?有副作用吗?

【问题讨论】:

【参考方案1】:

作为一般规则,不,无论您如何处理它(例如 Int64、Named 或 Singleton),在创建服务后都不能修改分区。该定义在您的 ApplicationManifest.xml 中指明,不应更改。

也就是说,如果您在最初设计解决方案时错误地估计了分区计数,那么没有什么特别的原因您不能简单地使用新实现的分区计数创建服务的 v2 并在其中引入逻辑或创建 (可能是单例)无状态迁移服务,将您的数据从一个服务移动到另一个服务,在您认为合适的情况下映射分区之间的数据。

迁移后,您可以在任一服务中保存状态备份(以防万一),更新解决方案中的引用以指向新服务并删除旧服务。

它不像某些提供的迁移经验那样干净,但它确实完成了工作。

【讨论】:

在我们的场景中,我们已经命名了分区,这些命名分区中的每个名称都代表一个新的租户 ID。因此,每次新租户加入服务时,我们所做的就是更新服务的 ApplicationManifest.xml 并使用新租户的名称添加新的命名分区并重新部署服务。你是说不支持吗?如果是这样的话,会有什么负面影响? 根据docs,此命名分区旨在用于有界集,并表示您不能在事后更改分区。也就是说,有一个community call 建议您可以在早期 6.x 版本中任意添加/删除命名分区,但我无法找到任何有关此的文档/发行说明,所以我不知道如果必须支持的话。 也就是说,分区是以统一和快速的方式访问您的数据,不一定是文件夹结构,所以我可能会建议两种选择:1)将您的租户 ID 转换为您的数字键可用于将租户拆分为 int64 范围分区空间或 2)为每个租户创建新的服务单例实例并将 ID 放入名称中。 我找到了docs,了解社区电话中的内容。我认为这不太适合您正在处理的场景,但我还是想跟进。 感谢您的链接。阅读这篇文章,添加和删除命名分区似乎是有状态服务的支持方案。文章提到将命名分区添加为“0”、“1”和“2”,在我们的场景中,我们将添加命名分区,它只是一个不同的字符串。很遗憾,这在文档中没有得到正确解释,就像你自己一样,我也首先认为它不受支持..

以上是关于是否可以添加或删除 Service Fabric 有状态服务命名分区的主要内容,如果未能解决你的问题,请参考以下文章

删除 Service Fabric 应用后,进程仍继续运行

Service-Fabric 绑定到多个端点

Service Fabric 构建中的 PDB

Azure Service Fabric 支持的操作系统

Azure Service Fabric 可靠集合和内存

Service Fabric下删除实例并注销应用