【问题标题】:CQRS where to store statistics that are used by other BC'sCQRS 在哪里存储其他 BC 使用的统计信息
【发布时间】:2017-10-09 18:29:05
【问题描述】:

在我们当前的应用程序中,用户需要能够查看其帐户中的某些统计信息。这些数据以事件的形式来自不同的有界上下文。它们通常由计数器组成,例如跟踪的总距离。一些用户绑定的统计信息也用于报告和图表。我的问题是在哪里存储用户绑定的统计信息。比如,它们是域模型(用户聚合)的一部分吗?还是它们只是最终在多个地方更新的物化视图?

因此,使用物化视图进行可视化:

                                        /-> [User View updater]
[BC1] --> SomeInterestingToCountEvent1 <
                                        \-> [Report View updater]

                                        /-> [User View updater]
[BC2] --> SomeInterestingToCountEvent2 <
                                        \-> [Report View updater]

或者通过 f.e.用户中的 Stats 值对象:

[BC1] --> SomeInterestingToCountEvent1 ---> [User Saga: update Stats]
[BC2] --> SomeInterestingToCountEvent2 ---> [User Saga: update Stats]

                                        /-> [User View updater]
[User BC] --> UserStatsUpdatedEvent    <
                                        \-> [Report View updater]

【问题讨论】:

    标签: architecture domain-driven-design cqrs


    【解决方案1】:

    在我们当前的应用程序中,用户需要能够查看其帐户中的某些统计信息。这些数据以事件的形式来自不同的有界上下文。

    因此,您可能希望从复合 UI 的角度进行思考

    我的问题是在哪里存储用户绑定的统计信息。比如,它们是域模型(用户聚合)的一部分吗?还是它们只是最终在多个地方更新的物化视图?

    您可能希望将它们视为一个或多个物化视图。

    【讨论】:

    • 谢谢!好吧,我的问题有点复杂。我无法拆分 UI,因为计数器用于对列表中的对象进行排序。
    • 在 OP 中查看我的编辑
    【解决方案2】:

    由附加到任何相关事件的侦听器生成和更新的实体化视图。

    【讨论】:

    • 但这不是更容易吗,因为有 多个 统计视图(图表,总计)基于来自其他 BC 的相同事实,让传奇更新用户的统计信息?这最终会导致UserStatsUpdatedEvent,因此可以基于这些事件进行多个视图并查询用户服务(届时该服务已与新计数器保持同步)。
    • 你当然可以,但是如果你使用一个事件: - saga 不知道统计数据,所以统计要求的变化不会影响 saga 的设计 - 如果事件被发送一个队列,您可以在不同的节点上使用处理程序来更新统计信息 - 这会更有效率。
    • 我认为反对使用 saga 的另一个论点是,每当更改统计值时,它都会导致 UserStatsUpdated 事件。这将隐式增加用户的交易足迹。
    • 我想补充的唯一警告是 - 您需要非常小心事件顺序和重复,特别是如果您使用不保证单次交付的事件总线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多