防止客户端超载服务器?

use*_*196 6 java servlets request

我有一个Java servlet,在高峰时段因客户端请求而过载.一些客户端跨越并发请求.有时每秒的请求数量太多了.

我应该实现应用程序逻辑来限制客户端每秒可以发送的请求数吗?这是否需要在应用程序级别完成?

dj_*_*ult 1

处理此问题的两种最常见的方法是在服务器太忙时拒绝请求,或者减慢处理每个请求的速度。

拒绝请求很容易;只需运行固定数量的实例。操作系统可能会也可能不会对一些连接请求进行排队,但通常用户将无法连接。一种更优雅的方法是让服务返回一个错误代码,指示客户端应稍后重试。

较慢地处理请求会需要更多工作,因为它需要将处理请求的 servlet 与在不同线程中执行工作的类分开。您可以拥有比工蜂数量更多的 Servlet。当请求到来时,它接受它,等待工蜂,抓取它并使用它,释放它,然后返回结果。

两者可以通过java.util.concurrent中的类之一进行通信,例如LinkedBlockingQueueThreadPoolExecutor。如果您想真正变得更奇特,您可以使用PriorityBlockingQueue之类的东西来先为某些客户提供服务。

我,我会像 Anon 所说的那样投入更多硬件;)