GAE Endpoint类中私有变量的生命周期是多少?

时间:2015-06-04 04:34:36

标签: java google-app-engine variables google-cloud-endpoints

我有一个即时通讯样式应用程序的代码。

public class MyEndpoint {
private Integer numberOfConvos=0;
...}

然后我像这样更新它:

@ApiMethod (name="createGroup")
public myModel createGroup(@Named("profile") String profile){
    numberOfConvos=numberOfConvos+1;
}

因此,每次我进行新的聊天时,我都可以创建一个独特且不断增加的ID。

如果我重新部署后端(例如错误修复)会重置变量吗?我不想将这一个令牌存储在数据存储区中,因为它似乎不需要,并且数据存储区会对读/写进行收费。

如果每次部署时都会重置,那么跟踪此变量的正确方法是什么?

如果在重新部署时没有重置,我怎么能强制它重置?

1 个答案:

答案 0 :(得分:2)

为每个线程初始化非static变量。多个线程可以在同一个App Engine实例上运行,并且您的Cloud Endpoint服务可以在多个实例上并行运行。

因此,假设在当前负载下,您通过3个实例I1,I2,I3提供Cloud Endpoint服务。我们还说每个实例运行5个线程。在这种情况下,您将拥有 15个不同版本的numberOfConvos ,其中包含15个不同的值。

请记住,Google可以随时打开或关闭实例,在这种情况下,您的服务将被移动到其他实例。 这会重置numberOfConvos变量

更一般地说:你的java代码应该是无状态的,你不应该在变量中的请求之间存储状态,即使是static

你有两个选择:

  • 如果您不想/需要跟踪服务器上的convos数量,并且只想要一种方法来唯一标识每个convo,那么使用UUID类生成一个唯一的id每个convo,碰撞风险很低。 The documentation is here但是典型的代码是:

    UUID.randomUUID().toString()
    
  • 如果您想跟踪计划的数量,或者在服务器上保留convo ID,您唯一的选择是使用App Engine的数据存储区等数据库来跟踪变量。如果您是这个主题的新手,我建议你read a bit about transactions,否则你将无法正确管理状态。请注意,App Engine可以自动为您生成ID。