我们有一个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应用程序的单个节点,则可以在内存中简单地对其进行管理,但是由于我们使用的是群集并且没有共享的内存\缓存,因此它将无法正常工作。

我们考虑过的另一种选择是在数据库中使用锁定,
例如,在专用表(称为userLock)中为userID创建约束,在每次处理之前,我们只需将其插入该表中,并通过从其中删除条目来完成操作,现在,如果发出非法请求,则会引发约束异常,并且未处理)

除了这种“信号量”行为,还有其他选择吗?

最佳答案

Hazelcast提供了java.util.concurrent.locks.Lock的分布式实现,可能对您有用。

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


this答案中列出了更多选项。

08-28 07:05