在eBay应用层面使用代码插装进行故障注入

eBay工程师利用故障注入技术提升通知平台可靠性

eBay工程师通过故障注入技术来提高其通知平台的可靠性,并探索系统的弱点。尽管故障注入在行业中较为常见,但eBay采用了一种新颖的方法,利用代码插桩技术在应用层面进行故障注入。

通知平台的重要性与复杂性

该平台负责将平台通知推送给第三方应用程序,提供商品价格、库存状态、支付状态等最新变化。这是一个高度分布式、大规模的复杂系统,依赖于多个外部组件,包括分布式存储、消息队列、推送通知端点等。

传统故障注入方法的局限性

eBay工程师Wei Chen表示,传统的故障注入通常在基础设施层面进行,例如通过引发网络故障来引入HTTP错误(如服务器断开或超时),或使某些资源暂时不可用。这种方法成本高,并且对整个系统有广泛影响,难以单独分析特定故障的效果。

应用层面的故障注入方法

Chen指出,故障注入可以在应用层面进行。例如,通过在HTTP客户端库中添加特定延迟来模拟超时。eBay通过在依赖服务的客户端库的类文件中插桩,引入预定义的故障类型。这些故障在服务与底层资源通信时触发,但实际并未发生在依赖服务中,而是通过修改代码模拟故障效果,从而在无风险的情况下进行实验。

eBay实现的三种基本插桩技术

eBay实现了三种基本的插桩技术,强制调用方法显示故障行为:

  1. 阻断或中断方法逻辑:例如抛出异常。
  2. 改变方法状态:例如修改response.getStatusCode()的返回值。
  3. 替换方法参数值:例如修改传递给方法的参数值。

Java代理与配置管理系统的实现

为了实现上述插桩技术,eBay创建了一个Java代理。在代理中,实现了一个classloader,用于插桩应用程序代码中使用的方法。此外,还创建了一个注解,用于标识哪些方法将被插桩,并将插桩逻辑放入被注解的方法中。

eBay工程师还实现了一个配置管理系统,能够在运行时动态改变故障注入的行为。对于eBay应用支持的每个端点,工程师可以修改多个参数以测试特定行为。

行业首创的应用层面故障注入

Chen表示,eBay是行业内首个在应用层面使用代码插桩技术进行故障注入的组织。如果对此方法感兴趣,可以查看原文获取更详细的解释。

阅读 23
0 条评论