gpt4 book ai didi

java - 部署在多节点的java应用中类的单实例(singleton)

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:24 25 4
gpt4 key购买 nike

在技术讨论中,我遇到了如何跨节点维护单个实例的问题,然后我回答了以下方法

1) 基于数据库的解决方案

2)分布式缓存

3) 分片

4)在负载均衡器中维护Singleton单实例

面试官期待更多,因为他回答了基于 DB 和 Cache 将工作,分片将不起作用,并且没有对负载平衡器方法发表评论,然后他进一步补充说,让我们假设您的应用程序中不允许使用 DB 和 Cache 方法,给我另一个选择我被困在了这一点上。

然后我google了一下,发现了下面的内容

How to create singleton java class for multiple jvm support?

Singleton in Cluster environment

https://javaarchitectforum.com/2013/02/19/singleton-design-pattern-with-example/

还找到了一些应用服务器的支持

http://www.onjava.com/pub/a/onjava/2003/08/20/jboss_clustering.html

http://docs.oracle.com/cd/E12840_01/wls/docs103/cluster/service_migration.html#wp1051458

http://docs.oracle.com/cd/E24152_01/Platform.10-1/ATGPlatformProgGuide/html/s1005runningthesameschedulableservice01.html

请帮助我了解您的想法,这将是跨节点实现单实例(单例)的最佳方法

最佳答案

如果您不知道自己在做什么,所有选项都会失败。我想将单例称为反模式而不是设计模式,因为它的常用方式通常是灾难的根源。

现在,让我们来看看答案吧。你应该问面试官:为什么真的需要单例?什么状态真正需要存储在一个特定位置?这个状态是可变的吗?什么是并发策略?主要是写吗?还是主要看书?所有访问都必须同步吗?

您的思考方向错误,因为您认为这个问题确实存在解决方案。好吧,您会找到一种方法,但这将是并发性能和绝对同步访问之间的折衷。

现在,让我们快速浏览一下您自己提供的选项:

1) 基于数据库的解决方案

这可行,但您必须确保数据库支持您的锁定策略,并且您要明智地使用它。

2)分布式缓存

这在本质上与基于数据库的解决方案相同。您甚至可以编写自己的微服务来完成这项工作。您应该意识到分布式缓存与数据库完全相同,只是针对相同数据的并发读取进行了优化(具有过期策略)。请记住,如果没有很好地解释,缓存解决方案听起来好像您没有意识到缓存通常会失效/过期,并且具有即时生成回退。这听起来好像您不理解希望让单例实例始终“活着”的问题。

3) 分片

如果您的单例太大而无法适应前面提到的基于数据库的解决方案,则可以使用分片技术。我非常怀疑你的单例会变得这么大。

4) 在负载均衡器中维护Singleton单实例

这会使您的负载均衡器精神 split ,这是个坏主意。负载均衡器是非常简单的组件,应该保持这种状态。

关于java - 部署在多节点的java应用中类的单实例(singleton),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37441366/

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