【问题标题】:How to reject request from client using Jetty config in kairosdb如何在 kairosdb 中使用 Jetty 配置拒绝来自客户端的请求
【发布时间】:2019-04-14 14:17:54
【问题描述】:

我正在使用 kairosdb 最新版本。我尝试启用码头线程池。我的期望是,如果队列大小被请求填充,那么所有后续请求都会立即被拒绝。 但是即使我看到了,请求也会在一段时间后得到处理

 java.util.concurrent.RejectedExecutionException

如果队列已满,则应拒绝客户端请求。如何达到同样的效果?

为了测试,我添加了这些参数。

kairosdb.jetty.threads.queue_size=2 #queue
kairosdb.jetty.threads.min=2 # minThread
kairosdb.jetty.threads.max=4 #maxThread
kairosdb.jetty.threads.keep_alive_ms=1000

对应的jetty线程池代码

new ExecutorThreadPool(minThreads, maxThreads, keepAliveMs, TimeUnit.MILLISECONDS, queue);

kairosdb中使用的jetty版本是8.1.16

【问题讨论】:

    标签: jetty kairosdb end-of-life


    【解决方案1】:

    Jetty 8.1.16 于 2014 年 9 月发布,现在是 EOL (End of Life),请考虑使用最新、稳定且受支持的 Jetty 版本。 (如码头9.4.12.20180830

    你得到一个java.util.concurrent.RejectedExecutionException 的事实表明你没有足够的线程池配置。

    您拥有的线程池配置非常小。

    这仅适用于单核、单 CPU、单线程硬件配置。为什么?好吧,那是因为您的 cpu/core/thread 硬件配置决定了您的 NIO 行为,并规定了对线程池的最低要求。

    在 2009 年(将近 10 年前!)的 MacOS 笔记本电脑上,您至少需要 9 个线程才能支持在该硬件上发出单个阻塞 REST 请求的单个连接。

    在现代 Ryzen Threadripper 系统上,您通常需要至少 69 个线程来支持在此硬件上发出单个阻塞 REST 请求的单个连接。

    另一方面,您的配置非常适合 Raspberry Pi Zero,并且可以支持大约 3 个连接,每个连接有 1 个请求活动。

    使用该配置,您将只能处理简单的串行请求,而您的应用程序不使用任何异步处理或异步 I/O 行为。为什么?这是因为即使是典型的现代网页也需要至少 40 个左右的线程数,这取决于浏览器如何利用您的服务器。

    ExecutorThreadPool 对于您的情况也是一个糟糕的选择(仅适用于高并发环境,考虑 24+ cpu/cores,并且最低线程配置高于 500,通常为数千)。

    您最好使用标准 QueuedThreadPool,它在低端性能更高,并且能够增长以应对需求(随着时间的推移,随着需求的减少,您可以缩减资源利用率以降低资源利用率)。

    QueuedThreadPool(在 Jetty 9.4.x 中)还具有针对不良配置的保护功能,如果配置不足以满足您的硬件配置、您在 Jetty 中选择的一组功能或您在 Jetty 中的特定配置,它会向您发出警告。

    如果您想在资源不足时拒绝连接,请考虑使用DoSFilter(或者如果您想更温和,请考虑使用QoSFilter)。

    尝试通过 ThreadPool 限制使用永远不会奏效,因为为了拒绝连接,需要一个线程来接受它(接受者线程,每个服务器连接器一个),另一个来处理 NIO 事件(选择器线程,共享资源,处理多个连接),另一个处理请求(返回http状态码503)。

    如果您想在自己的代码(不是 Jetty)中实现,您可能只需要编写一个 Filter 来计算活动交换(请求和响应)并在计数高于某个可配置数字时强制返回 503 响应状态。

    但如果您这样做,您可能应该强制关闭所有响应。又名Connection: close 响应头,不允许持久连接。

    【讨论】:

    • 上面使用的值只是为了测试和了解如何限制请求的数量。关于 jetty 组件的升级,需要花费一些精力和时间,因为我需要在 kairosdb 组件中升级它并进行测试。有没有办法在 jetty 8.X 中限制客户端请求?
    • QosFilter 正在使用最少的代码更改,因为它必须添加到嵌入式码头中。
    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多