【问题标题】:Way to improve Rest Webservice performance which call other API提高调用其他 API 的 Rest Webservice 性能的方法
【发布时间】: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写操作?

【问题讨论】:

    标签: java performance web-services rest spring-boot


    【解决方案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】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 1970-01-01
        • 2012-11-27
        相关资源
        最近更新 更多