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

时间:2012-10-28 13:28:22

标签: java web-applications concurrency scalability

我一直在使用Web应用程序已有一段时间了。但是,我从未使用托管为多个实例并负载平衡的Web应用程序。

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

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

2 个答案:

答案 0 :(得分:7)

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

  

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

数据库是所有实例共享的单点,是最简单的目标。根据您的预期负载和用例,optimistic locking非常容易实现(example in JPA)。结合数据库事务,您可以在没有交易性能的情况下达到一定程度的原子性。

  

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

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

答案 1 :(得分:1)

我在票务预订后端工作了几年。通常,在这种情况下,整个Web应用程序都由数据库支持,并且席位具有不同的状态:可用,已阻止,已预订。

以下是它的工作原理:

  • 用户A和B进入网络应用程序,两者都看到座位S可用。
  • 用户A选择座位S.在数据库中,S的状态从available更改为booked
  • 用户B尝试选择座位S.后端回复座位S为blocked,用户B看到错误消息。

您可以使用Ajax更新座位状态“live”,从而使您的应用更加用户友好。