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

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

采购服务跟踪用户购买的细节.

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

我不清楚如何收回采购服务所不具备的数据,例如:用户的全名.
当尝试通过购买用户名进行更多复杂的事情,如搜索购买时,问题变得更糟.

我想通过在用户创建之间广播某种事件(并且仅在采购服务端保存相关的用户属性),我可以明显地通过同步两个服务之间的用户解决这个问题.这在我看来远非理想.当您有数百万用户时,您如何处理?您将在每个消耗用户数据的服务中创建数百万条记录?

另一个显而易见的选择是在用户服务端暴露一个API,它会根据给定的ID带回用户的详细信息.这意味着在采购服务中加载每一页,我必须打电话给用户服务才能获得正确的用户名.不理想,但我可以和它一起生活.

如何根据用户名实施购买搜索?那么我可以随时在用户服务端收到另一个API端点,该端点接收到查询项,对用户服务中的用户名进行文本搜索,然后返回与条件匹配的所有用户详细信息.在采购服务中,将相关的ID重新映射到正确的名称,并将其显示页面中.这种做法也不理想.

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

解决方法

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

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

还有另一种选择,这是一种首选 – 将搜索本身作为单独的服务.

所以在您的示例中,您有用于管理用户用户服务.采购服务管理采购.每个都处理自己的数据,并且只处理它所需要的数据(因此,例如,采购服务并不真正需要用户名,只有ID).而且,您有第三个服务 – 搜索服务 – 消费其他服务生成的数据,并从组合数据创建搜索“视图”.

相关文章

操作步骤 1、进入elasticsearch的plugin,进入ik。进入config。 2、在config下面建立以.dic为后缀的字典...
lengend data数据中若存在'',则表示换行,用''切割。
代码实现 option = { backgroundColor: '#080b30', tooltip: { trigger: &...
问题原因 原因在于直接在js中取的变量并复制给var变量。 于是就变成这样。 解决办法 var data = &#...
前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选...
对于很多人来说,用字符编码都是熟能生巧,而不清楚为什么是那样的字符编码,所以我在这列了一个表,翻...