【问题标题】:Sending high volumes of POST requests发送大量 POST 请求
【发布时间】:2013-03-29 23:46:05
【问题描述】:

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

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

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

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

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

  • 给每个数据包分配它的数据是不明智的吗? 自己的线程知道会有成千上万的人吗? (线程 计数将被线程池限制)

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

【问题讨论】:

  • 数据包处理需要多长时间?
  • 我会为这类应用程序使用嵌入式 ActiveMQ 服务器。
  • 我还没有实际测量处理,但它似乎相对较小(执行 JSON.parse,附加数据然后转换为要发送的字符串)。与 IMO 的实际出站请求相比可以忽略不计。

标签: java multithreading performance jakarta-ee servlets


【解决方案1】:

您是否在 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 - 描述了如何做到这一点。

玩得开心!

【讨论】:

  • 欣赏建议。是的,我在一个容器中运行,并且要明确容器正在处理传入请求的线程。然后将这些请求转发到一个线程安全类,然后该类会产生新的线程。到目前为止,我们在传入流量方面一直很好。这是我们关心的新线程和出站流量。
  • 需要注意的一点是 POST 在出站呼叫中保持打开状态的时间。如果他们停止响应,客户端线程可以保持挂起,直到它们超时(从内存中,默认值对于公共 HTTP 客户端来说是 5 分钟)。从我过去看到的情况来看,您可以在很短的时间内结束大多数请求,即
  • 哦,实际上评论您上面的问题 2 和 3:#2 - 是的,线程很昂贵,因为 @Richard-W 提到带有消息驱动 Bean 池的 ActiveMQ 队列可以很好地解决这个问题。您可以将入站请求发布到队列中,并且 mdb 池正在咀嚼队列,前提是您不需要提供对原始入站请求的响应,而不是“我收到您的消息”之类的事情
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 2014-05-09
  • 1970-01-01
  • 2016-01-25
  • 2017-07-13
  • 2010-10-12
  • 2016-03-24
  • 2015-06-10
相关资源
最近更新 更多