微服务架构:跨服务数据共享

Mik*_* S. 26 architecture web-services microservices

考虑以下针对在线商店项目的微服务:
用户服务保存有关商店用户的帐户数据(包括名字,姓氏,电子邮件地址等)

采购服务会跟踪用户购买的详细信息.

每项服务都提供用于查看和管理其相关实体的UI.购买服务索引页面列出了购买.每个购买项目应包含以下字段:
id,购买用户的全名,购买的商品标题和价格.
此外,作为索引页面的一部分,我想有一个搜索框让商店经理通过购买用户名来搜索购买.

我不清楚如何获取采购服务不具备的数据 - 例如:用户的全名.当尝试通过购买用户名来执行更复杂的搜索购买时,问题会变得更糟.

我想通过在用户创建时广播某种事件(并且只保存购买服务端的相关用户属性),我可以通过在两个服务之间同步用户来解决这个问题.从我的角度来看,这远非理想.当你有数百万用户时,你如何处理这个问题?你会在每个消费用户数据的服务中创建数百万条记录吗?

另一个明显的选择是在用户服务端公开API,它根据给定的ID返回用户详细信息.这意味着购买服务中的每个页面加载,我都必须调用用户服务才能获得正确的用户名.不理想,但我可以忍受它.

如何根据用户名实施购买搜索?我总是可以在Users Service端公开另一个API端点,它接收查询项,在Users Service中对用户名执行文本搜索,然后返回符合条件的所有用户详细信息.在采购服务中,将相关的ID映射回正确的名称并在页面中显示它们.这种方法也不理想.

我错过了什么吗?有没有其他方法来实现上述?也许我面临这个问题的事实是一种代码味道?我很乐意听到其他解决方案.

Rot*_*mon 14

在进入微服务时,这似乎是一个非常普遍和核心的问题.我希望有一个很好的答案:-)

关于这里已经提到的建议模式,我将使用术语数据非规范化而不是多语言持久性,因为它不一定需要在不同的持久性技术中.关键是每个服务都处理自己的数据.是的,你有数据重复,你通常需要某种事件总线来跨服务共享数据.

还有另一种选择,它是第一种选择 - 将搜索本身作为一个单独的服务.

因此,在您的示例中,您拥有用于管理用户的用户服务.购买服务管理购买.每个都处理自己的数据,只处理它需要的数据(例如,购买服务并不真正需要用户名,只需要ID).并且您有第三项服务 - 搜索服务 - 消耗其他服务产生的数据,并从组合数据创建搜索"视图".


sap*_*ens 4

在不同的数据库中保存适当的数据是完全可以的,这就是所谓的多语言持久性。是的,您希望单独保存用户数据和购买数据,并使用消息队列进行同步。数百万用户对我来说似乎很好,这是可扩展性,而不是设计问题;-)

在搜索的情况下 - 您可能想要搜索的不仅仅是用户名,对吧?因此,如果您使用消息队列在服务之间更新数据,您还可以轻松地将这些数据路由到 ElasticSearch。从 ElasticSearch 的角度来看,索引哪个字段(用户名或产品标题)并不重要。