簡體   English   中英

設計Web服務的最佳方法,該服務必須將請求中的數據存儲在列表或類似結構中

[英]Best way to design web service, which have to store data from requests in list or similar structure

我的目標是創建Java EE Web服務,該服務將同時處理數千個(或將來更多)請求,並且必須將請求中的數據存儲在列表或類似結構中。 我想將請求中的對象存儲在內存中,但這不是必須的。 將從每個請求中提取一些對象,並將其添加到所選的數據結構中。 Web服務將具有兩個操作:添加到結構和從結構中刪除。 刪除請求將包含對象實例變量的值。 可能是唯一ID或其他一個或多個實例變量。 始終有一個要刪除的對象(如果請求無效,則為0)。 具有相同實例變量值的對象將被刪除。

我的想法是使用兩個EJB。 首先是@Stateless並公開為Web服務。 它將從請求中提取對象,並調用第二個EJB從數據結構中添加或刪除請求的對象。 第二個EJB將是@Singleton,並將具有從請求中提取的對象的實例變量ArrayList <>。 正如我所說的,它根本不必是ArrayList或List。

我還考慮過使用一個EJB,它必須是@WebService @Singleton,但是文檔說這種組合是“可能的,但是……未由本規范定義”。

Arjan,您的要求尚不完全清楚。 假設您正在構建每秒處理1000個請求的高負載應用程序,我將這樣做:

Servlet的處理

  • 將“對象”數據容器分離到每個用戶的http會話中(如果http會話可用)
  • 將同步列表添加到您的http會話中,並根據每個請求對同步的私有列表執行操作,並將Web客戶端詳細信息添加到此http會話存儲列表中
  • 將httpsession列表的引用添加到下一個提到的SingletonEJB

單例EJB

  • 創建一個單例EJB
  • 為您的YourObjectType類型的提取/過濾/處理對象添加一個List字段
  • 為基於HTTP會話且未過濾但已同步的List的引用添加第二個Collection

TimerEJB

  • 創建一個計時器EJB以定期運行,例如每秒運行一次
  • 此功能將遍歷refCol中的所有引用列表,並將提取和過濾所需的對象,並確保清除基於http會話的列表。

解決方案的好處:

  • 將用戶的內存負載推向他們的會話
  • 不要在非常高的負載下陷入同步/互斥問題,因為在Singleton bean的中央和過濾列表上,使用timerEJB的操作非常短。
  • 只要會話規模較小,您就可以擴展
  • 可能需要占用大量CPU資源的解決方案以及用於保留已過濾對象的IO密集型解決方案不在客戶端請求范圍內,客戶端不會遇到性能問題。
  • 您可以根據需要更改計時器時間表

退稅:

  • 復雜度高一點
  • 您必須在refColl中清除對封閉的http會話列表的引用。 通過在復合類中提供會話和對會話列表的引用,或者通過任何其他自定義解決方案。 如果不清理,則通過保留對已“終止”的HTTP會話列表的引用,會使堆膨脹。

您不能在WS上使用@Singleton,因為容器可能會初始化多個實例來處理大量請求。

您的@Singleton bean無法使用ArrayList <>,因為將存在並發訪問。 您應該改用ConcurrentLinkedQueue。 如何識別您的刪除操作請求? 也許ConcurrentHashMap會更好。

除非您將請求轉儲到數據庫或文件中,否則遲早如果要“成千上萬(或將來會有更多)”,將耗盡內存。 使用JPA的數據庫將是最簡單的,您只需在WS和Request對象上添加少量注釋即可實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM