当前位置: 首页 > 知识库问答 >
问题:

Jodah故障安全库超时时间比预期的要长

连时铭
2023-03-14

我有一种情况,我想实现一个API重试机制。假设我有一个调用第三方API的API,正常响应时间不到2秒,但有时我们会收到一个错误,说“服务不可用”、“网关超时”等等。

所以我上网看看我们是否有一个图书馆来处理这些事情,我发现了https://jodah.net/failsafe/

使用图书馆的目的:-

如果在5秒钟内,我没有得到结果,我将取消当前调用的执行,再试一次。

为此,在库中,我可以看到我们有超时和重试策略。

首先,我尝试超时。

 Timeout<Object> timeout = Timeout.of(Duration.ofMillis(1000)).withCancel(true)
        .onFailure(e -> logger.error("Connection attempt timed out {} {} ",new DateTime(), e.getFailure()))
        .onSuccess(e -> logger.info("Execution completed on time"));


       try {
         logger.info("TIme: {}", new DateTime());
         result = Failsafe.with(timeout).get(() -> restTemplate.postForEntity(messageSendServiceUrl, request, String.class));

      } catch (TimeoutExceededException | HttpClientErrorException e) {
        logger.info("TIme: {}", new DateTime());
        logger.error("Timeout exception", e);

      } catch (Exception e) {
        logger.error("Exception", e);
      }

但是,在计算调用API和接收TimeOutExceedeException之间的延迟时间时,我得到了20秒,这应该是1秒,因为持续时间是持续时间。百万(1000)。下面你可以看到21秒的差异。

TIme: 2020-06-11T10:00:17.964+05:30
Connection attempt timed out 2020-06-11T10:00:39.037+05:30 {}

你能让我知道我做错了什么吗?

其次是重试策略

RetryPolicy<Object> retryPolicy = new RetryPolicy<>()
    .handle(HttpClientErrorException.class, TimeoutExceededException.class, Exception.class)
    .withDelay(Duration.ofSeconds(1))
    .withMaxRetries(3);

我想要一次TimeoutExceedeException异常发生在3秒之后,延迟1秒,再次启动请求,最多重试3次。我把它当作

 result = Failsafe.with(retryPolicy,timeout).get(() -> restTemplate.postForEntity(messageSendServiceUrl, request, String.class));

共有1个答案

陆飞鸿
2023-03-14

get是一个阻塞或同步操作,它使用调用线程。故障保护几乎没有办法提前停止。超时最好与异步操作结合使用,通常由*Async方法指示。一定要阅读https://jodah.net/failsafe/schedulers/因为默认值有一些含义,对于IO绑定的操作来说,它通常是一个糟糕的选择。

 类似资料:
  • 我们有一个mongodb副本设置,包含两个成员和一个仲裁器: db1-primary db2-secondary 仲裁者 我假设它可以检查返回到集合的服务器,而不会阻止其他db值。 有什么想法或为什么会发生这种情况?或改善行为的方法?

  • 本文向大家介绍Java中故障快速和故障安全之间的区别,包括了Java中故障快速和故障安全之间的区别的使用技巧和注意事项,需要的朋友参考一下 序号 键 不及格 故障安全 1 例外 集合中的任何更改(例如在线程期间添加,删除和更新集合)都是迭代集合,然后使快速抛出并发修改异常失败。  故障安全集合不会引发异常。  2。 集合类型 ArrayList和hashmap集合是快速失败迭代器的示例  Copy

  • YAML模式被定义为一组标签的组合,并包括用于解析非特定标签的机制。 YAML中的故障安全模式以这样的方式创建,即它可以与任何YAML文档一起使用。 它也被视为通用YAML文档的推荐架构。 类型 故障安全模式有两种类型:通用映射和通用序列。 通用映射 它代表一个关联容器。 这里,每个键在关联中是唯一的,并且映射到恰好一个值。 YAML对键定义没有任何限制。 下面给出了表示通用映射的示例 - JSO

  • 如果应用程序存在连接问题,AWS建议增加KCL(kinesis)的故障切换时间。https://docs.aws.amazon.com/streams/latest/dev/troubleshooting-consumers.html 但我找不到如何更改故障切换时间。 我正在寻找(一个或全部): > node.jskcl包的设置 地形设置

  • 我写了一个多线程应用程序,它广泛使用了async/await。它应该在预定的时间下载一些东西。为此,它使用了“await task.delay”。有时它每分钟发送数千个请求。 它按预期工作,但有时我的程序需要记录一些大的东西。这样做时,它会序列化许多对象并将它们保存到一个文件中。在那段时间里,我注意到我预定的任务执行得太晚了。我已经将所有日志记录放到一个具有最低优先级的单独线程中,这样问题就不再经

  • 我有一个spark作业,它从一个cassandra表中读取数据,并将结果转储回两个表,只需稍作修改。我的问题是这项工作比预期的要长得多。 代码如下: 对于大约一百万条记录,STORE1需要将近40秒,STORE2(对rdd3稍作修改)需要一分钟以上。不确定我哪里出错了,也不知道为什么要花这么多时间。我的火花环境如下: DSE 4.8.9,6个节点70 GB RAM,每个12个内核 任何帮助,不胜感