1

У меня есть следующий код для приложения в стиле мессенджера.Какова продолжительность жизни частной переменной в классе конечных точек GAE?

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

я обновить его так:

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

Так каждый раз я сделать новый чат, я могу сделать уникальный и растущий ID.

Если я переделаю сервер (например, исправление ошибки), будет ли сброшена переменная? Я не хочу хранить этот токен в хранилище данных, потому что он не кажется необходимым и плата за чтение данных/записи.

Если он будет сброшен каждый раз, когда я развертываю, что является правильным способом отслеживать эту переменную?

Если это не сбрасывается при перераспределении, как я могу заставить его сбросить?

ответ

2

Для каждого потока инициализируется переменная non static. Несколько потоков могут выполняться в одном экземпляре App Engine, и ваша служба Cloud Endpoint может работать в нескольких экземплярах параллельно.

Итак, давайте скажем, что с учетом текущей нагрузки служба Cloud Endpoint обслуживается через три экземпляра I1, I2, I3. Давайте также скажем, что каждый экземпляр запускает 5 потоков. В этом случае у вас будет 15 различных версий numberOfConvos с 15 различными значениями.

Имейте в виду, что экземпляры могут быть включены или отключены Google в любое время, и в этом случае ваша служба будет перенесена в другой экземпляр. Это приведет к сбросу numberOfConvos переменной.

Чтобы выразить это в целом: ваш код Java должен быть без гражданства, вы не должны сохранять состояние между запросами в переменной, даже static.

У вас есть два варианта здесь:

  • Если вы не хотите/нужно следить за количеством convos на сервере и просто хотите способ однозначно идентифицировать каждую Convo, а затем использовать UUID класс для создания уникального идентификатора для каждого конвоя с очень низким риском столкновения. The documentation is here но типичный код будет:

    UUID.randomUUID().toString() 
    
  • Если вы хотите, чтобы следить за количеством convos, или сохраняются в Convo иды на сервере, ваш единственный выбор, чтобы использовать базу данных, таких как хранилища данных App Engine, для отслеживания переменной. Если вы новичок в этой теме, я предлагаю вам read a bit about transactions, иначе вы не сможете правильно управлять состоянием. Обратите внимание, что App Engine может автоматически создавать идентификаторы для вас.

+0

Как уже упоминалось в моем посте, я не хочу, чтобы держать его в хранилище из-за многих операций чтения/записи, мы бы понести, а также 1 локаута во всем мире, когда чтение/запись для этого объекта. Для чат-приложения это не совсем приемлемая вещь. Я всегда мог генерировать случайный идентификатор и проверять, был ли этот идентификатор ранее (я делаю это в другом месте), однако я недоволен загрузкой процессора. Какие-нибудь другие варианты, как вы видите? – Japes

+1

Если вы передумали и захотите использовать хранилище данных, вы можете взглянуть на осколочные счетчики. https://cloud.google.com/appengine/articles/sharding_counters – gipsy

+0

Если формат id не важен для вас, и вы не хотите хранить данные в хранилище данных, используйте UUID для генерации случайного идентификатора с сильным гарантирует, что он еще не будет существовать. – David

Смежные вопросы