在 azure 服务结构中的有状态服务上运行计划的后台作业,以按计划时间更新可靠字典中的一些数据
Posted
技术标签:
【中文标题】在 azure 服务结构中的有状态服务上运行计划的后台作业,以按计划时间更新可靠字典中的一些数据【英文标题】:Run scheduled background job on stateful service in azure service fabric to update some data in Reliable Dictionary on schedule time 【发布时间】:2021-08-27 00:33:00 【问题描述】:是否可以在 azure service fabric 中的有状态服务上运行预定的后台作业?我发现的唯一方法是它们在 Actors 上运行的计时器和提醒,而不是有状态的服务。我正在尝试运行预定的后台作业来清理 Reliable 字典中的一些数据。
【问题讨论】:
你看到这个问题了吗? ***.com/a/63773542/5946937 @LoekD,我使用的是有状态服务而不是 Actors,所以 Actors 提醒和计时器在这种情况下不适用于我们。至于 RunAsync 我读到它需要尽快存在,这样它就不会锁定 Reliable 集合。因此不确定是否在无限循环中添加线程睡眠或 task.delay 是否会导致运行时出现任何问题,因为我们仍然需要为 API 客户端使用该服务的侦听器。我弄错了吗? 你试过使用默认的IHostedService方式吗?所以在你的主机上注册这个后台任务。 【参考方案1】:在 Service Fabric 中运行后台作业的推荐方法是简单地覆盖 RunAsync
操作。这对于有状态和无状态服务同样适用——尽管如前所述,Actors
提供了一些额外的功能,内置了对提醒和计时器的支持。
下面是一个非常基本的例子
public async Task RunAsync(CancellationToken cancellationToken)
// do something
var nextWakeup = TimeSpan.FromHours(1);
await Task.Delay(nextWakeup, cancellationToken);
如果您需要更复杂的内容,例如,您可以增强上述内容以使用IReliableStateManager
来管理您自己的提醒集合。
【讨论】:
如果它访问与用户调用相同的 Reliable 集合,是否会导致任何问题或锁定?所以在示例中,我试图删除 RunAsync 中的某些内容,并且用户使用服务远程处理调用相同的集合来执行某些操作?我指的是 Microsoft 文档 (docs.microsoft.com/en-us/azure/service-fabric/…) 中的警告 有状态服务中的可靠集合是线程安全的,专为多线程使用而设计——它还支持事务。 RunAsync 专为长时间运行的后台任务而设计,因此您的用例很好。我建议你看看Working with reliable collections。 另外,请注意,如果您有无限循环,按照上面的示例,请确保您检查并使用取消令牌提前突破。这可确保 Service Fabric 可以根据设计终止并重新创建您的服务(例如,将其重新定位到另一个节点等)。以上是关于在 azure 服务结构中的有状态服务上运行计划的后台作业,以按计划时间更新可靠字典中的一些数据的主要内容,如果未能解决你的问题,请参考以下文章
如何访问 Azure Service Fabric 有状态/无状态服务中的 settings.xml?