我们有一个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创建约束,在每次处理之前,我们只需插入此表,并通过从中删除条目来最终化,现在如果发出非法请求,则抛出约束异常并且没处理)
这种“信号量”行为还有其他替代方案吗?
答案 0 :(得分:0)
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答案中列出了更多选项。
答案 1 :(得分:0)
您可以使用一些排队系统,JMS或其他 http://en.m.wikipedia.org/wiki/Java_Message_Service