【发布时间】:2023-01-05 17:43:50
【问题描述】:
我有两个(微)服务 A 和 B,其中服务 B 对服务 A 的数据感兴趣。假设服务 A 有一个包含很多字段的产品表。服务 B 想要存储一个包含字段子集(名称和 ID)的产品表。
为了使服务 B 保持最新,我的意图是服务 A 将消息发送到消息总线以创建/更新/删除产品。这似乎是一种常见的方法。
但是现在存在初始同步(或者可能一次重新同步)的问题,因为服务 B 是一项新服务,而服务 A 已经存在。我没有找到关于这个问题的任何最佳实践。 我可以想象两种解决方案:
解决方案 1:服务 B 通过服务 A 也提供的附加 REST API 提取初始数据。我看到的缺点是我需要配置 URL 并且服务 A 必须在此刻运行,所以我不喜欢这个解决方案。
解决方案 2:服务 B 发送一条消息,意图为“SyncProductRequest”。然后服务 A 为每个产品发送更新或在一条消息中一次发送所有产品。由于邮件大小,一次发送所有邮件可能不是一个好主意。另一方面,通过这种方式,我可以轻松地删除服务 A 中不再存在的产品。我也看到了一个问题,即在同步发生的同时,一个产品被更改的情况可能会发生。这个问题我想我只能通过修改产品的日期时间来解决。
你会像我描述的那样用解决方案 2 解决这个“初始同步问题”吗,或者你知道这种类型的微服务问题的最佳实践吗?
万一重要,我正在使用; .net 和公共交通与 rabbitmq
【问题讨论】:
-
也许考虑更多基于事件的方法而不是命令驱动的方法?因此,与其发送诸如“创建/更新/删除”之类的命令,不如发送诸如产品更新/删除之类的事件。您没有提到为什么需要初始同步?在收到产品更新事件时,如果它在服务 B 中不存在,则创建它。如果是,则更新它,等等。
-
嘿罗布,对于创建/更新/删除,我按照您的建议实施了事件驱动的方法。我也按照您的建议将更新处理为更新或创建。你是对的,它就足够了,(在我的第一个用例中,这是一个新功能,我收到了所有相关消息,因为服务 A + B 被同时更改和部署。我需要一个用例初始同步是,服务 B 现在突然需要了解部分用户/组织结构。这些信息由服务 A 存在和管理。
-
我认为当多个服务需要部分相同的模型并且整个系统随着时间的推移而不是一次编写时,通常会出现问题。
-
一旦您的事件逻辑出现错误并且您需要修复它,也可能需要重新同步。
-
是的,可能/将会存在服务具有相同/相似模型的场景。如果跨服务共享来自同一数据库或模式的模型,您将失去松散耦合服务的一些好处,并增加服务之间的依赖性。这里的决定是你的。如果您正在寻求一种微服务方法来获得这些好处,那么请从松散耦合开始,只有在您真的觉得别无选择时才打破它。否则保持松散耦合并提供更新或同步服务模型的方法。您可能会发现您的共享模型仅部分共享,从而减少了同步。