use*_*847 5 java performance multithreading servlets jakarta-ee
我的情况是,我将接收多个请求,处理来自请求的数据,然后使用 POST 将数据转发到另一台服务器。可能有数千个请求同时发送到服务器。我以前从来没有处理过这种卷,所以我不得不对如何进行一些(受过教育的)猜测。
我正在使用 Jave EE 应用程序服务器,并且正在使用 org.apache.client.HttpClient 作为 POST 请求转发数据。每包数据比较小(每包50-100kb)以下是我目前的策略:
当一个请求进来时,我会立即生成一个新线程来处理和发送数据(每个请求一个线程)。我使用 java.util.concurrent.ThreadPoolExecutor 和 java.util.concurrent.ArrayBlockingQueue 来控制线程和排队。如果线程池中的所有线程都被使用,则传入数据将排队。如果队列已满,则数据将被丢弃(我完全没问题)。我正在关注有关使用 org.apache.client.HttpClient 进行线程处理的文档,因此所有线程共享 HttpClient 对象,并且每个请求只创建 HttpPost 对象。
我知道在我自己对此进行基准测试之前我不会完全知道我的实现的含义,但我想知道在走那么远之前是否有任何危险信号。为了弄清楚我的实际问题是什么:
我的方法有任何危险信号吗?(我做错的任何明显的事情都可能导致严重的性能损失,因为我对此比较陌生)
知道将有数千个数据包,为每个数据包提供自己的线程是否不明智?(但是线程数将受到线程池的限制)
将传入请求排队并为每个线程发送多个数据包而不是每个线程一个更聪明吗?
您是否在 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 - 描述了如何做吧。
玩得开心!
| 归档时间: |
|
| 查看次数: |
1644 次 |
| 最近记录: |