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