我处于这样一种情况,我将接收多个请求,处理来自请求的数据,然后使用 POST 将数据转发到另一台服务器。可能有数千个请求同时发送到服务器。我以前从未处理过这种体积,所以我不得不对如何进行进行一些(有根据的)猜测。
我正在使用 Jave EE 应用程序服务器,并且使用 org.apache.client.HttpClient 作为 POST 请求转发数据。每个数据包都比较小(每个数据包 50-100kb)这是我目前的策略:
当收到请求时,我会立即生成一个新线程以处理和发送数据(每个请求一个线程)。我正在使用 java.util.concurrent.ThreadPoolExecutor 和 java.util.concurrent.ArrayBlockingQueue 来控制线程和排队。如果线程池中的所有线程都在使用,则传入数据会排队。如果队列已满,则数据将被丢弃(我对此完全满意)。我正在关注有关使用 org.apache.client.HttpClient 进行线程处理的文档,因此所有线程共享 HttpClient 对象,并且在每个请求上只创建 HttpPost 对象。
我知道,在我自己进行基准测试之前,我不会完全了解我的实现的含义,但我想知道在进行那一步之前是否有任何危险信号。为了弄清楚我的实际问题是什么:
我的方法中有任何危险信号吗? (我做错的任何明显的事情都可能导致严重的性能损失,因为我对此还比较陌生)
给每个数据包赋予它自己是不明智的吗? 自己的线程知道会有成千上万个吗? (线程 然而,计数将受到线程池的限制)
将传入请求排队并为每个线程发送多个数据包而不是每个线程发送一个数据包是否更智能?
最佳答案
您是否在网络 servlet 容器中运行?
一般来说,大多数开发人员对异步处理和线程的了解不如构建当今最喜欢的 Web 服务器(tomcat、jetty,甚至 glassfish 都非常好)的团队,所以对我来说,您的方法的唯一问题是您正在实现线程自己。
如果您收到的请求是通过 HTTP 发生的,那么我会看看 Servlet 3.0 的异步功能,它允许正确管理 HTTP 请求,而不会在您等待 POST 响应时阻塞。在 http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html 有一篇很好的 Java 世界文章
如果您的请求来自 HTTP 以外的其他东西(例如 JMS 或其他东西),那么队列和执行模式是好的,前提是您确保使用线程安全和高性能的对象(例如 ConcurrentHashMap)
对于您创建的 POST,同样使用 HTTPClient 的异步执行程序很有用 - http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.html - 描述了如何去做。
玩得开心!
关于java - 发送大量 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869874/