如何将数据库与微服务(和新的)同步?
Posted
技术标签:
【中文标题】如何将数据库与微服务(和新的)同步?【英文标题】:How to sync the database with the microservices (and the new one)? 【发布时间】:2017-05-17 15:49:22 【问题描述】:我正在开发一个具有微服务架构的网站,每个服务都拥有一个数据库。数据库存储微服务需要的数据。
Post
、Video
服务需要用户信息,所以这两个服务都订阅了NEW_USER_EVENT
。
NEW_USER_EVENT
将在有新用户注册时触发。
一旦服务收到NEW_USER_EVENT
,他们会将传入的用户信息放入各自的数据库中。这样他们就可以在不询问User
服务的情况下做事。
到目前为止一切顺利。但问题来了:
如果我要创建新服务怎么办?如何获取注册用户信息并将其放入新服务中?也许我可以从现有服务中获取信息。但是这些事件是由消息队列 (NSQ
) 推送的。
如果我要从其中一个微服务中复制数据,我如何确定哪个服务拥有最新的用户信息? (因为有些服务没有收到最新的事件)
阅读更多:
The Hardest Part About Microservices: Your Data
Intro to Microservices, Part 4: Dependencies and Data Sharing
【问题讨论】:
为什么“帖子”和“视频”等服务需要了解用户创建?如果请求到达与那些服务从未听说过的用户相关,他们不需要验证用户是否存在......他们可以简单地假设用户确实存在,否则他们不会收到与用户。 @Michael 服务收到了username
,它们会将其转换为user_id
,而无需询问User
服务的松散耦合。当新用户注册时,服务会将username-userId
映射存储在他们的每个数据库中,以便他们可以在自己的服务中进行转换。
我知道这个问题可以用JWT解决,但我还是有类似的事情,不仅仅是用户需要转换。
我认为没有必要在新服务中包含用户数据 - 当您说有新音乐(例如)时,您会发布“用户 ID_HERE 创建了一些音乐”,然后只存储该 ID。该服务不需要知道除 ID 之外的任何内容,不是吗?它可以响应“用户已禁用”事件并可能将它们全部归档——尽管这可能不是必需的。基本上,我不确定为什么这项服务完全关心用户名
图不错,Yami用的什么工具?
【参考方案1】:
如果我要创建一个新服务怎么办?如何获取注册用户信息并将其放入新服务中?
您必须重播从一开始就订阅了此新服务的所有事件(您应该有一个“事件存储”来保存应用程序中已经发生的所有事件)。此外,您可以通过从最近的事件开始并及时返回来在重播事件时添加一些更智能的逻辑。这样,您将能够首先恢复最有价值的数据。请注意正确处理相互依赖的事件。
数据源:事件由消息队列(NSQ)推送,如果我要从其中一个微服务中复制数据,如何确保复制源具有最新的用户信息?
您不是在谈论进行备份,对吧?
除了备份之外,在事件驱动系统中,人们通常不会以经典方式逐行复制数据。相反,他们只是从一开始就从事件存储中重放事件,并将这些事件提供给新服务(或新实例)的事件处理程序。结果,新服务最终与系统的其他部分保持一致。
【讨论】:
澄清一下,我相信你说的是事件溯源,它不一定与微服务架构相关联? 你说得对,Yami 指出他正在使用 NEW_USER_EVENT 在服务之间同步数据,这意味着使用了事件溯源技术。 我可能使用了错误的方式来描述我的最后一个问题,但您的回答仍然有助于我理解一些额外的东西。我在说:也许我可以从现有的服务中获取注册的用户信息,但是由于我使用Messaging Queue
来同步用户信息,我无法确定哪个服务具有最新的用户信息(因为一些服务尚未收到NEW_USER_EVENT
事件)。
如果我要创建一个事件存储,我仍然无法确保事件存储有最新的事件(If Event store = A microservice which subscribed to all the events
)。还是我只是想多了,因为Messaging Queue
不是慢?
使用 Event Store 可以保证它拥有最新版本。原因是所有服务都应该直接同步地将事件保存到事件存储中。之后,如果需要,一些后台工作人员可能会将事件发布到总线。一些事件存储已经有 pub/sub 内置机制,所以你甚至不需要队列。这实际上是做 ES 的首选方式。这个还不错:geteventstore.com以上是关于如何将数据库与微服务(和新的)同步?的主要内容,如果未能解决你的问题,请参考以下文章