domain-driven-design - ES/DDD 微服务中的报告

我刚开始使用 ES/DDD,我有一个问题,应该如何在此架构中进行报告。让我们举一个典型的例子,您有一个客户聚合、订单聚合和产品聚合,它们都是独立的。

现在,如果我想跨所有 3 个聚合和/或服务运行查询,但每个数据都在一个单独的数据库中,可能一个是 SQL,一个是 MongoDB,还有一个是其他的。人们应该如何设计或能够运行需要跨这些聚合进行联接的查询?

最佳答案

您应该将Reporting设计为一个简单的read-model/projection,可能在它自己的bounded context中(BC),它只是从其他限界上下文(Customer BCOrdering BCInventory BC)中监听相关的events ) 并构建具有完整数据非规范化的所需报告(即在查询时您不需要查询原始来源)。

由于事件,您不需要任何连接,因为您可以维护一个附加到Reporting read-model 的私有(private)本地状态,您可以在其中存储临时外部模型并根据需要查询这些临时读取模型,从而避免对其他 BC 进行外部额外查询。

在这种情况下,不需要反腐败层,因为 Reporting BC 中不涉及写入模型。

事情真的就这么简单,因为您已经有了一个事件驱动的架构(您使用了Event sourcing)。

更新:

这个特殊的解决方案对于创建您事先没有想到的新报告非常方便。每次你想到一个新报告时,你只需创建一个新的读取模型(就像你编写它的源代码一样),然后你重播它上面的所有相关事件。读取模型没有副作用,您可以随时重播所有事件(从时间开始)。

读取模型重建在两种情况下完成:

  1. 你创建了一个新的阅读模型
  2. 您通过监听新事件或算法与初始版本差异太大来修改现有版本

您可以在这里阅读更多内容:

  1. DDD/CQRS specialized forum - Grey Young is there!
  2. Event sourcing applied – the read model
  3. Writing an Event-Sourced CQRS Read Model
  4. A post in first group describing Read Model rebuilding

或者您可以使用以下文本进行搜索:event sourcing projection rebuilding

https://stackoverflow.com/questions/43600930/

相关文章:

python - 一种不必每次都在 colorama 中重置颜色/样式的方法

c# - Unity Particle Collider 与粒子

php - 从当前日期时间生成唯一的交易 ID

python-3.x - python3 中 f2py 的 Makefile

angular - HTML5 Websql - 如何与 Ionic 3 和 Angular 4 一

arrays - Swagger 的对象数组

sql - 在 SQL Server 中将所有表数据类型从文本更改为 varchar

vim - 将行合并到 vim 中的段落

php - Laravel Eloquent : route model binding not w

perl - 在 Perl 中打印哈希值