Java GoogleAppEngine(或者更一般地说是分布式服务器环境)中的单例是如何工作的?

Java GoogleAppEngine(或者更一般地说是分布式服务器环境)中的单例是如何工作的?,java,google-app-engine,singleton,distributed,Java,Google App Engine,Singleton,Distributed,我对单例如何在谷歌应用程序引擎(或任何分布式服务器环境)中工作很感兴趣。假设您的应用程序可以同时在多个进程(在多台机器上)中运行,并且请求可以被完全路由,那么当应用程序执行类似于“CacheManager.getInstance()”的操作时,在后台会发生什么 我只是以(GAE)CacheManager为例,但我的观点是,某个地方有一个单一的全局应用程序实例,那么它位于哪里呢?是否调用了RPC?事实上,全局应用程序状态(如会话)通常是如何处理的 问候,, Shane缓存通常与某种分布式复制缓存相

我对单例如何在谷歌应用程序引擎(或任何分布式服务器环境)中工作很感兴趣。假设您的应用程序可以同时在多个进程(在多台机器上)中运行,并且请求可以被完全路由,那么当应用程序执行类似于“CacheManager.getInstance()”的操作时,在后台会发生什么

我只是以(GAE)CacheManager为例,但我的观点是,某个地方有一个单一的全局应用程序实例,那么它位于哪里呢?是否调用了RPC?事实上,全局应用程序状态(如会话)通常是如何处理的

问候,,
Shane

缓存通常与某种分布式复制缓存相连接。例如,GAE使用的自定义版本来处理维护集群中对象的共享缓存,同时将存储状态保持为一致状态。一般来说,有很多解决方案可以解决这个问题,在性能和缓存一致性方面有很多不同的折衷方案(例如,所有缓存都必须100%匹配,缓存必须写入磁盘以防止丢失等)

以下是一些具有分布式缓存功能的示例产品(大多数产品都有详细描述各种方法权衡的文档):

  • -C,具有大量客户端API和语言端口
  • -OSS Java缓存,广泛采用
  • -另一个流行的Java OSS解决方案
  • -可能是最著名的Java商业缓存
  • -流行的.Net OSS解决方案
  • -可能是最流行的.Net商业缓存解决方案

正如您所看到的,有很多项目已经解决了这个问题。一个可能的解决方案是在一台机器上共享一个缓存,但是,大多数项目都可以实现某种复制和分布式故障切换。

我不确定GAE的具体细节,但通常在这种规模的web应用中,您将拥有多个缓存在多台机器上运行的ple进程(然后在它们之间进行负载平衡)。在每个进程中,如果您使用多线程web服务器,则可以处理多个请求。因此,这将允许您在同一web服务器内的请求之间共享对象(例如,您可以在web应用程序进程启动时实例化一个单例)

如果web服务器不是多线程的,而是多进程的,那么据我所知,如果不与单独的缓存进程对话,就无法在请求之间共享对象

GAE文档似乎支持他们称之为“应用程序缓存”的东西,它本质上允许你做同样的事情,但从文档中我不清楚他们是通过使用多线程web服务器来做这件事,还是通过web服务器运行的其他缓存过程来做这件事


我很想知道
CacheManager.getInstance()是否
总是解析到同一个对象,或者如果它只是同一个web服务器处理的请求的同一个对象。实际上,这并不重要,因为它只是用来与单独的memcached进程进行通信。

应用引擎Java中的单例是每个运行时,而不是每个webapp。它们的目的只是提供一个单点f访问底层服务(对于Memcache和Users API,都是通过RPC访问的),但这纯粹是库的设计模式-这些方法访问的任何地方都没有每个应用程序的单例。

感谢您提供的缓存示例,但我使用缓存只是作为web开发单例使用的一个示例。我可以很容易地成为单例用户。正如我在上面的回答中所说,我对某些si的想法感到困惑ngleton对象在请求/响应阶段后持续存在。我的理解是,您不能假设任何东西在请求后仍然存在,因此我试图理解singleton的实际含义,以及它在分布式web环境中的确切作用。同时,我将研究您给出的缓存示例的代码,看看它们的作用。我给出了缓存示例,因为这个问题没有单一的答案,您根本不会分发它。另一方面,如果您想在多个VM和请求之间共享单例,您最终会使用某种缓存解决方案。会话处理也是如此。我怀疑您所指的“单例”实际上只是每个VM(甚至可能是每个请求)singleton用于访问共享资源的客户端。我本以为singleton的本质意味着它必须解析到同一个对象实例。当我考虑请求时,我从没有想过它会有一个进程亲缘关系,尤其是在Google App Engine中。我希望一个请求去澳大利亚,下一个请求去t在美国,基于此,我能想到的唯一可靠案例的方法是将RPC发送到某种中央控制器,该控制器发出对象。对我来说,这似乎是反规模的,因此我感兴趣。memcache示例在跨多个数据中心的云环境中是一个棘手的案例。这就是我预测的它将如何工作的,这是不过很高兴把它清理干净。干杯。:)