azure-service-fabric - 关闭 Service Fabric 无状态服务的实例
问题描述
我有一个 Service Fabric 无状态服务,它作为后台作业运行并从队列中读取。对于它收到的每条消息,它都会调用一个外部 API。
如果外部调用的失败率很高,我想关闭服务的特定实例。如果我无法处理这些消息,我不想从队列中读取它们。
从 RunAsync() 方法关闭实例的最佳方法是什么?我抛出 OperationCanceledException 来关闭实例,但这是正确的方法吗?
protected override async Task RunAsync(CancellationToken cancellationToken)
{
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
if (/* error rate is high*/)
{
throw new OperationCanceledException();
}
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
解决方案
关闭服务实例不会帮助您解决问题。
主要是因为SF会在没有SF请求的情况下关闭服务时再次启动(重启),并且服务将在不到一分钟后开始处理消息。因此,关闭服务不会解决问题。
最好的方法是在服务中处理这些故障,即实施重试/回退/断路器策略以在尝试之间留出更多时间,或者设置一个标志以暂停处理直到特定时间。
另一种选择是实现一个监控服务,当这些问题发生时删除服务,这实际上会产生您期望的相同效果,但可能比仅在代码中实现更复杂,因为您必须在服务消费消息,监视器会监听这些事件,然后联系 SF 关闭服务,稍后,您还必须重新创建服务以继续处理,除非您确实需要节省分配给服务的资源,与在役处理相比,这并没有带来太多好处。
这完全取决于它需要有多复杂。
推荐阅读
- sql-server - 如何使用 SQL Server 获取 Join 中的所有值?
- python - 过滤掉 NOT isin 中的字典
- ios - TypeError: undefined is not an object (evalating '_globalThis.crypto.subtle.digest') react-native ios
- scala - 学习火花:哪里不起作用的例子
- python - 如何在Python中通过自身的关键字搜索列表项
- html - 如何将此箭头图标向下移动一点等于成员
- mysql - 求和并仅标记最接近 MySQL 中控制值的值
- python - 熊猫根据条件从列值创建列表
- node.js - nodemon 应用程序崩溃 - 在开始之前等待文件更改......如何修复它?
- databricks - 有没有一种方法可以在 Databricks 中描述 Key Vault 支持的范围,以了解它指向哪个 Key Vault?