【问题标题】:What is the lifespan of a private variable in an GAE Endpoint class?GAE Endpoint 类中私有变量的生命周期是多少?
【发布时间】:2015-06-04 04:34:36
【问题描述】:

我有以下即时通讯风格应用程序的代码。

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

然后我像这样更新它:

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

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

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

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

如果我重新部署时没有重置,我该如何强制它重置?

【问题讨论】:

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


    【解决方案1】:

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

    假设在当前负载下,您的 Cloud Endpoint 服务通过 3 个实例 I1、I2、I3 提供服务。假设每个实例运行 5 个线程。在这种情况下,您将拥有 15 个不同版本的 numberOfConvos,具有 15 个不同的值。

    另请注意,Google 可以随时打开或关闭实例,在这种情况下,您的服务将被移至其他实例。 这将重置numberOfConvos 变量

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

    你有两个选择:

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

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

    【讨论】:

    • 正如我的帖子中提到的,我不想将它保存在数据存储中,因为我们会发生许多读/写操作,以及当我读/写该实体时全局锁定 1 次。对于聊天应用程序来说,这并不是一件真正可以接受的事情。我总是可以生成一个随机 ID,并检查该 ID 之前是否已经生成(我在另一个地方这样做)但是我对 CPU 开销不满意。你看到的还有其他选择吗?
    • 如果您改变主意并想使用数据存储,您可能需要查看分片计数器。 cloud.google.com/appengine/articles/sharding_counters
    • 如果 id 格式对您来说不重要,并且您不想将数据存储在数据存储中,请使用 UUID 生成随机 id,并强烈保证它不会已经存在。跨度>
    • 请写UUID作为答案,我会选择它。
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多