当代码等待延迟时间不确定的某种情况时,看起来很多人选择使用指数退避,即等待N秒,检查条件是否满足; 如果没有,等待2N秒,检查条件等.这对于检查恒定/线性增加的时间跨度有什么好处?
linear-programming non-deterministic exponential-backoff retry-logic
使用HttpClient
Java 11(JDK,而不是 Apache),如何重试请求?
假设我想重试一个请求最多10 次,如果它没有返回状态代码或200
抛出异常。
目前,我正在循环中重新安排返回的未来,我想知道是否有更好或更优雅的方式。
CompletableFuture<HttpResponse<Foo>> task = client.sendAsync(request, bodyHandler);
for (int i = 0; i < 10; i++) {
task = task.thenComposeAsync(response -> response.statusCode() == 200 ?
CompletableFuture.completedFuture(response) :
client.sendAsync(request, bodyHandler));
}
// Do something with 'task' ...
Run Code Online (Sandbox Code Playgroud)
如果我们也为特殊情况添加重试,我最终会得到
CompletableFuture<HttpResponse<Foo>> task = client.sendAsync(request, bodyHandler);
for (int i = 0; i < 10; i++) {
task = task.thenComposeAsync(response ->
response.statusCode() == 200 ?
CompletableFuture.completedFuture(response) :
client.sendAsync(request, bodyHandler))
.exceptionallyComposeAsync(e -> …
Run Code Online (Sandbox Code Playgroud) 我有一个封装REST调用的hystrix命令.如果发生故障(例如超时),我想进行单次重试,如果发生故障,则返回适当的错误.
我可以看到Hystrix不支持重试.使用Hystrix的唯一方法是将主逻辑放入getFallback()方法.但它看起来并不正确.
那么,用hystrix实现超时的正确方法是什么?
是否可以根据某些条件重试?如果我用Retryable注释,它会根据一些异常重试,但我想在捕获该异常并且满足相应条件时重试。例子:
@Retryable(value={MyException.class},maxAttempts=2)
public myMethod(Request request){
try{
doSomething();
} Catch(Exception ex){
throw new MyException();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的请求中,我有一个标志isRetryRequired如果这是 true 并且 MyException 被捕获那么我想重试
如何使用 polly 实现重试逻辑,以在有一定延迟的情况下永远重试执行函数,但不处理异常。该场景是重复获取状态信息但没有预期的异常。
我是iOS/Swift开发的新手,我正在开发一个向REST API提出多个请求的应用程序.以下是检索"消息"的其中一个调用的示例:
func getMessages() {
let endpoint = "/api/outgoingMessages"
let parameters: [String: Any] = [
"limit" : 100,
"sortOrder" : "ASC"
]
guard let url = createURLWithComponents(endpoint: endpoint, parameters: parameters) else {
print("Failed to create URL!")
return
}
do {
var request = try URLRequest(url: url, method: .get)
let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
if let error = error {
print("Request failed with error: \(error)")
// TODO: retry failed request
} else if let …
Run Code Online (Sandbox Code Playgroud) 我正在使用 NEST 对 Elasticsearch 6 集群执行查询。Elasticsearch 集群由几个节点组成,但它在防火墙/负载均衡器后面运行,因此从客户端角度来看,它显示为具有单个主机名的单个节点。
当部署我的应用程序的新版本时,由于基础设施/网络在蓝绿部署方面的工作方式,会出现短暂的网络中断。
由于我只有一个 Elasticsearch URI,因此当我创建连接时,NEST 将使用 SingleNodeConnectionPool 实例。我在文档 2 中读到,在这种情况下,NEST 将不会执行任何重试。
但就我而言,我想执行重试来处理上述网络中断,因为它当前会导致错误传播到最终用户。我知道我可以自己实现重试逻辑,但我想知道是否有某种方法可以获取网络连接错误的重试逻辑,即使在使用 SingleNodeConnectionPool 时也是如此。
我的代码中出现的错误是:
System.Net.Sockets.SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机未能响应而建立的连接失败:
我想实现http.Transport
标准的自定义http.Client
,如果客户端超时,它将自动重试。
PS 出于某种原因,定制http.Transport
是必须具备的。我已经检查过hashcorp/go-retryablehttp,但是它不允许我使用我自己的http.Transport
.
这是我的尝试,自定义组件:
type CustomTransport struct {
http.RoundTripper
// ... private fields
}
func NewCustomTransport(upstream *http.Transport) *CustomTransport {
upstream.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
// ... other customizations for transport
return &CustomTransport{upstream}
}
func (ct *CustomTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
req.Header.Set("Secret", "Blah blah blah")
// ... other customizations for each request
for i := 1; i <= 5; i++ {
resp, err = ct.RoundTripper.RoundTrip(req)
if errors.Is(err, …
Run Code Online (Sandbox Code Playgroud) 我有以下内容:
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
retry_strategy = Retry(
total=3,
status_forcelist=[429, 500, 502, 503, 504],
method_whitelist=["HEAD", "GET", "OPTIONS"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
http = requests.Session()
http.mount("https://", adapter)
http.mount("http://", adapter)
response = http.get("some_endpoint")
Run Code Online (Sandbox Code Playgroud)
如何有效地进行单元测试,让我重试 N 次(在本例中为 3 次)?
我刚刚升级到 AWS SDK V3,我不知道如何使用它配置 retryDelayOptions 和 customBackoff。我在AWS自己的API参考或网上找不到任何示例代码。这就是我之前所做的:
retryDelayOptions: { customBackoff: (retryCount) => 2 ** (retryCount * 100) },
maxRetries: 2
Run Code Online (Sandbox Code Playgroud)
我将上述内容作为选项传递给客户端构造函数。V3 的重试似乎发生了很大变化,如果没有任何示例,我无法理解 API。任何帮助深表感谢
问候,迪帕克
javascript amazon-web-services exponential-backoff retry-logic aws-sdk-js-v3
retry-logic ×10
java ×3
http ×2
c# ×1
go ×1
hystrix ×1
ios ×1
javascript ×1
nest ×1
nsurlsession ×1
polly ×1
python ×1
request ×1
spring ×1
spring-retry ×1
swift ×1
timeout ×1