我正在学习Spring,我知道bean在一个应用程序上下文中默认是单例。但是如果我们在分布式系统中部署应用程序会怎么样?实现单例的实用方法是什么,因为每次请求进入时,它都可以路由到具有不同应用程序上下文的不同机器?
我已阅读Singleton in Cluster environment,但答案是关于缓存。
我想我们可以做一些事情,比如把单例放到一个中心位置(比如memcached),每次我们需要这个bean并从IO序列化和反序列化时,这有用吗?但是,在我看来,这将花费很多,因为某些对象转移非常“昂贵”。
谢谢!
答案 0 :(得分:3)
您的单例是无状态的:然后您只需在每个节点中重新创建相同的东西,而不需要节点之间的通信;
或您的单身人士是有状态的:那么你需要分配其状态。这是必须应用memcached
或任何其他大量可用分布式缓存的地方。您仍将在每个节点中单独重新创建单例,但您将使其内部状态驻留在分布式缓存中。
答案 1 :(得分:0)
您可以设置您的网络/应用服务器以进行会话"粘贴":一旦请求被路由到特定服务器,该会话中的所有请求都将转到同一服务器。
更大的问题是:为什么用这种方式设计和实现分布式系统?所有人的单身人士都无法扩展。如果你坚持这条道路,那么聚集任何东西都没有意义。
更好的解决方案是无状态,不可变,功能齐全。创建无状态REST服务,为您的系统建模。
答案 2 :(得分:0)
这取决于,如果您要像服务一样使用Singleton实例,并且您不会在其中存储任何全局变量,则不需要将其分发。
在某些情况下,您需要分发,因此使用缓存解决方案;您可以尝试优化实施以存储最少的数据,以降低成本