Java GAE端点类中私有变量的生命周期是多少?
我有一个即时通讯风格的应用程序的以下代码Java GAE端点类中私有变量的生命周期是多少?,java,google-app-engine,variables,google-cloud-endpoints,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; } 因此,每次我进行新的聊天时,我都可以创
public class MyEndpoint {
private Integer numberOfConvos=0;
...}
然后我更新它如下:
@ApiMethod (name="createGroup")
public myModel createGroup(@Named("profile") String profile){
numberOfConvos=numberOfConvos+1;
}
因此,每次我进行新的聊天时,我都可以创建一个独特且不断增加的ID
如果我重新部署后端(例如bug修复),变量会被重置吗?我不想将这一个令牌存储在数据存储中,因为它似乎不需要,而且数据存储对读/写操作收费
如果每次部署时都会重置它,那么跟踪此变量的正确方法是什么
如果在重新部署时未重置is,如何强制重置?为每个线程初始化一个非
静态变量。多个线程可以在同一个应用程序引擎实例上运行,您的云端点服务可以在多个实例上并行运行
假设给定当前负载,云端点服务通过3个实例I1、I2、I3提供。我们还假设每个实例运行5个线程。在这种情况下,您将拥有15个不同值的numberofconvas
的15个不同版本
请记住,谷歌可以随时打开或关闭实例,在这种情况下,您的服务将被移动到另一个实例这将重置numberofconva
变量
更一般地说:java代码应该是无状态的,不应该将请求之间的状态存储在变量中,即使是静态变量
您有两种选择:
- 如果您不想/不需要跟踪服务器上的车队数量,只想找到一种唯一标识每个车队的方法,那么使用
UUID
类为每个车队生成一个唯一的id,冲突风险非常低。但典型的代码是:
UUID.randomUUID().toString()
- 如果要跟踪车队的数量,或在服务器上持久保存车队ID,您唯一的选择是使用数据库(如App Engine的数据存储)来跟踪变量。如果你是这方面的新手,我建议你,否则你将无法正确管理状态。请注意,应用程序引擎可以自动为您生成ID
正如我在文章中提到的,我不想把它保存在数据存储中,因为我们会发生很多读/写操作,而且当我读/写该实体时会在全局范围内锁定1。对于聊天应用来说,这并不是一件可以接受的事情。我总是可以生成一个随机ID,并检查该ID是否在以前生成过(我在另一个地方这样做),但是我对CPU开销不满意。如您所见,还有其他选择吗?如果您改变主意并想使用数据存储,您可能需要查看切分计数器。如果id格式对您不重要,并且您不想在数据存储中存储数据,请使用UUID生成一个随机id,并强烈保证它不存在。请将UUID作为答案写入,我将选择它。