在Web应用程序中以水平可伸缩方式编写一致性

Gop*_*pal 3 java concurrency scalability web-applications

我已经使用Web应用程序很长一段时间了.但是,我从未使用托管为多个实例并负载平衡的Web应用程序.

我的问题:Web应用程序如何跨同一应用程序的多个实例管理写入?

例如:机票预订网站.想象一下,我为一部电影阻止某一排座位并提交我的请求.同时,另一个用户(由于应用程序被群集和负载平衡而由其他实例提供服务)也阻止了我选择的其中一个席位,Web应用程序如何管理这种情况?因为,它们是在不同的机器上运行的不同进程,锁定发生在哪里?它们如何保持缓存一致性?有没有现成的解决方案?

Tom*_*icz 7

好吧,在单节点应用程序中,对于并发写入仍然会遇到同样的问题,因为它是一个JVM,所以更容易管理它们.

因为,它们是在不同的机器上运行的不同进程,锁定发生在哪里?

数据库是所有实例共享的单点,是最简单的目标.根据您的预期负载和用例,乐观锁定很容易实现(例如JPA中).结合数据库事务,您可以在没有交易性能的情况下达到一定的原子级别.

它们如何保持缓存一致性?有没有现成的解决方案?

缓存很难,尤其是在分布式环境中.例如,可以在实例之间进行通信,并且一旦一个实例中的缓存更改,它就会将此事件广播到其他节点.还有很多其他产品,如,等.