当将应用程序部署在负载平衡器后面的多个实例上时,如何同步Java中的公共资源



当我的Java应用程序在负载均衡器后面的多个实例上部署时,我们如何同步使用Java中的共同资源?

,据我所知,同步仅在一个JVM下起作用。但是,当我们在多个实例上部署相同的Java应用程序来处理负载时,我们如何提供同步机制?

例如: - 有一个HDFS文件,Java应用程序要么附加/编辑该HDFS文件的内容。当我在多个实例上部署Java应用程序时,如何确保只有Java应用程序的一个请求访问HDFS文件?

简短答案 - 如果不引入许多复杂性,就无法做到。

从技术上讲,您可以使用Zookeeper上可用的分布式锁之类的东西。我真的不会推荐他们。与他们进行大规模推理很难推理,就Zookeeper操作本身而言,还有其他复杂性。

关于您发布的示例,不是为什么构建了HBASE这样的系统?将数据建模为键 -> [多列]格式。然后,您可以在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分布式锁的链接:带有redis

的分布式锁

我相信还有其他解决方案提供相同的功能。redis非常轻巧,可扩展且易于集成。

最新更新