Cle*_*ath 3 java singleton application-server cluster-computing
在技术讨论中,我遇到了如何跨节点维护单个实例的问题,然后我回答了以下方法
1)基于DB的解决方案
2)分布式缓存
3)分片
4)在负载均衡器中维护Singleton单实例
面试官期待更多的东西,因为他回复了数据库,而且Cache会工作,分片无法工作,也没有对负载均衡器方法的评论,然后他补充说,让我们假设你的应用程序中不允许使用DB和Cache方法,给我另一个选择我在这一点上被困住了.
然后我用Google搜索并找到以下内容
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
请帮助我解决您的想法,这将是跨节点实现单个实例(单例)的最佳方法
如果您不知道自己在做什么,所有选项都将失败.我想将单例称为反模式而不是设计模式,因为它经常使用的方式通常是灾难的秘诀.
现在,让我们回答一下.你应该问面试官:为什么真的需要一个单身人士?什么状态真的需要存储在一个特定的位置?这个状态是否可变?什么是并发策略?会有写作吗?或者主要是读?是否所有访问都必须同步?
你正在考虑错误的方向,因为你认为这个问题的解决方案确实存在.好吧,你会找到一种方法,但它将是并发性能和绝对同步访问之间的折衷.
现在,让我们快速浏览您自己提供的选项:
1)基于DB的解决方案
这可能有效,但您必须确保数据库支持您的锁定策略,并明智地使用它.
2)分布式缓存
这与基于DB的解决方案基本相同.你甚至可以编写自己的微服务来完成这项工作.您应该意识到分布式缓存与数据库完全相同,只有一个针对同一数据(具有过期策略)的并发读取进行了优化.请记住,如果没有很好地解释,缓存解决方案可能听起来好像您不知道缓存通常无效/过期,并且具有即时生成回退.听起来好像你没有理解想要让单个实例一直"活着"的问题.
3)分片
如果您的单例太大而无法放入之前提到的基于数据库的解决方案中,则可以使用分片技术.我非常怀疑你的单身人士会变得如此之大.
4)在负载均衡器中维护Singleton单实例
这使你的负载平衡器精神分裂症,是一个坏主意.负载平衡器是非常简单的组件,应该保持这种状态.