查询组合资源

时间:2018-11-14 07:58:24

标签: rest api design-patterns soa

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

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

这两种资源都有单独的API,这些API部署在不同的服务(具有自己的数据库)中。

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

现在,我想支持诸如books?author.surname=Poe之类的查询。

我正在为实现这种支持的链接资源过滤的实现而苦苦挣扎。

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

我想几乎所有的SOA都在设计初期就遇到了这个问题。

我问的是是否已经有解决该问题的常见模式最佳实践

1 个答案:

答案 0 :(得分:1)

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

这是我的建议:

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

请考虑以下主要缺点:

  1. 您可能会遇到效果不佳的查询
  2. 将来您将无法利用数据库索引和其他出色的功能来发挥自己的优势。这可能会阻碍您的能力 将来可以适当扩展
  3. 您最终可能会得到不一致的数据。例如,“作者”中现在缺少的“书籍”中的作者。因此,您需要一种具有可靠约束的方法(认为 数据库之间的外键),即使它可能是 可以实现的是不必要的复杂性
  4. 缺少数据库提供的固有交易上下文。将来如果需要的话,会遇到问题。

考虑了上述问题之后,如果您仍然有充分理由将相关数据存储在不同的数据库中,则可以尝试以下任何一种选择(请注意,每种选择都是一种有其自身缺点的解决方法)

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

  2. Replication数据(但是如果您的设计目标是数据隔离,那将有损其目的)。这样可以解决查询问题,但是您必须一起处理复制和更多管理。

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

  4. 使用一种媒体与单独的微服务之间的事件进行通信,但会解决最终的一致性和其他缺点。 See the article here.

希望这会有所帮助!