【发布时间】:2019-03-18 19:26:03
【问题描述】:
我有一个使用 Akka HTTP 的服务,我一直在做一些负载测试。在压力下,我发现我的服务在调用其他服务端点时偶尔会遇到 StreamTcpException。
我为所有参与者共享的每个端点创建一个流。我正在使用这样的东西:
//this is done only once
val connectionFlow = Http(sys).outgoingConnection("host_name")
...
//each actor does this
val response = Source.single(HttpRequest(...)).via(connectionFlow).runWith(Sink.head)
我使用 Apache JMeter 对我的服务进行负载测试,并且使用 40 个线程,通常需要 2000-4000 个请求才能看到我的第一条错误消息。有 10 个线程,我花了 9000 个请求才看到它。
消息如下所示:
akka.stream.StreamTcpException: Tcp command [Connect(<host_here>/<ip_here>,None,List(),Some(10 seconds),true)] failed
实际上,我的服务所依赖的 4 个不同端点有 4 个单独的流。如果我的服务失败,我通常会从所有四个中看到 StreamTcpException。
有人知道为什么会这样吗?提前致谢。
【问题讨论】:
-
StreamTcpException 的消息是什么?
-
@johanandren
akka.stream.StreamTcpException: Tcp command [Connect(<host_here>/<ip_here>,None,List(),Some(10 seconds),true)] failed -
嗯,恐怕没有多大帮助。您是否尝试过打开调试日志以查看是否可以提供任何进一步的见解? (有趣的东西应该来自 TcpOutgoingConnection 演员)
-
@johanandren 是的,不幸的是,这是一条非常模糊的错误消息。我刚刚打开了调试日志记录,但是当我收到错误时,我没有看到来自 TcpOutgoingConnection 的任何内容(也许我做错了什么?)。
-
本地可用端口可能已用完,因为它们的回收速度不够快。您是否考虑过为每个出站请求使用主机连接池而不是新连接?这应该会减少端口流失,并且对于像这样的高负载场景来说效率更高。