【问题标题】:How command id differs from infrastructure message id?命令 ID 与基础设施消息 ID 有何不同?
【发布时间】:2018-09-21 13:20:21
【问题描述】:

我正在考虑与 CQRS 有一点关联的东西。有一个模式请求 - 回复。在 HTTP 传输到标头的示例中,我们将 Request-Id 至少用于跟踪目的。在我的例子中,不同微服务之间的监控。如果传入请求包含它,则对 Correlation-Id 标头进行重写。我认为这是在传输层(基础设施)上完成的。问题是是否应该从业务层(例如,直接从我们正在执行的命令)传递 Request-Id(有时称为 Message-Id) - 一些机械师会自动神奇地做到这一点 - 就像 ICommand 要求 Id 存在? 还是仅存在于基础设施层(传输)中的完全不同的东西?如果是,那么如何将传输 ID 与业务命令 ID 相关联?至少一个日志/跟踪/跟踪的东西必须与两个标识符一起放置?有没有我错过的模式?此外,您认为 CorrelationId 应该在业务指挥中使用什么?

【问题讨论】:

    标签: events command microservices correlation cqrs


    【解决方案1】:

    恕我直言,相关 id、因果 id、请求 id、消息 id 等概念属于基础设施层,因为它们不是业务规则的一部分。

    但是,我已将 metadata 属性添加到我的 CommandEvent 对象中以保存有助于我管理的此类信息命令与事件之间的相关性和因果关系。

    通过以关联数组(哈希映射、字典或任何键值格式)的形式使用此 元数据 属性,您可以打开代码以将您可能需要的任何跟踪信息保存在未来不会过多地污染您的应用程序和域层。

    【讨论】:

    • 我完全同意在基础设施层中拥有这种类型的“元数据”。但是,我认为它们不应该包含在消息中。在我的例子中,它们被打包在一个单独的对象中,该对象与正在处理的消息是分开的。事件和命令处理程序总是接收它。 Sagas 使用这些信息来路由命令。聚合不会收到任何消息,因为它们不知道消息传递概念的存在。通过这种方式,我们将域与恰好使用消息传递层的实现隔离开来。
    • 完全同意你的定义。我想用一些伪代码来扩展我的答案,使其更具代表性
    • @mgonzalezbaile 那太好了!
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 2017-02-03
    • 2016-04-26
    • 1970-01-01
    • 2023-03-20
    • 2018-04-27
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多