4

我正在学习 Spring,我知道 bean 在一个应用程序上下文中默认是单例的。但是如果我们在分布式系统中部署应用程序呢?什么是实现单例的实用方法,因为每次请求进入时,它可能会被路由到具有不同应用程序上下文的不同机器?

我读过Cluster environment 中的 Singleton,但答案是关于缓存的。

我想我们可以做一些事情,比如把单例放到一个中心位置(比如 memcached),每次我们需要这个 bean 并从 IO 序列化和反序列化它时,这行得通吗?但是,在我看来,这将花费很多,因为某些对象的转移非常“昂贵”。

谢谢!

4

3 回答 3

3
  • 您的单例是无状态的:然后您只需在每个节点中重新创建相同的东西,不需要节点之间的通信;

  • 或者你的单例是有状态的:那么你需要分发它的状态。这是memcached必须应用大量可用分布式缓存的地方或任何其他地方。您仍将在每个节点中独立地重新创建单例本身,但您将使其内部状态驻留在分布式缓存中。

于 2014-11-10T11:45:15.710 回答
0

您可以设置您的网络/应用服务器以使会话“粘性”:一旦请求被路由到特定服务器,该会话中的所有请求都会转到同一服务器。

更大的问题是:为什么要以这种方式设计和实现分布式系统?所有人的单身人士无法扩展。如果您坚持走这条路,那么将任何东西聚集在一起是没有意义的。

更好的解决方案是无状态的、不可变的、功能性的。创建为您的系统建模的无状态 REST 服务。

于 2014-11-10T11:45:54.127 回答
0

这取决于,如果您打算像使用服务一样使用 Singleton 实例并且您不会在其中存储任何全局变量,那么您不需要使其分布式。

在某些情况下,您需要分发,因此使用缓存解决方案;您可以尝试优化您的实现以存储最少的数据,从而降低分发成本

于 2014-11-10T11:46:30.673 回答