我一直在使用Web应用程序已有一段时间了。但是,我从未使用托管为多个实例并负载平衡的Web应用程序。
我的问题:Web应用程序如何跨同一应用程序的多个实例管理写入?
例如:机票预订网站。想象一下,我为一部电影阻止某一排座位并提交我的请求。同时,另一个用户(由于应用程序被群集和负载平衡而由其他实例提供服务)也阻止了我选择的其中一个席位,Web应用程序如何管理这种情况?因为,它们是在不同的机器上运行的不同进程,锁定发生在哪里?它们如何保持缓存一致性?有没有现成的解决方案?
答案 0 :(得分:7)
嗯,在单节点应用程序中,对于并发写入仍然会遇到同样的问题,因为它是一个JVM,所以更容易管理它们。
因为,它们是在不同的机器上运行的不同进程,锁定发生在哪里?
数据库是所有实例共享的单点,是最简单的目标。根据您的预期负载和用例,optimistic locking非常容易实现(example in JPA)。结合数据库事务,您可以在没有交易性能的情况下达到一定程度的原子性。
他们如何保持缓存一致性?有没有现成的解决方案?
缓存很难,特别是在分布式环境中。例如,ehcache可以在实例之间进行通信,并且一旦一个实例中的缓存更改,它就会将此事件广播到其他节点。还有很多其他产品,例如terracotta,hazelcast等。
答案 1 :(得分:1)
我在票务预订后端工作了几年。通常,在这种情况下,整个Web应用程序都由数据库支持,并且席位具有不同的状态:可用,已阻止,已预订。
以下是它的工作原理:
available
更改为booked
blocked
,用户B看到错误消息。您可以使用Ajax更新座位状态“live”,从而使您的应用更加用户友好。