当应用程序部署在负载均衡器后面的多个实例上时,如何同步 Java 中的公共资源
How to synchronize a common resource in Java when the application is deployed on multiple instances behind a load balancer
当我的 java 应用程序部署在负载均衡器后面的多个实例上时,我们如何使用 Java 中的同步来同步访问公共资源?
因为据我所知,同步只能在一个JVM下工作。但是当我们在多个实例上部署相同的 Java 应用来处理负载时,那么我们如何提供同步机制呢?
例如:- 有一个 HDFS 文件,java 应用程序 appends/edits 该 HDFS 文件的内容。当我在多个实例上部署 java 应用程序时,如何确保只有来自 Java 应用程序的请求访问该 HDFS 文件?
简答 - 如果不在设置中引入很多复杂性,就无法做到这一点。
虽然从技术上讲,您可以使用 Zookeeper 上可用的分布式锁之类的东西。我不会真的推荐他们。很难对它们进行大规模推理,而且在 Zookeeper 操作本身方面也有额外的复杂性。
关于您发布的示例,这不就是构建 HBase 等系统的原因吗?将您的数据建模为 Key->[Multiple Columns] 格式。然后,您可以在 HBase 上读取/写入数据,它会在幕后为您完成编辑/管理多个文件的繁重工作。
另一方面,如果您可以将要对文件进行的更改建模为事件,则可以根据事件驱动架构的原则构建系统。
您可以在
上阅读更多相关信息
- Martin Fowler 的 EDA 介绍视频 - https://www.youtube.com/watch?v=STKCRSUsyP0
- 第 1 部分 - https://www.confluent.io/blog/build-services-backbone-events/
- 第 2 部分 - https://www.confluent.io/blog/apache-kafka-for-service-architectures/
- Martin Fowler 在本次演讲中谈到的 CQRS 模型 - https://martinfowler.com/bliki/CQRS.html
我可以推荐你使用redis提供的分布式锁机制。
它的工作方式与标准锁或互斥量相同,但在分布式系统的上下文中工作。创建锁的应用程序实例将阻止对资源的访问以进行更改,然后释放锁以允许其他实例访问资源。
我们已经在生产中使用这个解决方案来保护对一些原生不提供同步和一致性的关键资源的访问。
下面是redis分布式锁的link:
Distributed locks with Redis
我相信还有其他解决方案可以提供相同的功能。 Redis 非常轻量级、可扩展且易于集成。
当我的 java 应用程序部署在负载均衡器后面的多个实例上时,我们如何使用 Java 中的同步来同步访问公共资源?
因为据我所知,同步只能在一个JVM下工作。但是当我们在多个实例上部署相同的 Java 应用来处理负载时,那么我们如何提供同步机制呢?
例如:- 有一个 HDFS 文件,java 应用程序 appends/edits 该 HDFS 文件的内容。当我在多个实例上部署 java 应用程序时,如何确保只有来自 Java 应用程序的请求访问该 HDFS 文件?
简答 - 如果不在设置中引入很多复杂性,就无法做到这一点。
虽然从技术上讲,您可以使用 Zookeeper 上可用的分布式锁之类的东西。我不会真的推荐他们。很难对它们进行大规模推理,而且在 Zookeeper 操作本身方面也有额外的复杂性。
关于您发布的示例,这不就是构建 HBase 等系统的原因吗?将您的数据建模为 Key->[Multiple Columns] 格式。然后,您可以在 HBase 上读取/写入数据,它会在幕后为您完成编辑/管理多个文件的繁重工作。
另一方面,如果您可以将要对文件进行的更改建模为事件,则可以根据事件驱动架构的原则构建系统。
您可以在
上阅读更多相关信息- Martin Fowler 的 EDA 介绍视频 - https://www.youtube.com/watch?v=STKCRSUsyP0
- 第 1 部分 - https://www.confluent.io/blog/build-services-backbone-events/
- 第 2 部分 - https://www.confluent.io/blog/apache-kafka-for-service-architectures/
- Martin Fowler 在本次演讲中谈到的 CQRS 模型 - https://martinfowler.com/bliki/CQRS.html
我可以推荐你使用redis提供的分布式锁机制。 它的工作方式与标准锁或互斥量相同,但在分布式系统的上下文中工作。创建锁的应用程序实例将阻止对资源的访问以进行更改,然后释放锁以允许其他实例访问资源。
我们已经在生产中使用这个解决方案来保护对一些原生不提供同步和一致性的关键资源的访问。
下面是redis分布式锁的link: Distributed locks with Redis
我相信还有其他解决方案可以提供相同的功能。 Redis 非常轻量级、可扩展且易于集成。