提高调用其他 API 的 Rest Webservice 性能的方法

Posted

技术标签:

【中文标题】提高调用其他 API 的 Rest Webservice 性能的方法【英文标题】:Way to improve Rest Webservice performance which call other API 【发布时间】:2018-01-06 17:35:36 【问题描述】:

我有一个网络服务 ABC

ABC 运营: A. 调用 XYZ 网络服务 B. 将响应存储在 db C. 返回结果

整体 ABC 响应时间 = 18 秒 XYZ 响应时间 = 8 秒。 只有 ABC 响应时间 = 18-8 = 10 秒

我想最小化 ABC 服务的响应时间。

如何做到这一点?

我认为的几件事: 1.发送部分请求并获得部分响应=但在我的情况下这是不可能的。 2。返回响应并以异步方式执行 db。 (这可以以可靠的方式完成吗?) 3、有什么办法可以改善db写操作?

【问题讨论】:

【参考方案1】:

如果可以“以异步方式执行数据库”,即如果您可以在数据库写入完成之前响应调用者,那么您可以使用“后面写入”模式来执行DB 异步写入。

后写模式如下所示:对每个数据更改进行排队,让此队列受制于可配置的持续时间(也称为“后写延迟”)和最大大小。当数据发生变化时,它会被添加到 write-behind 队列中(如果它还没有在队列中),并且只要满足以下条件之一,它就会被写入底层存储:

延迟写入过期 队列超出了可配置的大小 系统进入关机模式,您要确保没有数据丢失

这个领域有很多现有技术。例如,Spring 的Cache Abstraction 允许您添加缓存层,它支持符合 JSR-107 的缓存,例如提供write behind cache writer 的 Ehcache 3.x。 Spring 的缓存服务是一种抽象而非实现,其理念是它会在您继续提供 store 和与 store 交互的代码时为您处理缓存逻辑。

您还应该查看 ABC 内部发生的任何其他事情,除了对 XYZ 的调用,如果 DB 调用占所有这些额外的 10 秒,那么“写后”将为您节省大约 10 秒,但如果有其他活动正在发生在这 10 岁时,您需要分别解决这些问题。这里的关键是分析 ABC 内部的调用,以便您可以准确识别时间花费的位置,然后根据诸如 (a) 该阶段需要多长时间等因素确定每个阶段的优先级; (b) 缩短该时间的难易程度。

如果您采用“后写”方法,那么 DB 的运行时间对您的调用者来说不再是问题,但它可能仍然是 ABC 中的问题,因为较长的写入时间可能会导致'write behind' 指令队列建立起来。在这种情况下,您将分析数据库调用以了解为什么需要这么长时间。常见的候选包括:尝试写入大型数据项(例如大型非规范化数据项),尝试写入索引严重的表/存储。

【讨论】:

【参考方案2】:

据我所知,您可以根据自己的要求选择以下选项:

    考虑缓存来自 XYZ 响应的结果并将其存储到数据库中,以便最大限度地减少调用。

    选项 2 可能会出现故障,但您仍然可以通过将故障情况写入错误日志并稍后处理来修复它。

    可以通过适当的索引、规范化等改进数据库写入操作。

【讨论】:

以上是关于提高调用其他 API 的 Rest Webservice 性能的方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Camel 的 REST 服务调用需要首先调用身份验证 api

api接口安全测试-Wsdl&Swagger&Webpack

REST API 中的分层系统约束

如何在Javascript中进行rest API调用[重复]

如何调用时间表发票上传 SAP Fieldglass REST API 调用?

调用 REST API 时如何处理 Google Ads API 速率限制?