实现这种最终一致性的良好做法
Good practice to achieve this eventual consistency
在我的应用程序中,当创建用户时,会抛出一个名为 UserCreatedEvent
的事件。
此用户必须从 Facebook 检索他的所有描述数据(当然需要他的授权)并且应该由一些自定义过程处理。
我选择在保存用户聚合的事实和检索他的所有描述数据并应用它们的事实之间应用最终一致性(使用 Akka 和他的 eventStream 特性来处理事件),因为它涉及到一些调用网络Facebook。
关键是我还允许任何新创建的用户通过 REST api PUT /api/users/:id
覆盖一些描述(工作、年龄等)。
1) 处理 UserCreatedEvent
(基本上是 Akka actor)的过程是否应该调用这个 api(导致间接)来分配默认用户描述(来自 Facebook)或者它应该检索和更新用户本身?
2) 处理 UserCreatedEvent
的过程和旨在管理用户 (CRUD) 的 api 是否应该属于同一个限界上下文? (在那种情况下,不建议涉及间接)。
我不确定我是否会称其为最终一致性,因为一致性(确保实体尊重不变量)并不重要。这更像是带外异步数据完成。
这个辅助过程必须再次经历什么,基本上取决于您的上下文:
REST API 如果有重要的东西要重新应用(日志记录、安全性等)
应用程序服务/命令处理层,如果您希望数据完成被视为经过适当验证的全面修改(例如,Facebook return 数据在您的应用程序中不受支持?)
在域层中,您可以将其建模为 User
的任何其他修改,或者作为特定的、可能更能揭示意图的操作:User.completeDescriptionData(...)
我不一定要把它放在不同的限界上下文中,因为它没有引入用户的新定义。重要的是,知道与 Facebook 交谈的细节的部分位于单独的非域层中。
在我的应用程序中,当创建用户时,会抛出一个名为 UserCreatedEvent
的事件。
此用户必须从 Facebook 检索他的所有描述数据(当然需要他的授权)并且应该由一些自定义过程处理。
我选择在保存用户聚合的事实和检索他的所有描述数据并应用它们的事实之间应用最终一致性(使用 Akka 和他的 eventStream 特性来处理事件),因为它涉及到一些调用网络Facebook。
关键是我还允许任何新创建的用户通过 REST api PUT /api/users/:id
覆盖一些描述(工作、年龄等)。
1) 处理 UserCreatedEvent
(基本上是 Akka actor)的过程是否应该调用这个 api(导致间接)来分配默认用户描述(来自 Facebook)或者它应该检索和更新用户本身?
2) 处理 UserCreatedEvent
的过程和旨在管理用户 (CRUD) 的 api 是否应该属于同一个限界上下文? (在那种情况下,不建议涉及间接)。
我不确定我是否会称其为最终一致性,因为一致性(确保实体尊重不变量)并不重要。这更像是带外异步数据完成。
这个辅助过程必须再次经历什么,基本上取决于您的上下文:
REST API 如果有重要的东西要重新应用(日志记录、安全性等)
应用程序服务/命令处理层,如果您希望数据完成被视为经过适当验证的全面修改(例如,Facebook return 数据在您的应用程序中不受支持?)
在域层中,您可以将其建模为
User
的任何其他修改,或者作为特定的、可能更能揭示意图的操作:User.completeDescriptionData(...)
我不一定要把它放在不同的限界上下文中,因为它没有引入用户的新定义。重要的是,知道与 Facebook 交谈的细节的部分位于单独的非域层中。