Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine GAE是无国籍的吗?这意味着什么?_Google App Engine_Stateless - Fatal编程技术网

Google app engine GAE是无国籍的吗?这意味着什么?

Google app engine GAE是无国籍的吗?这意味着什么?,google-app-engine,stateless,Google App Engine,Stateless,我曾经被告知GAE是无国籍的。我大体上理解无状态的概念,但在概念上将其应用于GAE类型系统时,我可以使用一些指导 我问这个问题是因为我发现我开发的一个应用程序似乎有干扰问题。也就是说,当两个或更多的人同时使用它时,它会变得混乱。(我正在继续进行错误测试,以确认错误仅在同时使用期间发生。)我认为理论上有两种方式会发生这种干扰:A,错误的GQL查询获得错误的db记录(我检查了这个,没有);或者b。在服务器级别。我的问题是:后者真的可能吗?当应用程序运行时,一个用户可以通过改变程序中变量的状态来干扰另

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

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

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

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


这种状态通常是无用的,因为如前所述,您无法保证后续HTTP请求将命中同一服务器实例,也无法保证在服务器实例关闭时对其进行任何控制。但是,例如,如果您想对每个服务器实例平均提供多少请求进行实验,您可能可以这样做。

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

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

您描述的错误条件是并发性。您在GAE中拥有共享资源(数据存储、memcache等),如果您使用的是高复制数据存储,那么您在数据存储中也拥有最终的一致性

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

您完全可以让两个用户在两台不同的服务器上修改相同的数据存储实体或相同的memcache条目,您需要使用事务为这种情况编写代码,此外,由于最终的一致性,写入和读取之间可能存在延迟,因此,如果您写入数据,而另一个用户立即读取数据,则可能无法获得相同的值 回来

关于“无国籍状态”的几点评论:

  • HTTP协议本身是无状态的,即请求不相互依赖(=不需要按预定义顺序调用)

  • Web应用程序通常是状态完整的。他们通过保存数据和基于该数据强制/限制某些操作(例如用户登录)来实现这一点

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

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


  • 你让我接近我需要了解的东西。请详细说明:每个用户将在每个使用会话中发送许多HTTP请求。如果一致(虚拟)服务器不处理每个用户,如何保存变量状态?例如,我创建了一个类
    userData()
    的python对象——如果服务器实例不断变化,它是如何存储的?如果userData是一个任意的python类,那么它只是在正在运行的服务器实例上实例化的。根据变量的范围,它可能会也可能不会通过多个请求生存。无论哪种情况,你都不想使用这个。您希望将数据存储在数据存储中,因此userData应该从ndb.Models派生,您可以将其存储在数据存储中。数据存储在所有服务器实例之间共享,因此从数据存储获取的数据将是“全局的”。不过,您确实需要使用事务来同步数据存储访问。哦,如果您使用的是memcache,您需要知道memcache数据可以随时清除。顾名思义,这是一个缓存,您需要一个稳定的备份数据,如数据存储,以存储您的数据,以防它在memcache中不可用。我使用数据存储来存储我所有的用户数据,但是你说的听起来好像意味着,如果我想可靠地访问他们的数据,每次用户加载一个页面时,我都需要进行DB读取。这是真的吗?在这一点上,我没有使用memchache(我读过它,没有任何地方使用过memcache.anything)。我不明白的是每次用户加载