【问题标题】:How to retrieve the data from different databases in Micro Services?如何从微服务中的不同数据库中检索数据?
【发布时间】:2019-03-13 01:23:27
【问题描述】:

目前,我们使用的是微服务架构。在我们应用程序的登录页面中,用户可以看到与各种其他参数相关联的活动列表(活动微服务),例如优惠券 ID(优惠券微服务)、目的地国家/地区 ID(内容管理微服务),由user id(用户管理微服务)等,但我们需要显示优惠券名称,目的地国家名称和用户名,而不是在列表页面中显示id。

如何在不影响性能的情况下检索所有这些详细信息?

【问题讨论】:

  • 你能说出所有微服务的意图吗?这可能是微服务过于“微”并且不与给定域和有界上下文相关联的实例之一。听起来所有服务都是基本的 CRUD 应用程序。在我的脑海中,我正在考虑在活动服务中使用聚合,但这可能会违反数据完整性。为了不违反数据完整性,我建议向相应的服务发出额外的请求,但这会导致网络调用,这可能会损害性能。

标签: database .net-core microservices


【解决方案1】:

始终需要在可用性和一致性之间进行权衡。在合理的时间内获得响应是 CAP 定理可用性的一部分。

如果您要实施微服务并且不想影响性能,那么您应该考虑数据复制。显示此列表所需的数据将在您的登录页面有权访问的数据库中复制。但不同的服务(即活动、优惠券等)仍将是您应用程序环境中的真实来源。

这将解决潜在的性能问题,但您会遇到保持数据最终一致作为回报的问题。

【讨论】:

  • 如果我们需要复制其他微服务中存在的必要数据,以显示来自优惠券微服务的列表,那么保持这些服务之间数据一致性的最有效方法是什么?这样,我们就可以消除它们之间的差异。
  • 这取决于您的架构,这是一个品味问题。您可以使用服务总线或创建同步数据的服务。我过去使用这两种策略都没有问题。不确定性是分布式系统的重要组成部分。不幸的是,您永远无法保证数据始终一致。这是“最大的努力”,而且大多数时候都很好。我会选择一种策略并尽可能使其发挥最佳作用,但始终可以选择手动干预以防策略失败。你将来会需要这个。
  • 非常感谢您的意见。我们正在考虑使用 RabbitMQ 和 NServiceBus 等服务总线来处理将更新各自数据库中的数据的事件。既然您使用了这种策略,您能否告诉我们需要采取的预防措施,以便我们避免生产中可能出现的问题?这将极大地帮助我们。
  • 这是一个相当广泛的主题,但基本上它是了解您的假设。这很难做到。我遇到的一些事情是:消息并不总是按照发送的顺序接收,在其他系统中处理消息失败(例如,数据库事务由于任何原因回滚,连接问题)。处理相互冲突的消息(例如,您收到一条消息,表明系统 A 已处理订单,但系统 B 早些时候已告诉您该产品已无库存)。当然,这一切都取决于要求。分布式计算可能很难。
  • 这对我们帮助很大。将考虑您的宝贵意见,并确保我们采取必要的行动来解决所讨论的问题。非常感谢!!
猜你喜欢
  • 2020-08-07
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2017-01-18
  • 2017-10-19
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多