如何设置servlet中并发请求数的限制?

lam*_*988 4 java servlets

我得到了这个servlet,它将pdf文件返回给客户端Web浏览器.我们不想冒任何风险,当请求数量过多时,服务器就会瘫痪.

我们希望以应用程序级别(程序)方式设置并发请求数量的限制,并在达到限制时向浏览器返回错误消息.我们需要在应用程序级别执行它,因为我们在开发级别(tomcat)和生产级别(websphere)中有不同的servlet容器.

我必须强调,我想控制最大请求数而不是会话数.用户可以使用相同的会话通过服务器发送多个请求.

任何的想法?我曾考虑使用静态计数器来跟踪请求的数量,但这会引发竞争条件的问题.

Whi*_*g34 19

我建议写一个简单的servlet Filter.在您的配置中web.xml应用于您希望限制并发请求数的路径.代码看起来像这样:

public class LimitFilter implements Filter {
    private int limit = 5;
    private int count;
    private Object lock = new Object();

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        try {
            boolean ok;
            synchronized (lock) {
                ok = count++ < limit;
            }
            if (ok) {
                // let the request through and process as usual
                chain.doFilter(request, response);
            } else {
                // handle limit case, e.g. return status code 429 (Too Many Requests)
                // see http://tools.ietf.org/html/rfc6585#page-3
            }
        } finally {
            synchronized (lock) {
                count--;
            }           
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以把这个逻辑放进你的HttpServlet.它只是更清洁,更可重复使用Filter.您可能希望通过web.xml而不是对其进行硬编码来配置限制.

参考:
检查HTTP状态代码429的定义.

  • @ gunbuster363:同步不在整个请求周围(这肯定不会起作用,它将它限制为一个并发).仅在检查周围查看是否已达到限制.它的开销非常短且非常小.多年来我使用了一个更为复杂的版本,效果很好.尝试一下,让servlet睡眠10秒钟并发出一堆请求.只有5(或你的限制)将同时运行. (2认同)