环形码头适配器-限制并发请求



问题:

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

上下文

我的数据库连接池中只有20个连接,所有请求都需要进行数据库查询。目前,当服务器负载变高时,比如说连续有40个并发请求,其中20个请求将被阻止等待DB。然后,队列将不断增加,等待将失控(线程饥饿(。

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

经过一些研究,我认为我需要使用jetty QoS过滤器,但我不知道如何将web.xml配置转换为我的clojure环应用程序。

首先,不能通过调整线程配置来控制或限制行为。

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

一个请求在其整个生命周期中可以使用1…n个线程。Jetty中的线程行为受您的技术选择(例如:os、jvm、网络协议等(和API选择的影响,甚至受您的服务器压力的影响

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

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

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

此功能集在码头QoSFilter中为您提供。

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

请参阅:https://www.eclipse.org/jetty/documentation/jetty-9/index.html#qos-过滤

FilterHolder qosConfig = servletContextHandler.addFilter(QoSFilter.class,
"/api/backend/*", 
EnumSet.of(DispatcherType.REQUEST));
qosConfig.setInitParameter("maxRequests", "10");
qosConfig.setInitParameter("waitMs", "50");
qosConfig.setInitParameter("suspendMs", "-1");

最新更新