【问题标题】:Clustered, Stateless web application - how to handle concurrent requests?集群化、无状态 Web 应用程序 - 如何处理并发请求?
【发布时间】:2015-03-22 13:20:15
【问题描述】:

我们有一个 spring mvc Web 应用程序,它将为许多用户的操作提供服务。 我们的数据源是一个 mySQL DB。

Web 应用程序位于 Tomcat 服务器集群上。

用户在与 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)中为用户 ID 创建一个约束,在每次处理之前,我们只需将其插入到该表中,并通过从中删除条目来完成,现在如果发出非法请求,则会引发约束异常并未处理)

这种“信号量”行为还有其他替代方法吗?

【问题讨论】:

    标签: java mysql spring tomcat concurrency


    【解决方案1】:

    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 答案中列出了更多选项。

    【讨论】:

      【解决方案2】:

      您可以使用一些排队系统、JMS 或其他 http://en.m.wikipedia.org/wiki/Java_Message_Service

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多