首页 > 解决方案 > 服务 B 依赖于服务 A 中的数据:重复数据还是按需检索?

问题描述

这是一个微服务设计问题,它是我想解决的现实问题的简化。

服务 A 具有可以处于活动或不活动状态的实体。

[
    {
       id: "a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
       name: "foo",
       active: true
    },
    {
       id: "eb1ced31-eccc-4ad6-a695-5c6c76cab7a5",
       name: "bar",
       active: false
    },
    {
       id: "ef332044-9e66-4a0b-91ed-c16a2537e848",
       name: "baz",
       active: true
    }
]

服务 B 具有与服务 A 的实体相关的作业,并且仅应在实体处于活动状态时运行(根据业务规则)。

选项 1:服务 B 不存储作业是否应该运行。

[
    {
       id: "39cf3321-34d1-4557-b1c4-ca628c191b92",
       entityId: ""a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
       start: "Thu Nov 29 2018 08:40:27 GMT-0800 (Pacific Standard Time)",
       ended: null,
       recurrence: "hourly"
    },
    {
       id: "77296d22-564f-4289-8327-f23bceb1d400",
       entityId: "a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
       start: "Tu Nov 27 2018 15:56:01 GMT-0800 (Pacific Standard Time)",
       ended: null,
       recurrence: "hourly"
    },
    {
       id: "2916a920-13a3-46f6-9ffd-d7629163924a",
       entityId: "eb1ced31-eccc-4ad6-a695-5c6c76cab7a5",
       start: "Wed April 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)",
       ended: Thu April 01 2019 00:00:00 GMT-0800 (Pacific Standard Time),
       recurrence: "daily"
    },
]

当计划运行作业时,它会检查

if Service A has j.entityId = true
   run j

使用服务 A 的 API。

选项 2:服务 B 存储作业是否应该运行

[
    {
       id: "39cf3321-34d1-4557-b1c4-ca628c191b92",
       entityId: ""a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
       active: true,
       start: "Thu Nov 29 2018 08:40:27 GMT-0800 (Pacific Standard Time)",
       ended: null,
       recurrence: "hourly"
    },
    {
       id: "77296d22-564f-4289-8327-f23bceb1d400",
       entityId: "a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
       active: true,
       start: "Tu Nov 27 2018 15:56:01 GMT-0800 (Pacific Standard Time)",
       ended: null,
       recurrence: "hourly"
    },
    {
       id: "2916a920-13a3-46f6-9ffd-d7629163924a",
       entityId: "eb1ced31-eccc-4ad6-a695-5c6c76cab7a5",
       active: false,
       start: "Wed April 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)",
       ended: Thu April 01 2019 00:00:00 GMT-0800 (Pacific Standard Time),
       recurrence: "daily"
    },
]

其存储通过服务 A 的通知保持最新:

Entity e changes => publish e => Service B updates accordingly

以下是我看到的支持每个选项的论点。

选项 1 参数:

选项 2 参数:

标签: databasedesign-patternsservicearchitecturemicroservices

解决方案


这应该取决于您的需求以及电话的频率,但在此之前我想更正几点。

存储成本真的不应该是一个问题,保持数据同步的努力以及之后的后果是。健谈还不错,它可能会使事情变得有点复杂,但是有一些方法可以让事件驱动系统创造奇迹并且仍然可以维护。

服务必须是独立的,同意,但这并不意味着它们不应该尊重边界。订单服务需要用户数据,但这并不能证明将所有用户数据保留在订单服务中。它并没有使它独立,但它只是使服务膨胀并使订单担心它不应该真正关心的事情。

因此,在您的情况下,我更愿意进行 api 调用(并为服务 A 提供 SLA 以快速响应、缓存或其他),但我会避免在我的系统中缓存其他人的数据。但是,有时当您的服务 B 被调用时,例如每分钟 n 次并且 n 越来越大,那么您可能会倾向于方法 b(但它仍然是灰色区域并且要小心,这可能会让您的生活变得困难取决于 serviceA 如何随时间演变)


推荐阅读