一. 前言
反压(backoff)是指网络请求如果失败时,将适当削弱访问的请求流量,避免造成更大拥塞。在Presto中,支持Exchange和MetaStore两种请求的自动反压,本文主要介绍在Presto中,这两种反压是如何实现的。
二. Presto中Exchange反压
Presto中各个Stage和节点间数据交换完全通过exchange算子实现,exchange算子有大量的数据传递,因此Presto在其实现中增加了网络反压机制。该实现是在Backoff类中实现的,主要原理是通过连续失败次数逐步增加请求的延时,延迟时间的梯度的核心代码为:
Presto将根据上述的请求失败和延迟梯度的映射关系,如果发生一次网络请求失败,则延时50毫秒再请求第二次,连续2次失败,则延时100毫秒再请求下一次,依次类推。
背压的实现也很简单,主要核心代码如下所示:
当请求成功时,Presto请清零失败次数和延时时间,直到再发生请求失败时候才触发下一次延迟请求。
三. Presto访问Metastore反压
Presto访问Metastore也支持反压实现流量管控,默认延迟时间是1s,延迟时间的增加系数为2,每次失败,都会按照2的倍数的延迟时间进行延迟访问。比如一次失败,延时1s再发送下一次请求,连续两次失败,延迟2s再发送下一次请求,连续3次失败,延迟4秒再发送下一次请求....依次类推,最大的延迟时间为延迟30s。
在Presto中,访问MetaStore的backoff机制和Exchange的backoff机制实现原理不太一样,Presto访问MetaStore的backoff的核心实现代码如下所示:
实现原理就是根据失败次数,求取对应的睡眠时间,直接睡眠即可。