由于 SSL 连接已经在喷雾中关闭错误,如何修复 Dropping Close

Posted

技术标签:

【中文标题】由于 SSL 连接已经在喷雾中关闭错误,如何修复 Dropping Close【英文标题】:How to fix the Dropping Close since the SSL connection is already closing error in spray 【发布时间】:2015-06-06 11:36:42 【问题描述】:

我正在调用 API,但大多数时候我一直收到错误消息:“Dropping Close since the SSL connection is already closing”和“Premature connection close (服务器似乎不支持请求管道)。”就像 90% 的时间我得到那个错误,意思是:在非常罕见的情况下,查询确实返回了它应该返回的数据。

为了确保这不是 API 的服务器问题,我使用 Node.js(Express 和 Request 库)复制了相同的查询,并且每次都能正常工作。这让我几乎可以肯定是喷虫

这是代码示例

case class MyClass(user: String, pass: String)

class MyActor extends Actor 
  import spray.client.pipelining._
  import spray.http.BasicHttpCredentials
  import spray.http.HttpRequest,HttpResponse
  import scala.concurrent.Future

  import context.dispatcher

  def receive = 
    case myClass: MyClass => 
      val credentials: BasicHttpCredentials = BasicHttpCredentials(myClass.user, myClass.pass)
      val url: String = "https://myApi?params=values"
      val request: HttpRequest = Get(url) ~> addCredentials(credentials)
      val pipeline = sendReceive
      val response: Future[HttpResponse] = pipeline(request)
      val finalRes: Future[String] = response.map r =>
        println(r)
        r.entity.asString
      
      finalRes pipeTo sender
    
   // end receive
 //end Actor

错误详情

04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-8] a.i.TcpOutgoingConnection - Attempting connection to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] a.i.TcpOutgoingConnection - Connection established to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpClientConnection - Connected to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-9] s.c.c.HttpHostConnectionSlot - Connection to ... established, dispatching 1 pending requests
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - now monitoring Actor[akka://on-spray-can/system/IO-TCP/selectors/$a/5]
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpHostConnectionSlot - Dispatching GET request to /api?params=values across connection Actor[akka://on-spray-can/user/IO-HTTP/group-0/4]
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpHostConnectionSlot - now monitoring Actor[akka://on-spray-can/user/IO-HTTP/group-0/4]
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - Dropping Close since the SSL connection is already closing
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - Connection was PeerClosed, awaiting TcpConnection termination...
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] a.i.TcpOutgoingConnection - stopped
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - TcpConnection terminated, stopping
04/01 10:19:06 WARN [on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpHostConnectionSlot - Premature connection close (the server doesn't appear to support request pipelining) in response to GET request to /myApi?params=values with 1 retries left, retrying...
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - stopped

我能够在所有这些版本中重现错误

spray 1.0.1; akka 2.0.5; scala 2.9.3
spray 1.2.1; akka 2.2.4; scala 2.10.1
spray 1.3.1; akka 2.3.0; scala 2.10.3
spray 1.3.2; akka 2.3.6; scala 2.11.4
spray 1.3.3; akka 2.3.9; scala 2.11.6

【问题讨论】:

我看到了类似的行为。在我的情况下,喷雾罐正试图向我的应用程序参与者发送一条消息,但 PeerClosed 消息似乎对它进行了 gazump 并且消息被丢弃。 我也在 spray.io 谷歌群组中发布了这个问题:groups.google.com/forum/#!topic/spray-user/w0oeFC7eJ_s 我认为它与您拥有的 JVM 或另一端的 SSL 有关。您是否尝试过使用某些 API 客户端并发出请求?至少写下,你使用哪个 JVM 版本。 您尝试连接的服务器是基于 akka-http/spray 的服务器吗?在这种情况下检查 akka-http 配置。 【参考方案1】:

如你所说,

为了确保这不是 API 的服务器问题,我复制了相同的 使用 Node.js(Express 和 Request 库)进行查询,它适用于每个 时间。这让我几乎可以肯定是喷虫。

您在 scala 中的代码使用 HTTP 流水线功能发送请求,您在使用 nodejs 进行测试时是否使用 HTTP 流水线功能发送请求?

错误信息:

服务器似乎不支持请求管道

你应该确保:

    请确保服务器支持流水线功能,并且流水线功能已启用。 如果您的客户端和服务器之间有代理(包括反向代理),请确保代理支持流水线功能,并且启用了流水线功能。

如果您不能确保流水线功能能够得到正确支持,则不应使用它。

以下资源可能会有所帮助:

HTTP 流水线需要客户端和服务器都支持。 需要符合 HTTP/1.1 的服务器来支持流水线。这 并不意味着服务器需要管道响应,而是 如果客户选择流水线,他们必须不失败 请求。[7]

https://en.wikipedia.org/wiki/HTTP_pipelining

现代浏览器默认不激活 HTTP 管道:

有缺陷的代理仍然很常见,这些会导致奇怪和不稳定 Web 开发人员无法轻松预见和诊断的行为。 流水线的正确实现很复杂:资源的大小 被转移,将使用的有效 RTT,以及 有效带宽,对改善有直接影响 由管道提供。在不知道这些重要信息的情况下 可能会落后于不重要的。甚至重要的概念 在页面布局期间演变!因此,HTTP 流水线带来了 仅在大多数情况下略有改善。流水线受制于 霍尔问题。由于这些原因,流水线已被 HTTP/2 使用的更好的算法,多路复用。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x$revision/1330814

【讨论】:

以上是关于由于 SSL 连接已经在喷雾中关闭错误,如何修复 Dropping Close的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ZF3 应用程序的功能 PHPUnit 测试中关闭数据库连接并减少它们的数量?

如何在android中关闭数据连接?

如何在 SwiftMailer 中关闭 SMTP 连接

Websocket 连接不会在 FireFox 中关闭

如何在 jmeter 中关闭 JDBC 连接

如何在 Apollo 中关闭 GraphQL 订阅的套接字连接