我处于这样一种情况:我将收到多个请求,处理来自请求的数据,然后使用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)
玩得开心!
标签:java,multithreading,servlets,java-ee,performance
来源: https://codeday.me/bug/20190629/1327936.html