Как исправить ошибку Dropping Close, поскольку соединение SSL уже закрывается в спрее

Я делаю вызов API, но большую часть времени получаю сообщение об ошибке: «Закрыть, поскольку соединение SSL уже закрывается» и «Преждевременное закрытие соединения (сервер не поддерживает конвейерную обработку запросов)». Примерно в 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

person mayacr86    schedule 01.04.2015    source источник
comment
Я наблюдаю подобное поведение. В моем случае аэрозольный баллончик пытается отправить моему актеру приложения сообщение, но появляется сообщение PeerClosed, и сообщение удаляется.   -  person Sarge    schedule 07.04.2015
comment
Я также разместил сообщение о проблеме в группе google spray.io: groups.google .com/forum/#!topic/spray-user/w0oeFC7eJ_s   -  person mayacr86    schedule 07.04.2015
comment
Я думаю, что это связано либо с JVM, которая у вас есть, либо с SSL на другой стороне. Вы пытались использовать какой-либо API-клиент и сделать запрос? Хотя бы напишите, какую версию JVM вы используете.   -  person bkowalikpl    schedule 22.06.2017
comment
Является ли сервер, к которому вы пытаетесь подключиться, сервером на основе akka-http/spray? В этом случае проверьте конфигурацию akka-http.   -  person Shankar Shastri    schedule 17.09.2018


Ответы (1)


как ты сказал,

Чтобы убедиться, что это не проблема сервера API, я повторяю один и тот же запрос с помощью Node.js (Express и Request libs), и он работает каждый раз. Это делает меня почти уверенным, что это жук-распылитель.

ваш код в scala отправляет запросы с функцией конвейерной обработки HTTP, вы отправляете запросы с функцией конвейерной обработки HTTP во время тестирования с помощью nodejs?

для сообщения об ошибке:

сервер не поддерживает конвейерную обработку запросов

вы должны убедиться:

  1. убедитесь, что сервер поддерживает функцию конвейерной обработки, и функция конвейерной обработки включена.
  2. если между вашим клиентом и сервером есть прокси-серверы (включая обратный прокси-сервер), убедитесь, что прокси-серверы поддерживают функцию конвейерной обработки, а функция конвейерной обработки включена.

Если вы не можете убедиться, что функция конвейерной обработки поддерживается должным образом, вам не следует ее использовать.

следующий ресурс может быть полезен:

Конвейерная обработка HTTP требует, чтобы и клиент, и сервер поддерживали ее. Для поддержки конвейерной обработки требуются серверы, соответствующие HTTP/1.1. Это не означает, что серверы должны передавать ответы по конвейеру, но что они должны не выходить из строя, если клиент решит передать запросы по конвейеру.[7]

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

Конвейерная обработка HTTP не активирована по умолчанию в современных браузерах:

Ошибочные прокси-серверы все еще распространены, и это приводит к странному и неустойчивому поведению, которое веб-разработчики не могут легко предвидеть и диагностировать. Конвейерную обработку сложно реализовать правильно: размер передаваемого ресурса, фактическое значение RTT, которое будет использоваться, а также эффективная пропускная способность напрямую влияют на улучшение, обеспечиваемое конвейером. Не зная этого, важные сообщения могут быть задержаны за неважными. Понятие важного меняется даже во время макета страницы! Таким образом, конвейерная обработка HTTP в большинстве случаев дает лишь незначительное улучшение. Конвейерная обработка подвержена проблеме HOL. По этим причинам конвейерная обработка была заменена лучшим алгоритмом, мультиплексированием, который используется в HTTP/2.

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

person 张飞飞飞飞飞    schedule 07.04.2018