Google App Engine中的单身人士(或更常见的分布式服务器环境)如何运作?

时间:2009-07-26 01:44:31

标签: java google-app-engine singleton distributed

我对单身人士如何在Google App Engine(或任何分布式服务器环境)中工作感到好奇。鉴于您的应用程序可以同时在多个进程(在多台计算机上)上运行,并且请求可以在所有位置进行路由,当应用程序执行以下操作时,实际发生的事情是:'CacheManager.getInstance()'?

我只是使用(GAE)CacheManager作为示例,但我的观点是,单个地方有一个单一的全局应用程序实例,所以它存在于哪里?是否调用了RPC?事实上,全局应用程序状态(如会话)实际上是如何实际处理的?

此致 沙恩

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:3)

缓存通常与某种分布式复制缓存相关联。例如,GAE使用自定义版本的memcached来处理跨群集维护对象的共享缓存,同时将存储状态保持在一致状态。一般来说,对于这个问题有很多解决方案,在性能和高速缓存一致性方面要做出许多不同的权衡(例如,所有高速缓存在100%的时间内匹配是至关重要的,必须将高速缓存写入磁盘以保护反对损失等。)

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

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

答案 2 :(得分:0)

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

如果Web服务器不是多线程的,而是多进程的,那么就我所知,你不能在请求之间共享对象,而不需要单独的缓存过程。

GAE文档似乎支持他们所谓的“App Caching”,它基本上允许你做同样的事情,但我从文档中不清楚他们是否通过使用多线程Web服务器来做到这一点,或与Web服务器一起运行的其他一些缓存过程。

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