【问题标题】:Task processing status with a message queue带有消息队列的任务处理状态
【发布时间】:2012-03-15 20:06:24
【问题描述】:

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

  • 是否已完成给定的批量导入?
  • 对于给定的批量导入,还剩下多少个单独的导入?
  • 完成了多少个单独的导入?
  • 有多少是错误的?

有哪些最佳做法或建议的方法可以支持这些查询并仍然利用消息队列系统来实现弹性?目前,将这一切联系在一起的是上面提到的令牌,但是没有明确的记录来表示批量导入请求实体,如果有,那么单独的导入请求处理器需要知道这样的实体才能更新相应的状态。

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

【问题讨论】:

    标签: c# .net wcf nservicebus


    【解决方案1】:

    这可以实现为NServiceBus SagaImportProductsCommand 应该由 Saga(ImportProductsSaga) 处理,并且 Saga 数据可以在发送 ImportProductCommand 时包含要导入的产品数量。 ImportProductsSaga 应该处理 ProductImportedEventProductImportFailedEvent。在 ImportProductsSaga 中处理的每个事件中,递增 ProductsImportedProdctsFailedToImport。还要检查 (ProductsImported + ProdctsFailedToImport) 的总和是否等于 ProdctsToBeImported,如果是,则完成 saga。

    ImportProductsSaga 数据需要跟踪 ImportProductCommand 发送的 No 和收到的回复,您可以计算待处理的回复等。 Saga 数据如下所示:

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

    【讨论】:

    • 这看起来是一个很好的解决方案!我考虑过使用 saga,但认为它们更适用于具有不同消息类型的场景。您的示例以新的视角看待问题。
    • 我没有使用 saga 方法来跟踪导入状态。但是,我还将整个导入存储为 saga 实体存储之外的实体以用于报告目的,因为除其他外,默认 saga 存储会在完成时删除 saga 数据。
    • 我记得 Udi 在一些谈话中提到,你不需要完成 Saga(这会将它从商店中删除),你可以将它留在商店中用于报告目的。
    • 谢谢,很高兴知道这是一种公认​​的做法。我认为完成圣人可能是一项要求。
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2015-12-16
    • 2017-11-01
    • 2020-06-26
    • 2018-07-13
    • 2020-01-31
    相关资源
    最近更新 更多