我有一个使用Akka HTTP的服务,我一直在做一些负载测试。在压力下,我发现在调用其他服务端点时,我的服务会偶尔遇到StreamTcpException。
我为每个端点创建一个流,由我的所有actor共享。我正在使用这样的东西:
//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。
任何人都有任何想法为什么会这样?提前谢谢。
答案 0 :(得分:0)
我以前也遇到过同样的问题,对我来说,它工作正常。
val httpClient: Flow[HttpRequest, HttpResponse, Future[Http.OutgoingConnection]] = Http().outgoingConnection(host,port,None,connSetts)
问题地方Source.single(request).via(httpClient)
它无法连接主机,因此我使用代理服务器。
val httpsProxyTransport : ClientTransport = ClientTransport.httpsProxy(InetSocketAddress.createUnresolved("proxyservicesHost", 90))
val connSetts: ClientConnectionSettings = ClientConnectionSettings(system).withTransport(httpsProxyTransport).withIdleTimeout(Duration(180, "second"))
val httpClient: Flow[HttpRequest, HttpResponse, Future[Http.OutgoingConnection]] = Http().outgoingConnection(host,port,None,connSetts)
然后我在httpclient
中传递.via(httpclient)
,它可以工作。