改进调用其他API的Rest Webservice性能的方法

时间:2017-07-31 08:34:02

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

我有一个网络服务ABC

ABC运营:
 A.致电XYZ网络服务
 B.在db中存储响应  C.退货结果

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

我想尽量减少ABC服务的响应时间。

如何做到这一点?

我觉得很少:
1.发送部件请求并获得部件响应=但在我的情况下它不可能。
2。返回响应并以异步方式执行db。 (这可以以可靠的方式完成吗?)
3.有没有办法改进db写操作?

2 个答案:

答案 0 :(得分:1)

据我所知,您可以根据您的要求按照选项进行操作:

  1. 考虑从XYZ响应中缓存结果并存储到数据库,以便最大限度地减少呼叫。

  2. 选项2中可能存在失败的可能性,但您仍然可以通过将失败案例写入错误日志并稍后处理来修复它。

  3. 可以通过适当的索引,规范化等来改进DB写操作。

答案 1 :(得分:1)

如果可以“”以异步方式执行db“,即如果你可以在之前响应调用者,那么你可以使用'write behind'模式来执行DB异步写入。

后写模式看起来像这样:对每个数据进行排队更改,让这个队列服从可配置的持续时间(又称“后写延迟”)和最大大小。当数据发生更改时,会将其添加到后写队列(如果它尚未在队列中),只要满足以下条件之一,就会将其写入底层存储:

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

这个领域有很多现有技术。例如,Spring的Cache Abstraction允许您添加缓存层,它支持符合JSR-107的缓存,例如Ehcache 3.x,它提供write behind cache writer。 Spring的缓存服务是一个抽象而不是一个实现,它的想法是,当你继续提供商店和代码与商店交互时,它将为你提供缓存逻辑。

除了调用XYZ之外,你还应该看看ABC内部发生的其他事情,如果DB调用占所有这些额外的10,那么'后面写'将节省你~10s但是如果还有其他活动发生在那些10年代,你需要分别解决这些问题。这里的关键点是剖析ABC内部的调用,以便您可以确切地确定花费的时间,然后根据以下因素确定每个阶段的优先级:(a)该阶段需要多长时间; (b)减少时间是多么容易。

如果您转向“后写”方法,那么数据库的已用时间不再是调用者的问题,但由于写入时间过长可能会导致 ABC中出现问题建立起来的“后写”指令队列。在这种情况下,您可以分析数据库调用,以了解为什么它需要这么长时间。常见的候选者包括:尝试编写大型数据项(例如,大型非规范化数据项),尝试写入重度索引的表/存储。