Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有消息队列的任务处理状态_C#_.net_Wcf_Nservicebus - Fatal编程技术网

C# 具有消息队列的任务处理状态

C# 具有消息队列的任务处理状态,c#,.net,wcf,nservicebus,C#,.net,Wcf,Nservicebus,我正在开发一个产品数据导入系统,该系统从外部源下载产品数据,将其转换为适当的模式,并存储结果——本质上是一个ETL系统。系统处理的消息的核心类型是“ImportProductCommand”,它指定要导入的产品和源。但是,导入命令很少单独发送。典型的业务需求是从给定来源导入一整套产品。目前,这表示为“ImportProductsCommand”消息,该消息可以指定要导入的多个产品。命令处理程序使用此消息,将其转换为单个“ImportProductCommand”消息,并将其发送到队列进行处理。单

我正在开发一个产品数据导入系统,该系统从外部源下载产品数据,将其转换为适当的模式,并存储结果——本质上是一个ETL系统。系统处理的消息的核心类型是“ImportProductCommand”,它指定要导入的产品和源。但是,导入命令很少单独发送。典型的业务需求是从给定来源导入一整套产品。目前,这表示为“ImportProductsCommand”消息,该消息可以指定要导入的多个产品。命令处理程序使用此消息,将其转换为单个“ImportProductCommand”消息,并将其发送到队列进行处理。单个导入请求的使用者发布“ProductImportedEvent”或“ProductImportFailedEvent”。当收到“ImportProductsCommand”消息时,服务将为消息分配GUID令牌,将消息放置在队列中,然后返回令牌。然后将令牌用作关联ID,以便各个导入请求可以与批导入请求关联。给定此基础结构,可以确定与给定令牌关联的事件数,从而确定导入产品或导入失败的数量。缺少的是一个显式事件,指示批导入已完成。单个导入请求的处理程序并不明确知道它是批导入请求的一部分。当然,这可以通过知道要导入多少产品以及计算与特定关联ID关联的导入事件的数量来推断。当前的实现利用消息队列系统来处理进程重启和失败,但对批导入请求的定义不太明确。总的来说,系统需要回答的问题有:

  • 是否完成了给定的批量导入
  • 对于给定的批量导入,还有多少个单独的导入
  • 完成了多少个单独的导入
  • 有多少是错误的
有哪些最佳实践或建议的方法可以支持这些查询并仍然利用消息队列系统实现恢复能力?目前,将其联系在一起的是上面提到的令牌,但是没有明确的记录来表示批量导入请求实体,如果有,则单个导入请求处理者需要知道这样一个实体以相应地更新状态


所有这些都是使用C#、NServiceBus实现的,并作为iiswcf应用程序托管

这可以实现为IMPORTPRODUCTSCOMAND应由Saga(ImportProductsSaga)处理,Saga数据可以在发送ImportProductCommand时包含要导入的产品计数ImportProductsSaga应处理ProductImportedEventProductImportFailedEvent。在导入产品SAGA中处理的每个事件上,递增导入的产品或导入的产品失败。同时检查(ProductsImported+ProdctsFailedToImport)与ProdctsToBeImported之和,如果是,则完成该系列

ImportProductsSaga数据需要跟踪ImportProductCommand send和reply REVERY的编号,您可以计算待处理的reply等。 传奇数据如下所示,例如:

   public class ImportProductsSataData{ 
       public Guid Id {get; set}
       public int ProdctsToBeImported {get; set}
       public int ProdctsImported {get; set}
       public int ProdctsFailedToImport {get; set}
}

这看起来是一个很好的解决方案!我考虑过使用sagas,但认为它们更适用于具有不同消息类型的场景。你的例子把问题放在了一个新的角度。我不同意用saga方法来跟踪进口的状态。但是,我也将整个导入作为一个实体存储在saga实体存储之外,用于报告目的,因为默认的saga存储会在完成时删除saga数据。我记得Udi在一些谈话中提到,您不需要完成saga(这会将其从存储中删除),您可以将其保留在商店中以供报告之用。谢谢,很高兴知道这是一种公认的做法。我认为完成圣人可能是一项要求。