通过引入共享微服务确保状态一致性?
Ensure state consistency by introducing a shared microservice?
假设我在不同的微服务中有 2 个实体(聚合根)。
- 报告(id,状态 = 已打开 | in_progress | 已处理 | 已关闭,follow_up(自定义表单答案),调查(自定义表单答案),...)
- 检查(id, form_answers, ...)
我需要添加在这些实体的生命周期内填写自定义(动态)表单的可能性。
表格由用户创建,不能填写检查中的报告特定表格,反之亦然。
这些实体中的表单结构(字段类型)和表单提交(答案)模型是相同的。
我的问题是在给定以下域约束的情况下如何以微服务方式设计它:
- 报告follow_up一旦处于已处理状态,绝不能编辑报告,某些特定用户除外
- 当报告关闭
时,不能编辑报告follow_up
- 它 必须 仅当报告被 处理
时才可能填写调查
- 表单字段应该对于每个使用自定义表单的实体都是相同的
方法 #1
在每个服务中引入一个表单实体并将答案分别存储在report/inspection中。
优点:
- 状态一致性(更改表单答案的状态检查在一个集合中完成,因此更容易遵循域约束)
缺点:
- 代码重复(答案 validation/entity 结构/...)
- 添加新字段类型需要更改多项服务
方法 #2
引入新的表单服务来存储用户定义的表单和表单答案。实体应仅通过 id 引用答案。
优点:
- 在一处形成逻辑
缺点:
- 如果没有紧密耦合或大量传奇,很难遵循领域约束。
我会给出一些通用的答案:
一个好的微服务基础设施更多的是关于解决特定业务问题的服务,而不是作为数据库的接口——这是一个常见的错误——服务从字面上看就像是数据库查询的代理。
让我从您的描述中提取服务理念:
- “表单由用户创建”:FormCreationService?
- FormFillInService
- ReportsService - 它将有一个状态机来确保只允许正确的转换(例如,完成后不进行编辑)
- InspectionService - 也有状态机
下一步是为每项服务描述 API(请在 google 找到关于“设计 api 的非常古老的话题”的 YouTube 视频)。
然后您通过序列图验证 api - 因此您可以合并服务 - 以防它们太小;或拆分更大的块。
归根结底 - 您想将 Unix 哲学应用于您的服务:“做好一件事”。
假设我在不同的微服务中有 2 个实体(聚合根)。
- 报告(id,状态 = 已打开 | in_progress | 已处理 | 已关闭,follow_up(自定义表单答案),调查(自定义表单答案),...)
- 检查(id, form_answers, ...)
我需要添加在这些实体的生命周期内填写自定义(动态)表单的可能性。
表格由用户创建,不能填写检查中的报告特定表格,反之亦然。 这些实体中的表单结构(字段类型)和表单提交(答案)模型是相同的。
我的问题是在给定以下域约束的情况下如何以微服务方式设计它:
- 报告follow_up一旦处于已处理状态,绝不能编辑报告,某些特定用户除外
- 当报告关闭 时,不能编辑报告follow_up
- 它 必须 仅当报告被 处理 时才可能填写调查
- 表单字段应该对于每个使用自定义表单的实体都是相同的
方法 #1
在每个服务中引入一个表单实体并将答案分别存储在report/inspection中。
优点:
- 状态一致性(更改表单答案的状态检查在一个集合中完成,因此更容易遵循域约束)
缺点:
- 代码重复(答案 validation/entity 结构/...)
- 添加新字段类型需要更改多项服务
方法 #2
引入新的表单服务来存储用户定义的表单和表单答案。实体应仅通过 id 引用答案。
优点:
- 在一处形成逻辑
缺点:
- 如果没有紧密耦合或大量传奇,很难遵循领域约束。
我会给出一些通用的答案:
一个好的微服务基础设施更多的是关于解决特定业务问题的服务,而不是作为数据库的接口——这是一个常见的错误——服务从字面上看就像是数据库查询的代理。
让我从您的描述中提取服务理念:
- “表单由用户创建”:FormCreationService?
- FormFillInService
- ReportsService - 它将有一个状态机来确保只允许正确的转换(例如,完成后不进行编辑)
- InspectionService - 也有状态机
下一步是为每项服务描述 API(请在 google 找到关于“设计 api 的非常古老的话题”的 YouTube 视频)。
然后您通过序列图验证 api - 因此您可以合并服务 - 以防它们太小;或拆分更大的块。
归根结底 - 您想将 Unix 哲学应用于您的服务:“做好一件事”。