GAE无国籍吗?有什么影响?

时间:2012-04-13 17:15:44

标签: google-app-engine stateless

我曾被告知GAE是无国籍的。我一般都理解无国籍的概念,但我可以在概念上将其应用于GAE类型系统中使用一些指导。

我特意问这个问题,因为我开发的应用程序似乎存在干扰问题。也就是说,当两个或更多人同时使用它时,它会变得混乱。 (我继续进行bug测试以确认错误仅在同时使用期间发生。)我认为理论上可能存在这样的干扰的两种方式:A,错误的GQL查询获取错误的db记录(我检查了这个,nope);或b。在服务器级别。我的问题:后者究竟有可能吗?当应用程序正在服务时,一个用户是否可以通过改变程序中变量的状态来干扰另一个用户?或者,也许,无国籍状态会阻止这种情况吗?我很困惑,可能错误地提出了这个问题。合十。

3 个答案:

答案 0 :(得分:5)

我认为你混淆了一些条款。首先,您使用的语言是什么?这是java还是python?

告诉你GAE是'无国籍'的人不知道他们在说什么,否则你对他们告诉你的事情感到困惑。 GAE是一个Web服务器平台,您的应用程序的状态由您自己决定。 HTTP是一种无状态协议(GAE用于构建使用http的Web应用程序),但您绝对可以打开会话并为用户实现状态。

您描述的错误条件是并发错误。您已在GAE(数据存储区,内存缓存等)中共享资源,并且如果您使用高复制数据存储,则还可以在数据存储中具有最终一致性。

GAE不保证同一服务器实例将为同一个人提供多个请求,并且默认情况下没有多线程(无论如何,在java中我不确定python)。没有多线程,在任何给定时间任何实例上只有1个人。但是,如果启用多线程,则必须确保代码是线程安全的,否则您可以让2个用户在单个实例上修改变量,但这不是GAE独有的。

您肯定可以让2个用户在2个不同的服务器或相同的memcache条目上修改相同的数据存储区实体,并且您需要使用事务等对该案例进行编码。此外,最终的一致性可能会在写入和写入之间存在延迟。读取所以如果你写数据而另一个用户立即读取它们,它们可能得不到相同的值  背部。

答案 1 :(得分:3)

GAE仍然运行(虚拟?)服务器来处理HTTP请求。服务器实例可以启动,处理大量请求并关闭。在任何给定时刻,大量服务器实例都可能正在运行。两个连续的HTTP请求可能最终由同一服务器实例或单独的服务器实例提供服务。您需要将软件设计为无状态,因为您不知道它运行在哪个服务器实例上。

但是,由于GAE仍然运行虚拟服务器,因此您可以设置某种全局静态变量,该变量可以在给定服务器实例上的多个HTTP请求之间进行修改和访问。很可能你已经做了一些事情。

此状态通常无用,因为如上所述,您无法保证后续HTTP请求将命中同一服务器实例,或者无法控制服务器实例何时关闭。但是,例如,如果您想要对每个服务器实例平均服务的请求数进行实验,您可能会这样做。

答案 2 :(得分:2)

关于“无国籍状态”的一些评论:

  1. HTTP协议本身是无状态的,即请求不依赖于彼此(=不需要以某种预定义的顺序调用)。

  2. Web应用程序通常是有状态的。他们通过保存数据并根据该数据强制执行/限制某些操作来实现这一目标,例如:用户登录。

  3. 可以通过多种方式将数据保存在Web服务器上:数据库,缓存,内存。保存用户数据/状态的一种标准方法是servlet sessions

  4. 当人们说App Engine是无状态时,他们通常会提到前端实例没有自己的永久存储(即可写文件系统)这一事实。要在前端实例上保存状态代码,必须使用一种Google API:数据存储,内存缓存等。

相关问题