C# 如何避免在ServiceFabric托管服务中重复后台任务处理?
很抱歉标题含糊不清,很难解释。我有以下设置:C# 如何避免在ServiceFabric托管服务中重复后台任务处理?,c#,.net,azure-service-fabric,ihostedservice,C#,.net,Azure Service Fabric,Ihostedservice,很抱歉标题含糊不清,很难解释。我有以下设置: 我正在运行一个托管在ServiceFabric中的.NETCore2.2WebAPI 此API的部分职责是监视外部FTP存储中的新传入文件 每个文件都将触发一个中介命令,以使用处理逻辑进行调用 我已经实现了一个基于和的混合解决方案。本质上,这是一个在该API的Startup.cs中注册的IHostedService实现。它基本上是一个运行在进程中的后台服务 至于这个问题。上述解决方案在单节点集群上运行良好,但在5节点集群上运行时会导致处理“重复”
- 我正在运行一个托管在ServiceFabric中的.NETCore2.2WebAPI
- 此API的部分职责是监视外部FTP存储中的新传入文件
- 每个文件都将触发一个中介
,以使用处理逻辑进行调用命令
- 我已经实现了一个基于和的混合解决方案。本质上,这是一个在该API的
中注册的Startup.cs
实现。它基本上是一个运行在进程中的后台服务IHostedService
scheduledtask
正在运行,它们将同时访问FTP上的同一文件
我意识到这在某种程度上是由不恰当的关注点分离造成的——也就是说,API不应该对此负责,而应该由一个完全独立的过程来处理
这就引出了服务结构上支持的不同服务(有状态、无状态、参与者和托管的Guest-Exe)。Actor
似乎是唯一运行单线程的,即使在5节点集群上也是如此。此外,Actor
似乎不太适合这种场景,因为它需要被触发。在我的例子中,我基本上需要一个始终按计划运行的守护进程。如果我没有弄错的话,其他有状态/无状态服务也将使用5个“克隆”运行,并且只会引起与我当前相同的问题
我想我的问题是:如何使用Service Fabric进行高效的后台处理并避免这些多线程/重复问题?提前感谢您的任何意见。在farbic服务中,您有两个演员选项:
public void Method()
{
_ftpService.Process(file);
}
public void Method(int fileId)
{
if (_ftpService.IsNotProcessed(fileId))
{
_ftpService.Process(file);
_ftpService.SetProcessed(fileId);
}
}
考虑这样做:
public void Method()
{
_ftpService.Process(file);
}
public void Method(int fileId)
{
if (_ftpService.IsNotProcessed(fileId))
{
_ftpService.Process(file);
_ftpService.SetProcessed(fileId);
}
}
如果您的参与者在处理时遇到问题,您可能需要检查您是否在代码中处理CancelationToken。我从来没有遇到过这个问题,但我们正在使用autofac,使用来向RegisterActor()
注册我们的参与者,并且我们在大多数逻辑中都有CancelationToken。另外,的文档也可以帮助您。
范例
嗨,Preben,我有一个基于你链接的文章的POC,但是演员有时会在处理自己时遇到问题,并被“卡住”,此时我必须删除服务并重新启动节点。。。另外,你能详细说明一下“再出神”部分吗?谢谢,我来看看这个!