Asp.net core 简单作业处理器的两个实例中没有重复工作

Asp.net core 简单作业处理器的两个实例中没有重复工作,asp.net-core,.net-core,batch-processing,jobs,job-scheduling,Asp.net Core,.net Core,Batch Processing,Jobs,Job Scheduling,我有一个web应用程序(Asp.net Core 2.0)和一个简单的作业处理器(.net Core 2.0),如下所示 我的web应用程序将向数据库添加作业,处理器将每5分钟获取一次作业,并执行一些逻辑操作 我将处理器包装在docker中,部署并运行在两台服务器上(有两个实例) 有什么解决方案可以确保这里没有重复工作?我希望两个实例同时处于活动状态 简单作业处理器 while (true) { Console.WriteLine("Background worker is runnin

我有一个web应用程序(Asp.net Core 2.0)和一个简单的作业处理器(.net Core 2.0),如下所示

我的web应用程序将向数据库添加作业,处理器将每5分钟获取一次作业,并执行一些逻辑操作

我将处理器包装在docker中,部署并运行在两台服务器上(有两个实例)

有什么解决方案可以确保这里没有重复工作?我希望两个实例同时处于活动状态

简单作业处理器

while (true)
{
    Console.WriteLine("Background worker is running");

    //Query job from table job  

    if (DateTime.UtcNow < job.ExpiredAt)
    {
        //Call external REST API

        //Do something
    }

    Console.WriteLine($"Background worker is delayed for 5 minutes\r\n");
    Task.Delay(JobInterval * 60 * 1000).Wait();
};
while(true)
{
Console.WriteLine(“后台工作程序正在运行”);
//从表作业查询作业
if(DateTime.UtcNow
你需要一些东西来协调你的员工。您不能只让多个实例在同一个池中抓取,并将事情分开,而不存在重复工作。并发将吃掉你的午餐。相反,应该有一个协调节点将任务分配给其他节点。这是处理此问题的唯一方法。

我正在考虑添加另一个表,用于检查活动作业处理器,而非活动作业处理器将不起任何作用。如果活动处理器有一段时间不工作,另一个将启动。这样可以吗?关于你的解决方案,你能给我一个例子或者一些关于如何在.NETCore中实现它的东西吗?没有一种方法。通常,这本质上是一个服务中心或消息队列。Azure有一个现成的解决方案。不过,您也可以使用RabbitMQ之类的工具。就我个人而言,我会选择更方便的方式,只使用现有的作业处理解决方案,如Hangfire。不需要重新发明轮子。