首页 > 解决方案 > Service Fabric 中的 Stateless Worker 服务在同一进程中重新启动

问题描述

我有一个无状态服务,它从 Azure 队列中提取消息并对其进行处理。该服务还启动一些负责清理操作的线程。我们最近遇到了一个问题,这些线程在理想情况下应该在服务关闭时被杀死继续保持活动状态(绝对是我们的服务关闭过程中的一个错误)。

进一步查看日志,似乎RunAsync方法取消令牌收到了取消请求,随后在同一进程中创建了注册的无状态服务的新实例ServiceRuntime.RegisterServiceAsync

这种预期行为是否表明服务结构可以在关闭当前实例后重新使用相同的进程来启动无状态服务的新实例。

服务结构文档https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-hosting-model似乎确实表明可以在同一进程上托管不同的服务,但我不能找到那里提到的上述行为。

标签: azure-service-fabricservice-fabric-stateless

解决方案


在共享进程模型中,ServicePackage每个节点上的每个实例都有一个进程。添加或替换服务将重用现有流程。

这样做是为了节省运行服务的节点上的一些(进程级)开销,因此托管更具成本效益。此外,它还支持服务的端口共享。

您可以通过在应用程序清单中配置“独占进程”模式来更改此(默认)行为,因此每个副本/实例都将在单独的进程中运行。

<Service Name="VotingWeb" ServicePackageActivationMode="ExclusiveProcess">

正如您所提到的,您可以监视CancellationToken以中止单独的工作线程,以便它们可以在服务停止时停止。

有关此处应用模型配置进程激活模式的更多信息。


推荐阅读