簡體   English   中英

集群式無狀態Web應用程序-如何處理並發請求?

[英]Clustered, Stateless web application - how to handle concurrent requests?

我們有一個spring mvc Web應用程序,它將為許多用戶提供服務。 我們的數據源是一個mySQL DB。

該Web應用程序位於tomcat服務器的群集上。

用戶與Web應用程序交互時沒有會話。

該協議是用戶和Web應用之間的簡單REST API。

如果其他請求處理仍在進行中,我們想忽略用戶的請求。 例如:

user1 requests for action1...
action1 handling begins in webapp.
user1 requests for action1 again (before the handling is completed)
server declines the 2nd request since action1 handling is still in progress..
action1 handling completed.
result for action1 is returned to user1's client.
(now further actions is accepted by the web app)

如何做到這一點? 如果我們使用Web應用程序的單個節點,則可以在內存中簡單地對其進行管理,但是由於我們使用的是群集並且沒有共享的內存\\緩存,因此它將無法正常工作。

我們考慮過的另一種選擇是在數據庫中使用鎖定,例如在專用表中為userID創建約束(稱為userLock),在每次處理之前,我們只需將其插入該表中,然后通過從其中刪除條目來完成如果提出了非法請求,則會拋出約束異常,並且不會對其進行處理)

除了這種“信號量”行為,還有其他選擇嗎?

Hazelcast提供了java.util.concurrent.locks.Lock分布式實現,可能對您有用。

    HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
    Lock lock = hazelcastInstance.getLock( "myLock" );
    lock.lock();
    try { 
       // do something here
    } finally {
      lock.unlock();
    }

答案中列出了更多選項。

您可以使用某些排隊系統,JMS或其他http://en.m.wikipedia.org/wiki/Java_Message_Service

暫無
暫無

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

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