azure-service-fabric - Service Fabric 中的 Stateless Worker 服务在同一进程中重新启动
问题描述
我有一个无状态服务,它从 Azure 队列中提取消息并对其进行处理。该服务还启动一些负责清理操作的线程。我们最近遇到了一个问题,这些线程在理想情况下应该在服务关闭时被杀死继续保持活动状态(绝对是我们的服务关闭过程中的一个错误)。
进一步查看日志,似乎RunAsync
方法取消令牌收到了取消请求,随后在同一进程中创建了注册的无状态服务的新实例ServiceRuntime.RegisterServiceAsync
。
这种预期行为是否表明服务结构可以在关闭当前实例后重新使用相同的进程来启动无状态服务的新实例。
服务结构文档https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-hosting-model似乎确实表明可以在同一进程上托管不同的服务,但我不能找到那里提到的上述行为。
解决方案
在共享进程模型中,ServicePackage
每个节点上的每个实例都有一个进程。添加或替换服务将重用现有流程。
这样做是为了节省运行服务的节点上的一些(进程级)开销,因此托管更具成本效益。此外,它还支持服务的端口共享。
您可以通过在应用程序清单中配置“独占进程”模式来更改此(默认)行为,因此每个副本/实例都将在单独的进程中运行。
<Service Name="VotingWeb" ServicePackageActivationMode="ExclusiveProcess">
正如您所提到的,您可以监视CancellationToken
以中止单独的工作线程,以便它们可以在服务停止时停止。
推荐阅读
- aem - AEM - 经典 UI - 我们可以在经典 UI 对话 CQ 小部件上实现工具提示吗?如果可能,我们该怎么做?
- nginx - 带有 2 台服务器的 nginx 反向代理
- r - 如何根据文件命名的递增顺序对输出进行排序
- ansible - Ansible 多个变量/值
- python - 如何将大 json 文件插入 postgresql
- html - 试图用背景图像填充整个内容框
- amazon-web-services - 使用 Lambda 启动 EC2 实例并附加到目标组
- java - 找不到 Springboot 存储库
- javascript - 无法调用返回数组以在全日历中设置事件的函数
- r - 如何使用 R 在文本文件中写入一个绝对有一个反斜杠的字符串?