4

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

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

4

3 回答 3

7

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

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

您描述的错误情况是并发之一。您在 GAE 中共享资源(数据存储、内存缓存等),并且如果您使用高复制数据存储,您还可以在数据存储中获得最终一致性。

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

您绝对可以让 2 个用户在 2 个不同的服务器或相同的 memcache 条目上修改相同的数据存储实体,并且您需要使用事务等针对这种情况进行编码。此外,在最终一致性的情况下,写入和读取之间可能存在延迟,因此如果您写入数据而另一个用户立即读取它,他们可能不会得到相同的值。

于 2012-04-13T18:35:33.140 回答
5

GAE still runs (virtual?) servers to handle HTTP requests. A server instance may start up, handle a number of requests, and shut down. At any given moment, a large number of server instances may all be running. Two sequential HTTP requests may end up being served by the same server instance or separate server instances. You need to design your software to be stateless, because you have no idea which server instance it runs on.

However, since GAE still runs virtual servers, it's possible that you can set some sort of global static variable that can be modified and accessed between multiple HTTP requests on a given server instance. Most likely you've done something along the lines of this.

This state is generally useless, because, as mentioned, you have no guarantees that subsequent HTTP requests will hit the same server instance, or any control on when a server instance is shut down. However, for example, if you wanted to run an experiment on how many requests each server instance serves on average, you probably could do that.

于 2012-04-13T18:07:06.633 回答
3

关于“无国籍”的几点说明:

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

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

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

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

于 2012-04-13T19:45:54.390 回答