【问题标题】:Querying composed resources查询组合资源
【发布时间】:2019-04-17 03:16:54
【问题描述】:

我目前正在尝试设计一个小型 REST API。

假设我有一个由多个其他资源(例如author)组成的资源(book)。

两种资源都有独立的 API,部署在不同的服务中(使用自己的数据库)。

作者对书籍一无所知。但是书籍知道它们的作者。

现在我想支持像books?author.surname=Poe 这样的查询。

我正在努力实现如何支持这种链接资源的过滤。

由于作者不了解书籍,我无法要求作者 api 给我匹配作者并从这里转到相关书籍。 我可以做的是询问我在数据库中拥有的每一本书的作者 API,然后根据作者姓名进行过滤。但这听起来非常糟糕。

我猜几乎每个 SOA 在设计的早期都会遇到这个问题。

我想问是否已经有解决此问题的通用模式最佳实践

【问题讨论】:

  • 当你说书籍知道他们的作者时,你会在某处保存这种映射吗?
  • 是的,在我的 book 实体中

标签: rest api design-patterns soa


【解决方案1】:

您的案例显然需要在这些实体(资源)之间实现一对多类型的可靠关系。您正在寻找的模式是...关系数据库!它们是为这个特定的用例而发明的。

这是我的建议:

首先,您需要考虑和评估这种数据分离和隔离在您的特定情况下是否是一个合理的设计决策,看看您自己设置的缺点和权衡.是否有充分的理由将这些数据放在单独的数据库中?

考虑以下首要缺点:

  1. 您可能会遇到表现不佳的查询
  2. 将来您将无法利用数据库索引和其他出色的功能来发挥您的优势。这可能会妨碍你的能力 在未来适当扩展
  3. 您最终可能会得到不一致的数据。例如,Books 中的作者现在从 Authors 中丢失。所以你需要一种方法来拥有可靠的约束(想想 外键)之间的数据库,即使它可能是 可实现的是不必要的复杂性
  4. 错过了数据库提供的固有事务上下文。如果您将来需要它,您会遇到问题。

在考虑了上述情况之后,如果您仍然认为您有充分的理由将这些相关数据保存在不同的数据库中,您可以尝试以下任何想到的选项(请注意,每个选项都是一种带来自身缺点的解决方法):

  1. 在 API doing as little calls as possible 之间实现一种 JOIN。我的意思是在作者资源中有一个唯一的作者 ID,首先使用名称查询作者并获取其唯一 ID。然后用这个id查询Books,得到所有匹配的书。因此,您将只有 2 个电话,而不是潜在的数千个电话。此解决方案具有常数 O(1) 而不是 O(N) - 线性 - 复杂度。

  2. Replication 的数据(但如果您的设计目标是数据隔离,那会有点违背目的)。这将解决查询问题,但您必须同时处理复制和更多管理。

  3. 使用 dblink 或您正在使用的数据库的类似功能实现单独数据库之间的连接,以便将它们作为单个数据库进行查询。

  4. 使用媒介在不同的微服务之间进行事件通信,但要满足最终的一致性和其他缺点。 See the article here.

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 2022-08-13
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多