C# 具有消息队列的任务处理状态
我正在开发一个产品数据导入系统,该系统从外部源下载产品数据,将其转换为适当的模式,并存储结果——本质上是一个ETL系统。系统处理的消息的核心类型是“ImportProductCommand”,它指定要导入的产品和源。但是,导入命令很少单独发送。典型的业务需求是从给定来源导入一整套产品。目前,这表示为“ImportProductsCommand”消息,该消息可以指定要导入的多个产品。命令处理程序使用此消息,将其转换为单个“ImportProductCommand”消息,并将其发送到队列进行处理。单个导入请求的使用者发布“ProductImportedEvent”或“ProductImportFailedEvent”。当收到“ImportProductsCommand”消息时,服务将为消息分配GUID令牌,将消息放置在队列中,然后返回令牌。然后将令牌用作关联ID,以便各个导入请求可以与批导入请求关联。给定此基础结构,可以确定与给定令牌关联的事件数,从而确定导入产品或导入失败的数量。缺少的是一个显式事件,指示批导入已完成。单个导入请求的处理程序并不明确知道它是批导入请求的一部分。当然,这可以通过知道要导入多少产品以及计算与特定关联ID关联的导入事件的数量来推断。当前的实现利用消息队列系统来处理进程重启和失败,但对批导入请求的定义不太明确。总的来说,系统需要回答的问题有:C# 具有消息队列的任务处理状态,c#,.net,wcf,nservicebus,C#,.net,Wcf,Nservicebus,我正在开发一个产品数据导入系统,该系统从外部源下载产品数据,将其转换为适当的模式,并存储结果——本质上是一个ETL系统。系统处理的消息的核心类型是“ImportProductCommand”,它指定要导入的产品和源。但是,导入命令很少单独发送。典型的业务需求是从给定来源导入一整套产品。目前,这表示为“ImportProductsCommand”消息,该消息可以指定要导入的多个产品。命令处理程序使用此消息,将其转换为单个“ImportProductCommand”消息,并将其发送到队列进行处理。单
- 是否完成了给定的批量导入
- 对于给定的批量导入,还有多少个单独的导入
- 完成了多少个单独的导入李>
- 有多少是错误的李>
所有这些都是使用C#、NServiceBus实现的,并作为iiswcf应用程序托管 这可以实现为IMPORTPRODUCTSCOMAND应由Saga(ImportProductsSaga)处理,Saga数据可以在发送ImportProductCommand时包含要导入的产品计数ImportProductsSaga应处理ProductImportedEvent和ProductImportFailedEvent。在导入产品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(这会将其从存储中删除),您可以将其保留在商店中以供报告之用。谢谢,很高兴知道这是一种公认的做法。我认为完成圣人可能是一项要求。