我處于這樣一種情況:我将收到多個請求,處理來自請求的資料,然後使用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