如何将数据库与微服务(和新的服务)同步?

6
我正在使用微服务架构开发网站,每个服务都拥有一个数据库。数据库存储微服务所需的数据。

PostVideo服务需要用户信息,因此两个服务都订阅了NEW_USER_EVENT

当有新用户注册时,将触发NEW_USER_EVENT

enter image description here

一旦服务收到了NEW_USER_EVENT,它们会将收到的用户信息放入各自的数据库中,这样它们就可以在不询问User服务的情况下执行操作。

enter image description here

到目前为止一切都很好。但是问题来了:
如果我要创建一个新的服务,该如何获取已注册用户信息并将其放入新服务中?
也许我可以从现有服务中获取信息。但是事件是由消息队列(NSQ)推送的。
如果我要从其中一个微服务中复制数据,如何确保哪个服务具有最新的用户信息?(因为一些服务还没有接收到最新事件)

enter image description here


阅读更多:

微服务中最难的部分:你的数据

微服务入门,第4部分:依赖和数据共享


为什么“帖子”、“视频”和其他服务需要了解用户创建?如果与这些服务从未听说过的用户相关的请求到达,它们无需验证该用户是否存在...它们可以简单地假设该用户必须确实存在,否则它们不会收到与该用户相关的请求。 - Michael - sqlbot
@Michael,这些服务将接收username并将其转换为user_id,而不需要向User服务请求松耦合。当新用户注册时,这些服务将在各自的数据库中存储username-userId映射,以便可以在它们自己的服务中进行转换。 - Yami Odymel
我知道这个问题可以通过使用JWT来解决,但我还有类似的事情,不仅限于用户需要转换。 - Yami Odymel
这些图表是在 macOS 上使用 Sketch 绘制的,我想你也可以通过 https://draw.io 获得相同的结果。 - Yami Odymel
@Yami - 但在微服务架构中,音乐服务不应该只涉及音乐,而不是构建URL、提供页面等等。据我了解,u服务几乎从来不会直接暴露给外界,而是有一个公共服务层位于它们之上来构建这些东西?无论哪种情况,这似乎都是使用这样一个包装服务的非常好的用例——“公共音乐服务”,它将用户服务和音乐服务组合起来。u服务应该成为有界上下文。ID告诉你最后一部分——它们是否存在。如果使用ID调用服务,则用户存在(1/2)。 - Kieren Johnstone
显示剩余7条评论
1个回答

3
如果我要创建一个新的服务,如何获得已注册用户的信息并将其放入新服务中?
您需要从应用程序一开始就订阅了这个新服务的所有事件(您应该有一个“事件存储”,它保存了应用程序中已经发生的所有事件)。在重放事件时,您可以使用更加智能的逻辑,从最近的事件开始向过去回溯。通过这种方式,您将能够首先恢复最有价值的数据。只需小心处理相互依赖的事件即可。
数据来源:事件由消息队列(NSQ)推送。如果我要从其中一个微服务中复制数据,如何确保复制源具有最新的用户信息?
您不是在谈论备份,对吗?
除了备份之外,在事件驱动的系统中,人们通常不会以传统方式逐行复制数据。相反,他们通过从时间开始重放事件并将这些事件提供给新服务(或新实例)的事件处理程序来使新服务最终与系统的其他部分一致。

只是为了明确,我相信你在谈论事件溯源,它并不一定与微服务架构相关联? - Kieren Johnstone
你是正确的,Yami指出他正在使用NEW_USER_EVENT来在服务之间同步数据,这意味着使用事件溯源技术。 - IlliakaillI
我可能用了错误的方式描述我的上一个问题,但是你的答案仍然帮助我理解了一些额外的东西。我在谈论:也许我可以从现有服务中获取已注册用户的信息,但由于我正在使用“消息队列”来同步用户信息,我无法确定哪个服务具有最新的用户信息(因为某些服务尚未收到“NEW_USER_EVENT”事件)。 - Yami Odymel
如果我要创建一个事件存储,我仍然不能确保事件存储具有最新的事件(如果“事件存储=订阅所有事件的微服务”)。或者我只是过于担心这个问题,因为“消息队列”并不那么 - Yami Odymel
1
使用Event Store可以确保它具有最新版本。原因是所有服务都应该直接和同步地将事件保存到事件存储中。之后,如果需要,一些后台工作程序可能会将事件发布到总线上。某些事件存储已经内置了发布/订阅机制,因此您甚至不需要一个队列。这实际上是执行ES的首选方式。这个很不错: https://geteventstore.com/ - IlliakaillI
事件驱动架构并不意味着使用事件溯源技术。服务总线不应被用作事件存储。 - Orestis P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接