【发布时间】:2012-03-15 20:06:24
【问题描述】:
我正在开发一个产品数据导入系统,该系统从外部来源下载产品数据,将其转换为适当的架构,并存储结果 - 本质上是一个 ETL 系统。系统处理的核心消息类型是“ImportProductCommand”,它指定要导入的产品和来源。然而,导入命令很少单独发送。一个典型的业务需求是从给定来源导入一整套产品。目前,这表示为“ImportProductsCommand”消息,可以指定要导入的多个产品。命令处理程序使用此消息,将其转换为单独的“ImportProductCommand”消息并将它们发送到队列进行处理。单个导入请求的消费者发布“ProductImportedEvent”或“ProductImportFailedEvent”。当收到“ImportProductsCommand”消息时,服务会为该消息分配一个 GUID 令牌,将消息放在队列中,然后返回该令牌。然后将该令牌用作关联 ID,以便可以将单个导入请求与批量导入请求相关联。鉴于此基础设施,可以确定与给定令牌相关的事件数量,从而确定进口产品或失败进口的数量。缺少的是指示批量导入已完成的显式事件。单个导入请求的处理程序没有明确知道它是批量导入请求的一部分。这当然可以通过知道要导入多少产品并通过计算与特定关联 ID 关联的导入事件的数量来推断。当前的实现利用消息队列系统来处理进程重启和失败,但对批量导入请求不太明确。总的来说,系统需要回答的查询是:
- 是否已完成给定的批量导入?
- 对于给定的批量导入,还剩下多少个单独的导入?
- 完成了多少个单独的导入?
- 有多少是错误的?
有哪些最佳做法或建议的方法可以支持这些查询并仍然利用消息队列系统来实现弹性?目前,将这一切联系在一起的是上面提到的令牌,但是没有明确的记录来表示批量导入请求实体,如果有,那么单独的导入请求处理器需要知道这样的实体才能更新相应的状态。
所有这些都是使用 C#、NServiceBus 实现的,并作为 IIS WCF 应用程序托管。
【问题讨论】:
标签: c# .net wcf nservicebus