我正在使用akka-http客户端Http().singleRequest(uri = Uri(hostUri))
我有一个群集主机列表 - hosts: List[String]
。我想使用某种循环方式将请求发送给其中任何一个,而其他请求将用作备份,以防请求失败。
答案 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"))
}
这里唯一可能缺少的是每个主机请求重试,在我的情况下不是问题