【发布时间】:2011-08-16 09:41:17
【问题描述】:
在我目前正在编写的基于 servlet 的应用程序中,我们为读取器和写入器提供了单独的线程类。使用LinkedBlockingQueue<byte[]> 将数据从写入器传输到多个读取器,因此如果没有从写入器获取的新数据,读取器会安全地阻塞。问题是,如果这些读取器线程服务的远程客户端终止连接,Tomcat 不会抛出损坏的管道,除非写入器发送新数据并尝试将这个新块传输到远程客户端。换句话说,可以对我们的服务执行以下攻击:
- 启动流式写入请求,并且根本不向其中写入任何数据。
- 继续创建和删除读取连接。由于写入器不产生任何数据,因此连接到写入器的读取线程将保持阻塞并消耗内存和其他资源。
- 观察服务器快速耗尽内存。
我是否应该创建一个维护线程来监视属于 阻塞 读取器线程的套接字并将interrupt() 发送给似乎与各自客户端失去连接的那些?上述架构中是否存在任何重大缺陷?谢谢。
【问题讨论】:
-
您可以限制每个 IP 地址允许的传入连接数。
-
分布式攻击并不是什么新鲜事,这不太可能缓解这个问题。
-
那么keepalives和通信异常中断怎么办?
标签: java multithreading tomcat6