Объединение результатов задач, запущенных в GAE (Java) Push Queue

Я хочу поместить задачи в очередь push-уведомлений в своем Java-приложении GAE, чтобы проверять статус моих пользователей, по 1 пользователю на задачу. Я изо всех сил пытаюсь найти хорошее решение для отслеживания и консолидации результатов аудита безопасным и эффективным способом по каждой из задач.

В настоящее время я использую отложенную задачу, которая имеет один параметр в своем конструкторе: строковое представление ключа объекта, представляющего пользователя, которого я пытаюсь проверить.

Типы данных, которые мне нужно хранить для каждого пользователя, - это да/нет, например, активны ли они, отменены/не отозваны ли их подключения к другим службам и т. д. Когда я объединяюсь, все, что я хочу сделать, это добавить все да и нет для каждого вопроса, так что, например. У меня 1000 активных пользователей и 200 неактивных пользователей и т.д.

Подходы, которые я рассматривал (извините за наивность...):

  • Each task puts its own entity, which I then check afterwards to consolidate the results of all the tasks
    • Pros: thread safe and safe in a distributed environment
    • Минусы: относительно дорого (т. е. потому что мне нужно написать много строк, а затем удалить их) и неудобство, потому что мне нужно постобработать сущность, чтобы объединить данные из каждой из строк.
  • I could grab an instance of some singleton class within each deferred task, and use that to hold and consolidate the data, and then cause it to persist its data later
    • Pros: cheap (don't have to write/delete extra data), tidy because the single object does all the pieces of work, can be made thread safe
    • Минусы: в GAE я не могу (легко?) полагаться на то, что синглтон действительно является синглтоном, потому что он распределен, поэтому на практике я могу получить данные, объединенные в два или более похожих «одиночных» объекта.
  • I suspect I could write the data into some predefined context object (the servlet context?), or memcache?
    • Pros: cheap, fast, potentially simple?
    • Минусы: данные memcache могут быть переопределены — это небезопасно; не уверен в контексте сервлета

Суть в том, что все это мои выдуманные подходы, и я уверен, что должен быть стандартный подход/шаблон для выполнения такого рода вещей... но я не смог его найти.

Любые советы, пожалуйста...? Спасибо!


person nickpharris    schedule 12.02.2014    source источник


Ответы (1)


Есть несколько распространенных подходов:

Счетчики хранилища данных https://developers.google.com/appengine/articles/sharding_counters

Счетчики MemCache https://developers.google.com/appengine/articles/scaling/memcache#transient http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding

Очередь извлечения и теги задач http://www.youtube.com/watch?v=AM0ZPO7-lcE

person Eric Willigers    schedule 12.02.2014