Запись в хранилище данных GAE асинхронно - PullRequest
0 голосов
/ 21 сентября 2011

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

Кажется довольно ясным, что я мог бы сделать это, используя очереди задач GAE, ставя задачу в очередь для хранения данных.Но я также вижу, что есть API хранилища данных Async, который, кажется, будет намного проще, чем работа с очередями задач.

Могу ли я просто вызвать AsyncDatastoreService.put () и затем вернуться из моего сервлета?Будет ли этот API хранить мои данные, не заставляя пользователей ждать?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

Я думаю, вы правы, что асинхронные вызовы кажутся проще. Однако в документах для AsyncDatastore упоминается одна оговорка, которую следует учитывать:

Примечание. Исключения не генерируются, пока вы не вызовете метод get (). Вызов этого метода позволяет проверить успешность асинхронной операции.

«get» в этой заметке вызывается для объекта Future, возвращаемого асинхронным вызовом. Если вы просто вернетесь из своего сервлета без вызова get для объекта Future, вы можете не знать наверняка, сработал ли ваш put ().

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

1 голос
/ 22 сентября 2011

К сожалению, здесь нет действительно хороших решений. Вы можете поставить задачу в очередь, но есть несколько больших проблем:

  • Полезные нагрузки задачи ограничены по размеру, и этот размер меньше, чем ограничение размера сущности.
  • Запись записи в хранилище данных на самом деле довольно быстрая, во время настенных часов. Значительная часть затрат также заключается в сериализации данных, которую вы должны сделать, чтобы в любом случае добавить их в очередь задач.
  • Используя очередь задач, вы создаете более возможную согласованность - пользователь может вернуться и не увидеть внесенные изменения, поскольку задача еще не выполнена. Вы также можете представлять проблемы с транзакциями - как вы обрабатываете параллельные обновления?
  • Если что-то не получается, применение обновлений пользователя может занять произвольно много времени. В таких ситуациях, вероятно, было бы лучше просто вернуть ошибку пользователю.

Я бы порекомендовал использовать асинхронный API там, где это возможно, но всегда писать напрямую в хранилище данных. Обратите внимание, что вам нужно подождать всех ожидающих вызовов API, как указывает Питер, или вы не узнаете, не произошли ли они - и если вы не будете ждать их, сервер приложений перед возвратом ответа пользователю .

0 голосов
/ 21 сентября 2011

Если все, что вам нужно, - это чтобы пользователь имел отзывчивый интерфейс, в то время как в задней части базы данных происходит отток данных, все, что вам нужно сделать, это сделать асинхронный вызов на уровне клиента, то есть сделать ajax, который отправляет запись в базу данных. запрос, изменения немедленно отображаются пользователями, а затем при обратном вызове Ajax-запроса обновите представление с тем, что вы хотите.

Вы можете легко добавить поддержку GWT в свой проект GAE (либо через плагин eclipse, либо через плагин maven gae) и проводить время, выполняя асинхронные операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...