我有无法解决的概念/设计问题。我将尝试以体育术语为例进行解释,但当然同样的问题可以应用于电子商店或任何其他系统。
我想用 API 构建 2 个“独立”微服务来执行所需的操作。服务 A 负责球员管理,服务 B 负责团队管理。
在服务 A 中,我可以进行球员训练、购买球员物品、设置球员外观等。 例如,在服务 B 中,我可以设置团队策略、雇用团队人员、设置团队外观(徽标、颜色)等。
我已经阅读了许多关于微服务的文章和主题,并且在一篇文章中写道:“...微服务最难的部分 = 你的数据 ...”
我的问题来了。我应该如何以及在哪里存储玩家和团队之间的关系(将表 TeamPlayer 想象为带有 player_id、team_id 列的简单关系表)?所以这些是我的担忧:
如何以最好的方式解决这个问题? API 网关是答案还是如何以最佳方式做到这一点?
我希望能说明我的顾虑:)
答案 0 :(得分:0)
一般来说,微服务的适当边界与您在具有外键约束的关系数据库支持的单体应用程序中使用的规范化表不会很好地对齐。相反,我建议让每个服务维护它自己执行任务所需的数据视图(让服务发布持久的事件日志以更改它们控制写入的状态是我推荐的机制)。您对服务 A 和 B 的概念中可能有多个“有界上下文”:为每个有界上下文设置一个微服务可能是有意义的。
考虑到这一点,什么是团队?从“将玩家分配到团队”操作的角度来看,一个团队可能只是一组与某种唯一 ID 相关联的玩家。战术和徽标/颜色与该操作无关。它只需要:
请注意,这种方法确实会带来最终的一致性:在创建玩家之后的一段时间(可能很短,认为可能不到一秒)之后,将该玩家分配给团队的任务才会成功.
答案 1 :(得分:0)
简短的回答是 - 表 TeamPlayer 应该是微服务 A 和 B 的一部分。
为了解释,我借用了李维斯回答中的短语“我建议让每个服务保持自己的数据视图”。这是设计微服务的正确方式。
您可能会提出有关数据重复和数据一致性的问题。是的,会有数据重复,但这是设计、开发和维护微服务的架构权衡。在数据一致性上,最终一致性应该默认模式来维护数据库状态,除非有特定用例(例如-银行)具有强一致性。
希望这个答案能让您清楚简明地了解您的设计问题。