5

我的情况是,我将接收多个请求,处理来自请求的数据,然后使用 POST 将数据转发到另一台服务器。可能有数千个请求同时发送到服务器。我以前从来没有处理过这种卷,所以我不得不对如何继续进行一些(受过教育的)猜测。

我正在使用 Jave EE 应用程序服务器,并且正在使用 org.apache.client.HttpClient 作为 POST 请求转发数据。每包数据比较小(每包50-100kb)这是我目前的策略:

当一个请求进来时,我立即生成一个新线程来处理和发送数据(每个单独的请求一个线程)。我正在使用 java.util.concurrent.ThreadPoolExecutor 和 java.util.concurrent.ArrayBlockingQueue 来控制线程和排队。如果线程池中的所有线程都在使用,则传入数据排队。如果队列已满,则删除数据(我完全可以接受)。我正在关注有关使用 org.apache.client.HttpClient 进行线程化的文档,因此所有线程都共享 HttpClient 对象,并且在每个请求上只创建 HttpPost 对象。

我知道,在我自己进行基准测试之前,我不会完全了解我的实现的含义,但我想知道在走那么远之前是否有任何危险信号。为了弄清楚我的实际问题是什么:

  • 我的方法中有任何危险信号吗?(我做错的任何明显的事情都可能导致严重的性能损失,因为我对此相对较新)

  • 知道会有数千个数据包,给每个数据包自己的线程是不明智的吗?(但是线程数将被线程池限制)

  • 将传入请求排队并在每个线程发送多个数据包而不是每个线程发送一个数据包会更聪明吗?

4

1 回答 1

4

您是否在 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 world 文章

如果您的请求来自 HTTP 以外的其他东西(即 JMS 或其他东西),那么队列和执行模式很好,前提是您确保使用线程安全和高性能对象(即 ConcurrentHashMap)

对于您所做的 POST,再次使用 HTTPClient 有一些有用的异步执行器 - http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.html - 描述了如何做。

玩得开心!

于 2013-04-08T01:52:27.963 回答