gpt4 book ai didi

azure - 在 Service Fabric 中删除服务的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 01:07:27 25 4
gpt4 key购买 nike

我有一个在服务结构中运行的应用程序。组成应用程序的服务之一是仅具有 run 方法的有状态服务。它查询其他服务,进行一些记录保存,然后生成输出。成功完成工作后,它将输出保存到 Blob 存储,然后删除自身。我将其用于围绕报告的按需弹性计算。

如果我调用 ServiceManager 服务来删除服务本身,它会出现死锁。这对我来说很有意义,因为调用可能会在返回调用者之前等待 run 方法完成(在这种情况下,调用者位于 run 方法本身中,因此它实际上正在等待自身)。我的下一个方法是基本上忽略异步删除服务的任务,如下所示:

protected override async Task RunAsync(CancellationToken can)
{

//do work as described above

Task ignored = Task.Factory.Run(async ()=>{
await s_FabricClient.ServiceManager.DeleteServiceAsync(/*blah blah*/);
}
await Task.Delay(30000);
}

当我知道在任何情况下都应该删除服务时,删除服务的适当方法是什么。我想避免使用跟踪这些事情的“管理器”服务,因为现在它们非常独立。

最佳答案

所以我找到的唯一解决方案如下:

之前,我使用的是已弃用的DeleteServiceAsync (Uri) 覆盖。当我看到这个警告时(不好意思说我有一段时间没有检查警告了)。我转换为 DeleteServiceAsync(Delete​Service​Description) 重载,它有一个名为 ForceDelete 的属性。这基本上不会给服务一个正常关闭的机会。由于服务本身正在发出请求,并且我知道此时我的服务已完成工作,因此我可以安全地调用它。

这可能不是每个用例的最终解决方案,但考虑到我的要求,这似乎是合理的。

s_FabricClient.DeleteServiceAsync(new Uri("fabric:/myapp/myservice/instance123"));

现在是:

Uri serviceUri = new Uri("fabric:/myapp/myservice/instance123");
DeleteServiceDescription description = new DeleteServiceDescription(serviceUri)
{
ForceDelete = true
};
s_FabricClient.DeleteServiceAsync(description);

关于azure - 在 Service Fabric 中删除服务的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44415434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com