我有一个网络服务ABC
ABC运营:
A.致电XYZ网络服务
B.在db中存储响应
C.退货结果
整体ABC响应时间= 18秒
XYZ响应时间= 8秒
只有ABC响应时间= 18-8 = 10秒
我想尽量减少ABC服务的响应时间。
如何做到这一点?
我觉得很少:
1.发送部件请求并获得部件响应=但在我的情况下它不可能。
2。返回响应并以异步方式执行db。 (这可以以可靠的方式完成吗?)
3.有没有办法改进db写操作?
答案 0 :(得分:1)
据我所知,您可以根据您的要求按照选项进行操作:
考虑从XYZ响应中缓存结果并存储到数据库,以便最大限度地减少呼叫。
选项2中可能存在失败的可能性,但您仍然可以通过将失败案例写入错误日志并稍后处理来修复它。
可以通过适当的索引,规范化等来改进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中出现问题建立起来的“后写”指令队列。在这种情况下,您可以分析数据库调用,以了解为什么它需要这么长时间。常见的候选者包括:尝试编写大型数据项(例如,大型非规范化数据项),尝试写入重度索引的表/存储。