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
    实现。它基本上是一个运行在进程中的后台服务
至于这个问题。上述解决方案在单节点集群上运行良好,但在5节点集群上运行时会导致处理“重复”。问题在于,在一个5节点集群上,当然有5个相同的
scheduledtask
正在运行,它们将同时访问FTP上的同一文件

我意识到这在某种程度上是由不恰当的关注点分离造成的——也就是说,API不应该对此负责,而应该由一个完全独立的过程来处理

这就引出了服务结构上支持的不同服务(有状态、无状态、参与者和托管的Guest-Exe)。
Actor
似乎是唯一运行单线程的,即使在5节点集群上也是如此。此外,
Actor
似乎不太适合这种场景,因为它需要被触发。在我的例子中,我基本上需要一个始终按计划运行的守护进程。如果我没有弄错的话,其他有状态/无状态服务也将使用5个“克隆”运行,并且只会引起与我当前相同的问题


我想我的问题是:如何使用Service Fabric进行高效的后台处理并避免这些多线程/重复问题?提前感谢您的任何意见。

在farbic服务中,您有两个演员选项:

您可以使用状态来确定参与者是否已处理您的ftp文件

看看,看看他们是如何使用提醒每30秒运行一次的

actor中的代码必须允许。 基本上,因为参与者是可靠的,您的代码可能会多次执行,并在执行过程中被取消。

而不是这样做:

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,但是演员有时会在处理自己时遇到问题,并被“卡住”,此时我必须删除服务并重新启动节点。。。另外,你能详细说明一下“再出神”部分吗?谢谢,我来看看这个!