Java 防止客户端过载服务器?

Java 防止客户端过载服务器?,java,servlets,request,Java,Servlets,Request,我有一个Java servlet,它在高峰时间被客户端请求超载。有些客户端跨越并发请求。有时,每秒的请求数量实在太多了 我应该实现应用程序逻辑来限制客户端每秒可以发送的请求数吗?是否需要在应用程序级别执行此操作?处理此操作最常用的两种方法是在服务器太忙时拒绝请求,或者处理每个请求的速度较慢 拒绝请求很容易;只需运行固定数量的实例。操作系统可能会也可能不会对一些连接请求排队,但一般来说,用户将无法连接。一种更优雅的方法是让服务返回一个错误代码,指示客户端应该稍后重试 处理请求的速度要慢一些,因为它

我有一个Java servlet,它在高峰时间被客户端请求超载。有些客户端跨越并发请求。有时,每秒的请求数量实在太多了


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

处理此操作最常用的两种方法是在服务器太忙时拒绝请求,或者处理每个请求的速度较慢

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

处理请求的速度要慢一些,因为它需要将处理请求的servlet与在不同线程中处理请求的类分开。您可以拥有比工蜂更多的servlet。当一个请求进来时,它接受它,等待工蜂,抓住它并使用它,释放它,然后返回结果

这两个类可以通过中的一个类进行通信,如或。如果你想得到真正的花式,你可以使用像a这样的东西先为一些顾客服务


如果是我,我会像Anon说的那样向它扔更多的硬件;)

这里有一些可靠的答案。我认为更多的硬件是最好的选择。拥有太多的客户或流量通常是一个很好的问题

但是,如果您必须限制客户端,则有一些选择

我见过的最具可扩展性的解决方案是围绕分布式缓存系统(如Memcached)展开的,并使用整数来保持计数

计算系统处理流量的速率。整体或每个客户。然后将表示该速率的计数放入memcached。每次收到请求时,减小该值。定期增加计数器以允许更多流量通过

例如,如果每秒可以处理10个请求,则每5秒计数50次,最多50次。这样你就不会一直在加油了,但是你也可以处理一个窗口内的一些爆裂。您需要进行实验以找到一个好的刷新率。此计数器的密钥可以是全局密钥,也可以基于用户id(如果需要以这种方式进行限制)

这个系统的优点在于它可以跨整个集群工作,并且重新填充计数器的机制不需要在当前的服务器中。您可以为其指定一个单独的流程。加载的服务器只需要检查并减少它


尽管如此,我还是会先调查其他的选择。扼杀你的客户通常是让他们烦恼的好方法。很可能不是最好的主意。:)

我假设您无法(通过硬件或软件)增加容量,您只需要限制服务器上的外部负载

应该避免在应用程序中处理这一问题,除非您有非常特殊的需求,而这些需求是在HTTP服务器级别上运行的现有解决方案无法满足的。对此问题已经进行了大量的思考,因此值得研究现有的解决方案,而不是自己实施

如果您使用的是Tomcat,则可以通过maxThreads和acceptCount设置配置允许的最大并发请求数。有关这些的更多信息,请阅读上的介绍


对于更高级的控件(如每用户限制),如果您通过Apache代理,可以使用各种模块来帮助处理这种情况。谷歌的几个模块是limitipconn、mod_bw和mod_cband。与appserver可能提供的基本控件相比,设置和理解这些控件要困难得多,因此您可能只想坚持使用这些控件。

只要所有请求都有效,那么我同意Anon的说法,投入更多硬件(最简单)或优化java servlet。如果请求是垃圾邮件,那么您可以使用iptables或apache级别的blocks在较低的层阻止它们。这个问题是有效的。总有比硬件能够处理的请求更多的请求。服务器需要一种方法来限制请求,并在负载过大时关闭系统。瓶颈在哪里?使用最多带宽的人是您最大的客户吗?在这种情况下,你不想让他们慢下来。如果您需要更多帮助,请提供更多信息。也许你只需要优化一些查询就能让一切顺利进行?答案不错。为了利用添加的CPU和RAM,我是否必须在Tomcat的config for Tomcat中增加连接器的maxThreads?我应该在服务器模式下运行tomcat吗?@user121196:已经有一段时间了,你的接受率很低。请帮每个人一个忙,或者选择一个答案,或者给我们更多的信息,这样我们可以帮助你更多。你会发现你得到了越来越多更好的帮助,接受率也越来越高。如果你成功地扼杀了一个客户,你就必须解释死亡的原因。但他们不会再生气了:-)剥客户皮的方法不止一种。。。猫。