Dropwizard/Jetty REST 调用在中轻负载下返回 http 状态 202
Dropwizard/Jetty REST calls returning http status 202 under moderate-to-light load
我 运行 遇到基于 dropwizard 0.7.1.3 构建的休息服务的问题,我相信它嵌入了 Jetty 0.9.7.1.v20131107。
该服务有各种 REST 端点设置,其中一些用于提交后台任务,一些用于检查所述作业的状态,最后一些用于在作业完成时检索作业结果.要明确... none 这些端点明确 returning 202.
我目前正在对应用程序进行一些负载测试,它模拟多个用户同时访问服务以提交作业、检查其状态并检索结果。对于大约 30 名用户在 30 秒内加速的模拟,在几分钟内向服务提交了大约 3500 个请求。平均速率约为 16/秒。在此期间,我偶尔会从某些端点看到 return of 202 http 状态代码。如果我增加用户数量,202 的频率也会增加。
在负载测试期间分析应用程序时,CPU 和堆 space 可用似乎都保持在合理范围内。垃圾回收也是如此。此外,正在使用的线程数远低于服务的最大设置,即大约 1024...我看到可能分配了 175 个。
我现在似乎无法弄清楚是什么导致了这些 202。我试过在放置向导配置中增加接受器线程、选择器线程等设置,但它们无助于缓解问题。
我尝试在谷歌上搜索有关导致 Jetty return 202 的情况的信息,但我也找不到任何有用的信息。
有没有人遇到过这样的问题?谁能告诉我在什么情况下 Jetty 会决定 return 202 而不是实际处理请求?以及我可以改变什么来缓解这个问题?
16 requests/second 的平均速率足以保证 returning 202 对我来说没有意义。如果有任何其他信息可能有助于诊断此问题,请告诉我。
注意:这个问题太不清楚了,我会标记它。但是我的评论不符合尺寸要求。
如果你 absolutely sure
是 Jetty
的罪魁祸首,你可以检查 Jetty QoS or DoS 过滤器的一些奇怪配置。他们的默认 return 代码是 HTTP 503 Service unavailable
但 return 代码是可配置的。
IMO HTTP 202
状态代码的 return 似乎是应用程序的预期行为。
IANA
处的 HTTP 状态代码官方注册表指出:
202 Accepted
RFC7231, Section
6.3.3
The 202 response is intentionally noncommittal. Its purpose is to
allow a server to accept a request for some other process (perhaps a
batch-oriented process that is only run once per day) without
requiring that the user agent's connection to the server persist until
the process is completed. The representation sent with this response
ought to describe the request's current status and point to (or embed)
a status monitor that can provide the user with an estimate of when
the request will be fulfilled.
作为面向批处理的过程,您可以想象将几 GB 的文件导出到某些 Web 服务器或类似 S3 的对象存储。服务器接受了请求,成功地指示了该过程中涉及的其他系统,并告诉您任务已启动。它不能立即提供结果。您何时何地可以找到结果取决于应用程序,必须使用它的文档进行检查。
最后,我们发现公司内部库中确实有一些代码在非常特殊的情况下返回 202。
我 运行 遇到基于 dropwizard 0.7.1.3 构建的休息服务的问题,我相信它嵌入了 Jetty 0.9.7.1.v20131107。
该服务有各种 REST 端点设置,其中一些用于提交后台任务,一些用于检查所述作业的状态,最后一些用于在作业完成时检索作业结果.要明确... none 这些端点明确 returning 202.
我目前正在对应用程序进行一些负载测试,它模拟多个用户同时访问服务以提交作业、检查其状态并检索结果。对于大约 30 名用户在 30 秒内加速的模拟,在几分钟内向服务提交了大约 3500 个请求。平均速率约为 16/秒。在此期间,我偶尔会从某些端点看到 return of 202 http 状态代码。如果我增加用户数量,202 的频率也会增加。
在负载测试期间分析应用程序时,CPU 和堆 space 可用似乎都保持在合理范围内。垃圾回收也是如此。此外,正在使用的线程数远低于服务的最大设置,即大约 1024...我看到可能分配了 175 个。
我现在似乎无法弄清楚是什么导致了这些 202。我试过在放置向导配置中增加接受器线程、选择器线程等设置,但它们无助于缓解问题。
我尝试在谷歌上搜索有关导致 Jetty return 202 的情况的信息,但我也找不到任何有用的信息。
有没有人遇到过这样的问题?谁能告诉我在什么情况下 Jetty 会决定 return 202 而不是实际处理请求?以及我可以改变什么来缓解这个问题?
16 requests/second 的平均速率足以保证 returning 202 对我来说没有意义。如果有任何其他信息可能有助于诊断此问题,请告诉我。
注意:这个问题太不清楚了,我会标记它。但是我的评论不符合尺寸要求。
如果你 absolutely sure
是 Jetty
的罪魁祸首,你可以检查 Jetty QoS or DoS 过滤器的一些奇怪配置。他们的默认 return 代码是 HTTP 503 Service unavailable
但 return 代码是可配置的。
IMO HTTP 202
状态代码的 return 似乎是应用程序的预期行为。
IANA
处的 HTTP 状态代码官方注册表指出:
202 Accepted
RFC7231, Section 6.3.3The 202 response is intentionally noncommittal. Its purpose is to allow a server to accept a request for some other process (perhaps a batch-oriented process that is only run once per day) without requiring that the user agent's connection to the server persist until the process is completed. The representation sent with this response ought to describe the request's current status and point to (or embed) a status monitor that can provide the user with an estimate of when the request will be fulfilled.
作为面向批处理的过程,您可以想象将几 GB 的文件导出到某些 Web 服务器或类似 S3 的对象存储。服务器接受了请求,成功地指示了该过程中涉及的其他系统,并告诉您任务已启动。它不能立即提供结果。您何时何地可以找到结果取决于应用程序,必须使用它的文档进行检查。
最后,我们发现公司内部库中确实有一些代码在非常特殊的情况下返回 202。