抱歉标题含糊不清,很难解释。我有以下设置:
- 我正在运行托管在 Service Fabric 中的 .NET Core 2.2 Web API。
- 此 API 的部分职责是监视外部 FTP 存储中是否有新的传入文件。
- 每个文件都会触发一个 Mediator
Command
来调用处理逻辑。 - 我已经实现了一个基于https://docs.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice和https://docs.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice 的混合解决方案:/ /blog.maartenballiauw.be/post/2017/08/01/building-a-scheduled-cache-updater-in-aspnet-core-2.html。本质上,这是在此 API
IHostedService
中注册的实现。Startup.cs
它基本上是一个在进程中运行的后台服务。
至于问题。上述解决方案在 1 节点集群上运行良好,但在 5 节点集群上运行时会导致处理“重复”。问题在于,在一个 5 节点集群上,当然有 5 个相同ScheduledTasks
的运行,并且都将同时访问FTP上的同一个文件。
我已经意识到这在某种程度上是由于关注点分离不当造成的——也就是 API 不应该对此负责,而是应该由一个完全独立的进程来处理这个问题。
这让我想到了 Service Fabric 支持的不同服务(有状态、无状态、Actor 和 Hosted Guest Exe)。Actor
似乎是唯一一个运行单线程的,即使在 5 节点集群上也是如此。此外, anActor
似乎不太适合这种情况,因为它需要被触发。就我而言,我基本上需要一个按计划一直运行的守护进程。如果我没记错的话,其他有状态/无状态服务也将使用 5 个“克隆”运行,并且只会导致与我目前遇到的相同问题。
我想我的问题是:如何使用Service Fabric进行高效的后台处理并避免这些多线程/重复问题?提前感谢您的任何意见。