- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在向休息服务发送并发请求时遇到问题;客户端 (Apache JMeter) 中的消息是某些请求的“连接重置”,具体取决于请求数,例如,我发送 100 个请求并且服务器的响应 100% 成功,但是如果我发送 500 个请求,则 30 % 的响应是错误的。
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:61)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.receiveResponseHeader(MeasuringConnectionManager.java:201)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:517)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:331)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1146)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1135)
at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:434)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261)
at java.lang.Thread.run(Thread.java:745)
我修改了“application.conf”,内容如下:
spray.can {
server {
server-header = spray-can/${spray.version}
ssl-encryption = off
pipelining-limit = 16
idle-timeout = 60 s
request-timeout = 30 s
timeout-timeout = 2 s
timeout-handler = ""
reaping-cycle = 250 ms
stats-support = on
remote-address-header = off
raw-request-uri-header = off
transparent-head-requests = on
chunkless-streaming = off
verbose-error-messages = on
request-chunk-aggregation-limit = 1m
response-header-size-hint = 512
bind-timeout = infinite
unbind-timeout = 1s
registration-timeout = 1s
default-host-header = ""
automatic-back-pressure-handling = on
back-pressure {
noack-rate = 10
reading-low-watermark = infinite
}
parsing = ${spray.can.parsing}
}
client {
user-agent-header = spray-can/${spray.version}
idle-timeout = 60 s
request-timeout = 40 s
reaping-cycle = 250 ms
response-chunk-aggregation-limit = 1m
chunkless-streaming = off
request-header-size-hint = 256
max-encryption-chunk-size = 1m
connecting-timeout = 30s
proxy {
http = default
https = default
}
ssl-tracing = off
parsing = ${spray.can.parsing}
}
host-connector {
max-connections = 80
max-retries = 8
max-redirects = 0
pipelining = enabled
idle-timeout = 30 s
client = ${spray.can.client}
}
}
JVM的设置是:
-Xms1024M
-Xmx2048M
-Xss1M
-XX:MaxPermSize=1024m
重要提示:由于业务逻辑,服务器支持并发事务是必要的;在不到 5 秒的时间内完成 500 个单独的连接(事务)。
最佳答案
您的timeout
设置看起来不错,每秒处理 500 个请求绝对不是问题。
很可能您的请求处理时间太长,即超过 request-timeout
+ timeout-timeout
= 32 秒。你需要检查你的架构,看看它在哪里以及为什么花费这么多时间。这对于常规 Web 服务来说是非常不寻常的,其中大多数请求在毫秒范围内完成。如果你有一些繁重的处理,你必须做的时间比超时时间长,你可以回复 202 Accepted
并在后台进行处理。您可以返回一个 URI,客户端可以在其中检查请求的状态,或者使用回调到客户端或任何其他机制来传达请求已完成。
请记住不要阻塞路由本身,否则您会有效地阻塞所有其他请求并且您可能会遇到超时错误。例如,请参阅此答案:Use a Dispatcher with Spray HttpService .要实现非阻塞请求处理,请参见:How does spray.routing.HttpService dispatch requests? .
故障排除的一些想法:1) 测量处理单个请求所花费的时间,并查看它的扩展性 - 您是否存在资源争用? 2) 检查您的网络和客户端不会导致超时 - 它们的超时应该高于服务器的。
关于java - 连接重置使用 REST 服务(scala/spray),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36487853/
使用 Spray-io 构建我的第一个 servlet 非常简单。 但是 header 中引用的资源从未找到。 ...... 必须将这些资源放在哪个目录中,或者如何引导喷雾在那里查找? 简单的问题,但
我想了解 Spray 中的指令是如何工作的。 As per the documentation : The general anatomy of a directive is as follows:
对于 POST 和 PUT 请求,我使用以下语法: put { entity(as[CaseClass]) { entity => returnsOption(entity).map(r
我正在使用 marathon-lb 运行 DC/OS 1.7。 spray.io 1.3.3 向所有 marathon-lb/HAProxy 健康检查调用返回 400:请求具有相对 URI 并且缺少主
我正在使用 marathon-lb 运行 DC/OS 1.7。 spray.io 1.3.3 向所有 marathon-lb/HAProxy 健康检查调用返回 400:请求具有相对 URI 并且缺少主
我在我的喷雾 jar 服务器中使用以下路径(使用喷雾 1.2): path("my"/"path"){ get{ complete{ val buf:Array[Byte] =
我正在尝试重现 this或 this ,但我不断收到一个我无法修复的错误... 首先,这是我的依赖项: compile 'io.spray:spray-can_2.11:1.3.1' compile
我正在用 Spray 编写一个自定义指令,用于管理任何用户请求的速率限制。 我要一个 LimitManager某个地方将处理每个请求的自定义限制和规则。这个唯一需要的信息LimitManager是 u
我的服务的所有 API 调用都是 HTTP POST,参数在多部分正文中传递。目前我的身份验证如下所示 formField("token".as[String]) { token => auth
喷雾真的很容易,但我在理解路由方面遇到了问题。这就像一只狗有时会取骨头,但通常不会。我错过了什么? 有没有办法查看Spray尝试了哪些路线,以及为什么放弃某些路线?这将基本上解决这个问题。 logRe
如何在Spray-json中正确反序列化嵌套对象? import spray.json._ case class Person(name: String) case class
来自spray.io文档页面: color extract value of parameter “color” as String color.? extract optional value of
我使用 spray 和 akka actor 构建了一个 scala 应用程序。 我的问题是请求是同步的,服务器不能同时管理很多请求。 这是正常行为吗?我该怎么做才能避免这种情况? 这是我的启动代码:
我正在尝试从 Spray 提供大型临时文件。 HTTP 请求完成后,我需要删除这些文件。到目前为止,我找不到这样做的方法...... 我使用的代码类似于 this或者这个: res
Spray-json 依赖于范围内隐式 JsonWriter[T] 的存在调用toJson时在 T 的实例上. 假设我有几个具体子类型的特征,每个子类型都有一个 JsonWriter: trait B
我正在尝试从喷雾路由中的完整指令返回一个列表。 complete { List("hello") } 但是,我收到一个错误 - Expression of type List[String] do
我正在使用喷雾路由来构建一个简单的 HTTP 服务器。该服务器调用许多需要一段时间才能响应(秒)的服务。当并发请求数变得很大时,我们想拒绝请求。否则,大量并发请求会使系统陷入困境,对任何人都不利。 有
我是Spray-Json API的新手,并且试图解析Docker REST API的Json响应。 There是使用Spray-Json解析此Google Map Json响应的一个干净示例: {
我正在使用 Spray-json 将自定义对象列表编码(marshal)到 JSON 中。我有以下案例类及其 JsonProtocol。 case class ElementResponse(name
MyService.scala:33: could not find implicit value for parameter eh: spray.routing.ExceptionHandler 我
我是一名优秀的程序员,十分优秀!