【问题标题】:Write Consistency in horizontally scalable in Web ApplicationsWeb 应用程序中水平可扩展的写入一致性
【发布时间】:2012-10-18 00:46:05
【问题描述】:

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

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

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

【问题讨论】:

  • 你的后端是什么?你用数据库吗?哪个?
  • @Tichodroma。我们不会很快切换到负载平衡应用程序。我在学术上对此很感兴趣。不过,我熟悉 SQL Server、Spring 事务管理和 JBoss 缓存中的锁定和事务隔离级别。有了我的这个背景,如果你能指出一些可以增强我对分布式应用程序理解的文章,我将不胜感激。谢谢。

标签: java web-applications concurrency scalability


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的快速回复。你能分享一些博客文章是如何实现乐观锁定的吗?
  • @Gopal:我在答案中添加了几个链接
  • Tomasz Nurkiewicz..感谢您的回答。昨天我在重温这个问题,你的回答很有帮助。
【解决方案2】:

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

它是这样工作的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 2018-06-21
    • 2022-11-21
    • 2011-09-11
    • 2014-09-13
    • 2012-07-30
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多