我有一个即时通讯样式应用程序的代码。
public class MyEndpoint {
private Integer numberOfConvos=0;
...}
然后我像这样更新它:
@ApiMethod (name="createGroup")
public myModel createGroup(@Named("profile") String profile){
numberOfConvos=numberOfConvos+1;
}
因此,每次我进行新的聊天时,我都可以创建一个独特且不断增加的ID。
如果我重新部署后端(例如错误修复)会重置变量吗?我不想将这一个令牌存储在数据存储区中,因为它似乎不需要,并且数据存储区会对读/写进行收费。
如果每次部署时都会重置,那么跟踪此变量的正确方法是什么?
如果在重新部署时没有重置,我怎么能强制它重置?
答案 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。