重试所有 OpenStack 客户端调用

https://blueprints.launchpad.net/sahara/+spec/clients-calls-retry

本规范建议添加在发生偶发错误时重试 OpenStack 客户端调用的能力。

问题描述

Sahara 使用大量 OpenStack 客户端与其它 OpenStack 服务进行通信。有时在这些客户端调用期间可能会发生偶发错误,从而导致 Sahara 错误。如果您发出大量调用,其中一个调用未能按预期响应并不令人惊讶——特别是对于负载较高的服务而言。

您发出一个有效的调用,它返回 4xx 或 5xx 错误。稍后您再次发出相同的调用,它成功了。为了防止此类故障,应重试所有客户端调用。但重试应仅针对某些错误代码进行,因为并非所有错误都可以通过重复调用来避免。

提议的变更

Swift 客户端本身提供了调用重试的能力。因此,在客户端初始化期间只需设置重试次数和 retry_on_ratelimit 标志即可。

Neutron 客户端也提供了重试能力,但仅当发生 ConnectionError 时才重复调用。

Nova、Cinder、Heat、Keystone 客户端根本不提供此类功能。

为了重试调用,将实现 execute_with_retries(method, *args, **kwargs) 方法。如果在执行给定方法(将通过第一个参数传递)后发生错误,其 http_status 将与错误列表中可重试的 http 状态进行比较。据此,客户端调用将获得另一个机会,或者不会。

以下是可重试的错误列表

  • REQUEST_TIMEOUT (408)

  • OVERLIMIT (413)

  • RATELIMIT (429)

  • INTERNAL_SERVER_ERROR (500)

  • BAD_GATEWAY (502)

  • SERVICE_UNAVAILABLE (503)

  • GATEWAY_TIMEOUT (504)

重试客户端请求的次数将从 retries_number 配置值(默认值为 5)中获取。

重试之间的时间间隔将可配置(配置中的 retry_after 选项),默认值为 10 秒。 此外,Nova 客户端在 OverLimitRateLimit 错误类中提供了 retry_after 字段,在这种情况下可以使用它来代替配置值。

这两个配置选项将位于 timeouts 配置组下。

所有客户端调用都将替换为 execute_with_retries 包装器。例如,代替以下方法调用

nova.client().images.get_registered_image(id)

它将是

execute_with_retries(nova.client().images.get_registered_image, id)

替代方案

数据模型影响

REST API 影响

其他最终用户影响

部署者影响

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

实现

负责人

主要负责人

apavlov-n

工作项

  • 向 Sahara 配置添加新选项;

  • execute_with_retries 方法实现;

  • 将 OpenStack 客户端调用替换为 execute_with_retries 方法。

依赖项

测试

将添加单元测试。它们将检查是否仅重试指定的错误

文档影响

参考资料