1

问题:

如何配置ring-jetty-adapter来限制并发工作线程的数量?我在这里使用嵌入式码头,而不是创建 WAR 文件或类似的东西。

语境

我的数据库连接池中只有20个连接,所有请求都需要做数据库查询。目前,当服务器负载变高时,比如连续 40 个并发请求,其中 20 个将被阻塞等待 DB。然后队列将继续建立,等待将失去控制(线程饥饿)。

:max-threads参数不符合我的要求,因为它只限制了 jettys 内部线程池的大小,它用于接受和选择器线程,而不仅仅是工作线程。

经过一些研究,我认为我需要使用的是码头 QoS 过滤器,但我无法弄清楚如何将 web.xml 配置转换为我的 clojure ring 应用程序。

4

1 回答 1

1

首先,您无法通过调整线程配置来控制或限制行为。

每个请求 1 个线程的老派模型在现代容器上无效,尤其是在内部 100% 异步的 Jetty 上。

单个请求可以在该请求的生命周期内使用 1...n 个线程。Jetty 中的线程行为受您的技术选择(例如:操作系统、jvm、网络协议等)和 API 选择的影响,甚至受服务器压力的影响。

除此之外,您所需的解决方案应该专注于限制特定服务器资源端点可以同时使用的请求数量。

这样做的方法是限制可以同时访问服务器资源端点的活动请求的数量。

这是通过跟踪对该特定资源端点的请求数,然后暂停超过配置的最大值的请求,当活动计数低于配置的最大值时恢复暂停的请求,以及超时处于暂停状态的请求来实现的长。

此功能集在 Jetty 中为您提供QoSFilter

您可以将 JettyQoSFilter用于 Jetty 中基于 Jetty ServletContextHandler(包括WebAppContext)的任何内容。

见:https ://www.eclipse.org/jetty/documentation/jetty-9/index.html#qos-filter

FilterHolder qosConfig = servletContextHandler.addFilter(QoSFilter.class,
    "/api/backend/*", 
    EnumSet.of(DispatcherType.REQUEST));
qosConfig.setInitParameter("maxRequests", "10");
qosConfig.setInitParameter("waitMs", "50");
qosConfig.setInitParameter("suspendMs", "-1");
于 2021-06-18T15:21:56.660 回答