我处于以下情况:我将接收多个请求,处理请求中的数据,然后使用POST将数据转发到另一个服务器。可能会有数千个请求同时发送到服务器。我以前从来没有处理过这种音量,因此我不得不对如何继续进行一些(有根据的)猜测。
我正在使用Jave EE应用程序服务器,并使用org.apache.client.HttpClient作为POST请求转发数据。每个数据包都相对较小(每包50-100kb)这是我目前的策略:
当请求进来时,我立即生成一个新线程以处理和发送数据(每个请求一个线程)。我使用java.util.concurrent.ThreadPoolExecutor和java.util.concurrent.ArrayBlockingQueue来控制线程和排队。如果正在使用线程池中的所有线程,则传入的数据将排队。如果队列已满,则丢弃数据(我完全没问题)。我正在使用org.apache.client.HttpClient关注线程的文档,因此所有线程共享HttpClient对象,并且只在每个请求上创建HttpPost对象。
我知道在我自己对此进行基准测试之前,我不会完全了解我的实施的含义,但我想知道在走到那么远之前是否还有任何危险信号。为了弄清楚我的实际问题是什么:
我的方法中是否有任何危险信号? (任何显而易见的事情,我做错了,可能导致严重的性能损失,因为我对此比较陌生)
给每个数据包是不明智的 自己的线程知道会有成千上万的? (线程 但是,计数将受到线程池的限制。
将传入请求排队并为每个线程发送多个数据包而不是每个线程一个数据包会更聪明吗?
答案 0 :(得分:3)
您是否在Web servlet容器中运行?
一般来说,大多数开发人员对构建当今最喜欢的Web服务器(tomcat,jetty,甚至是glassfish的团队)的异构处理和线程知之甚少,所以对我来说,你的方法唯一的问题是你正在实现线程化自己。
如果您正在通过HTTP进行重新接收请求,那么我将查看Servlet 3.0的异步功能,这些功能允许在您等待POST响应时正确管理HTTP请求而不会阻塞。在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 - 描述了如何执行此操作。
玩得开心!