java - Web 应用程序中水平可扩展的写入一致性

标签 java web-applications concurrency scalability

我从事网络应用程序已有一段时间了。但是,我从未开发过作为多个实例托管且负载平衡的 Web 应用程序。

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

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

最佳答案

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

Since, they are different processes running on different machines where does locking happen?

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

How do they maintain cache consistency? Are there any solutions readily available?

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

关于java - Web 应用程序中水平可扩展的写入一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109168/

相关文章:

c++ - 在 Qt 中运行一个单独的进程或线程

java - 通用 DAO 实现, Controller 级别注入(inject)失败

java - 将程序输出附加到 JavaFX TextBox

c++ - std::memory_order_relaxed 和初始化

javascript - 客户端应用程序的模块化方法

java - 如何通过移动网络浏览器运行Android应用程序(渐进式应用程序)

asp.net - 如何在 IIS7.0 上解析 "HTTP Error 500.19 - Internal Server Error"

java - Android Picasso - 清除缓存但图像仍然存在

java - 如果 react 中包含空格,则无法搜索名称

java - 垃圾收集和回调