【问题标题】:Designing Leaderboard Scores in DDD在 DDD 中设计排行榜分数
【发布时间】:2022-01-21 03:13:44
【问题描述】:

围绕这个问题有两个实体,主要是

  1. 排行榜 - 包含关于类型(最低优先/最高优先)、描述、名称等的信息。
  2. Score - 玩家提交的得分值,其中包含玩家详细信息和得分值

用例:

  1. 我们需要获取前 10 名的得分
  2. 对于每月排行榜,我们需要找到前 3 名

域规则:

  1. 玩家可以提交任意数量的分数
  2. 排行榜排名需要基于排行榜中定义的类型(最低/最高)

对于这样的系统

  1. 排行榜和分数是一对多的关系
  2. 分数需要有关于玩家信息的信息(这是一个单独的聚合根,在不同的边界上下文中)

如何在 DDD 中设计?

场景 1: 排行榜是否将是聚合根并通过排行榜聚合根添加分数(对于每个分数)?

查询:

  1. 在这里,没有排行榜,分数没有意义,也没有域规则坚持通过排行榜聚合根添加分数。这实际上是一个两难境地,如何处理?

  2. 如何获取玩家详细信息以输入分数?我是否需要在域服务中获取玩家详细信息并在添加分数时提供排行榜聚合根?

场景 2: Leaderboard 和 LeaderboardScore 是两个不同的聚合根。

查询:

  1. 在计算排名时,我们需要从分数聚合根中获取分数并从排行榜中输入信息并完成用例?

  2. 这里大部分用例服务代码需要在域服务或应用服务中?

【问题讨论】:

    标签: microservices domain-driven-design ddd-service dddd domain-data-modelling


    【解决方案1】:

    我会用分数和排行榜作为它们自己的聚合来处理它。分数更改会发布域事件(异步,因为最终的一致性可能没问题)以更新排行榜。

    【讨论】:

    • 何时何地计算排名?
    • 排行榜保持自己对分数的看法(最终保持一致)。
    • 排行榜保留前 10 名分数的列表。当收到新的分数事件时,排行榜会检查它是否高于(或低于)前 9 个分数中的任何一个。如果是,则将其他分数向下推并丢弃第 11 个,如果不是,则忽略它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2022-01-01
    • 2018-07-18
    • 2016-08-14
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多