3

我已经使用 Web 应用程序有一段时间了。但是,我从来没有处理过托管为多个实例并进行负载平衡的 Web 应用程序。

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

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

4

2 回答 2

7

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

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

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

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

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

于 2012-10-28T13:35:41.613 回答
1

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

这是它的工作原理:

  • 用户 A 和 B 进入 webapp,都看到座位 S 可用。
  • 用户 A 选择座位 S。在数据库中,S 的状态从available变为booked
  • 用户 B 尝试选择座位 S。后端回复座位 S 是blocked,用户 B 看到一条错误消息。

您可以通过更新座位状态“实时”来使您的应用程序更加用户友好,例如使用 Ajax。

于 2012-10-28T13:35:51.793 回答