繁体   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