akka-http客户端singleRequest在可能的主机列表上循环

时间:2017-11-20 13:31:11

标签: scala client akka-http round-robin

我正在使用akka-http客户端Http().singleRequest(uri = Uri(hostUri))

向另一项服务发送请求

我有一个群集主机列表 - hosts: List[String]。我想使用某种循环方式将请求发送给其中任何一个,而其他请求将用作备份,以防请求失败。

2 个答案:

答案 0 :(得分:0)

从问题看来,您似乎完全理解需要实施的内容。究竟是什么挑战你?如何进行随机/循环或如何在发生故障时提出其他请求?我认为不是第一个,因为那些勇于开始使用akka-http的人知道如何进行随机化。对于第二部分,我建议从调度库中查看可重复的Future:

https://www.bimeanalytics.com/engineering-blog/retrying-http-request-in-scala/

答案 1 :(得分:0)

起初我认为实施会很长,我想念的工具会让它更简单。 最终我发现 很容易递归实现

  def autorecoveredRequest(
    hosts: List[String],
    hostToRequest: (String) => HttpRequest)(
    implicit ec: ExecutionContext): Future[HttpResponse] =
    Random.shuffle(hosts) match {
      case host :: rest =>
        Http().singleRequest(hostToRequest(host)).recoverWith {
          case e =>
            log.warn(s"Request to host ${host} failed")
            autorecoveredRequest(rest, hostToRequest)
        }
      case Nil =>
        log.error("No more hosts to recover request")
        Future.failed(new Exception("No more hosts to recover request"))
    }

这里唯一可能缺少的是每个主机请求重试,在我的情况下不是问题