繁体   English   中英

Http4s Blaze Client Builder 等待队列满失败

[英]Http4s Blaze Client Builder wait queue full failure

我们有一个用例,对于单个传入请求,微服务必须向其他微服务发出许多(在最坏的情况下接近 1000 个)传出 HTTP 调用以获取 GET 一些详细信息。 我们的服务是使用 Scala、Http4s 和 Cats-Effect 构建的,并且使用 http4s-blaze-client 库进行出站 HTTP 调用。

目前在生产中,我们看到了失败org.http4s.client.WaitQueueFullFailure: Wait queue is fullorg.http4s.client.PoolManager: Max wait queue limit of 1024 reached, not scheduling 一旦服务进入这种状态,它就永远不会从中恢复,我们就完全被阻塞了。

下面是我们正在使用的 Blaze 客户端配置:

BlazeClientBuilder[F](global)
  .withMaxWaitQueueLimit(1024)
  .withRequestTimeout(20.seconds)
  .resource
  .map { client =>
      ResponseLogger(logHeaders = false, logBody = true)(
      RequestLogger(logHeaders = true, logBody = true, redactHeadersWhen = Middleware.SensitiveHeaders)(client)
    )
  }

最初,我们使用默认设置 256 作为最大等待队列限制,但后来决定增加到 512,然后增加到 1024。目前,即使 1024 也无法正常工作。

我不确定当出站 HTTP 请求缓慢或超时时是否会发生这种情况。 API 响应有时可能很慢(但仍会在我们设置的 20 秒超时内返回)。 但是我没有足够的证据来声称这里就是这种情况。

我们目前使用的是 http4s-blaze-client_2.13:0.21.0-M6 版本。

我不确定进一步增加等待队列大小是否会有所帮助。 是否可以在服务中实现自定义逻辑来检查等待队列大小并在向客户端提交请求之前等待? 请告知如何解决此问题。 任何帮助将非常感激。

好吧,根据评论maxWaitQueueLimit只是“在任何特定时间等待连接的最大请求数”。 那么检查等待队列大小并等待它是否已满有什么意义呢? http4s 已经在等你了。 主要区别在于,如果您自己实现等待(例如,通过使用信号量并在每次执行 HTTP 请求时获取许可),那么您可以等待的请求数量没有限制。 这意味着当您的服务器负载很高时,您将耗尽内存并崩溃。 这大概是maxWaitQueueLimit应该首先防止的。

现在,当您执行大量请求时,它们首先都会进入 http4s 等待队列,除了那些可以找到连接的请求。 maxTotalConnections的默认值为 10,因此当您触发 1000 个请求时,990 将最终进入等待队列。 如果在那一刻有另一个请求触发超过 34 个请求,那么您已经溢出了等待队列。 考虑到您的情况,进一步增加maxWaitQueueLimit对我来说似乎是完全合理的。 假设你不能以某种方式减少所需的 HTTP 请求的数量,也就是说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM