微服务:如何有效处理微服务之间的数据依赖

Microservices: how to effectively deal with data dependencies between microservices

我正在开发一个使用微服务开发方法和平均堆栈的应用程序。我 运行 遇到需要在多个微服务之间共享数据的情况。例如,假设我有用户、视频、消息(sending/receiving、收件箱等)服务。现在视频和消息记录属于一个帐户记录。当用户创建视频并发送/接收消息时,有一个外键 (userId) 必须与他们创建的视频和消息记录相关联。例如,我有一些场景需要显示与每个视频关联的名字、中间名和姓氏。现在假设在前端,用户正在滚动浏览上传到系统的视频列表,一次 50 个。在最坏的情况下,我可能会看到每个视频都与唯一用户相关联的情况下出现 50 次拉动。

这个问题似乎有两种解决方法:

第一,我对用户服务进行 api 调用,让每个用户都绑定到列表中的每个视频。这似乎效率低下,因为如果我为每个视频打一个电话,它可能会变得非常健谈。在 api 调用场景的第二个中,我将获取视频列表并发送一个不同的用户外键列表进行查询,以使每个用户与每个视频相关联。这似乎更有效率,但似乎我正在失去性能,将所有内容重新组合在一起以发送显示,或者需要对其进行操作。

第二,无论何时创建新用户,帐户服务都会将一条包含其他服务需要的用户信息的消息发送到扇出队列,然后各个服务负责将新用户添加到 table 在它自己的数据库中,从而保持松耦合。这里的极端缺点是数据重复,并且在需要进行更新以确保最终一致性时必须有扇出队列来处理。虽然,在 long 运行 中,从性能的角度来看,这种方法似乎是最有效的。

我在这两种方法之间左右为难,因为它们都有各自的权衡取舍。哪种方法最适合实施,为什么?

不要将您的设计决策局限于您列出的那两个选项。关于微服务最困难的事情是了解什么是服务,以及如何将您的应用程序切割成 chunks/services 以便作为 'microservice' 实现。

仅仅因为您拥有这 3 个实体(用户、视频和消息)并不意味着您必须实施 3 个服务。如果您的实际用例表明这些服务(或实体)严重依赖彼此来满足来自前端的简单请求,那么这就是您的切割不正确的明确信号。

根据我从您的示例中看到的内容,我将设计 1 个微服务来满足请求。请记住,微服务的设计基础之一是尽可能独立。 没有必要把服务搞得太复杂,这不是SOA。

https://martinfowler.com/articles/microservices.html -> 读得真好!

此致, 拉斯

我也对这个问题感兴趣。

首先,您描述的场景很常见。用户、视频和消息绝对是三种不同的微服务。您如何将系统分解成多个部分没有问题。

其次,有多种选择,如何解决数据共享问题。看看来自 auth0 的精彩文章:https://auth0.com/blog/introduction-to-microservices-part-4-dependencies/