gpt4 book ai didi

多个服务器上的 Java 锁定

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:12 33 4
gpt4 key购买 nike

我有几个座位可供用户预订。同一时间,只有一个用户可以参与预订过程,这样同一个座位就不会被多个用户预订。在我的 Java 代码中,我使用了“synchronized”关键字来完成它。这行得通。

但是,现在我的代码部署在两台服务器上,比如 S1 和 S2。假设地,假设有最后一个座位可用。两个用户,比如 U1 和 U2,想要保留最后一个座位。负载均衡器可能会将用户 U1 发送到服务器 S1,将用户 U2 发送到服务器 S2。现在“本地”同步仍然会以相同的方式工作,但它无法在进行预订时阻止其他用户。这将使最后一个座位被两个用户保留,这是个问题。

那么问题来了,在多服务器环境下,如何保证多个用户不冲突地预定座位?

最佳答案

这很难在语言层面上完成。一些分布式缓存可能会有所帮助,例如 Terracotta 确实在集群环境中处理同步关键字,但我还没有尝试过,而且肯定会影响性能。我会非常小心地让实例等待一些不平凡的时间,就像你的情况一样。

否则分布式 JNDI、分布式单例或类似的东西使服务器实例在过程中进行通信和检查可能会有所帮助。

但是这个问题在实践中通常通过乐观锁来避免。您可能会简单地假设这只会在一些不寻常/不太可能的时刻发生,并像在一个实例中那样做。并找出一种方法,在它没有时做什么。这变得更多的业务逻辑场景,最好的方法就是找到一种让用户最不可能不满意的方法。

通常在持久性/数据库级别保证一致性,因此您可以将其写下来。我当然不会使用 synchronized 关键字来阻止可能会占用几分钟或更长时间的实例,因为这会导致内存泄漏或任何其他资源耗尽。

在处理此问题的 JPA/Hibernate 工作时,我个人喜欢使用 L2 缓存。当 OpenJPA 仅通知其他实例某个实体已更改并且它们应该从其 L1 缓存中撤销它时,它具有一种性能友好的方式来执行 L2 操作。在您的情况下,这可能是比使用同步 Java 语言关键字“同步”更好的方法。

在我的经验中,很多应用程序都忽略了它,考​​虑如何处理它是你这边的一个好态度。它经常成为一个低概率场景,对于面向业务的经理来说很难理解为什么应该投资它。但它有能力在生产中出现问题时产生严重的反弹。

关于多个服务器上的 Java 锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14947509/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com