Всплеск вычислительной мощности с TaskQueues? - PullRequest
1 голос
/ 05 апреля 2011

У меня возникла ситуация, когда я хочу сделать 1000 различных запросов к хранилищу данных, выполнить некоторые вычисления по результатам каждого отдельного запроса (чтобы получить 1000 отдельных результатов) и вернуть список результатов.

Я бы хотел, чтобы список результатов возвращался как ответ на тот же 30-секундный запрос пользователя, который начал вычисления, для повышения производительности на стороне клиента.Ха!

У меня есть смелый план.

Каждая из этих операций обычно не будет иметь проблем с завершением менее чем за секунду, ни одна из них не должна записываться в ту же группу сущностей, что и любая другаяи ни одному из них не нужна информация из других запросов.Может ли быть возможно запустить 1000 независимых задач, каждая из которых выполняет один из этих запросов, выполняет свои вычисления и сохраняет результат во временном наборе объектов?Исходный запрос может подождать 10 секунд, а затем выполнить один запрос для результатов из хранилища данных (возможно, все они задают уникальное значение, к которому я могу запросить).Любые результаты, которые еще не получены, будут замечены на стороне клиента, и клиент может просто запросить эти значения еще раз через десять секунд.

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

  • Это смешно?Если так, это смешно для любого количества задач?Разве 50 будет разумным?
  • Я не столкнусь с разногласиями в хранилище данных, если я буду читать одну и ту же сущность 20 раз в секунду, верно?Это утверждение материал все для записи?

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

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

Один из вариантов - использовать Datastore Plus / NDB , который позволяет выполнять запросы впараллельно.Однако 1000 запросов будут очень дорогими, независимо от того, как вы их выполняете.

Другой вариант, как предлагает @Chris, - это использовать очередь задач с Channel API, чтобы вы могли уведомлять пользователя асинхроннокогда запросы завершены.

1 голос
/ 05 апреля 2011

Да, звучит довольно нелепо :)

Вы не должны полагаться на Taskqueue для такой работы.Вы не можете полагаться на то, что 1000 задач создаются так быстро (хотя, скорее всего, так и будет).

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

  • Клиент отправляет запрос на сервер
  • Сервер порождает N задач для выполнения ваших расчетов и отвечает Клиенту с помощью токена API канала
  • Клиент слушаетна канал с помощью токена
  • Как только все задачи завершены, сервер отправляет ответ клиенту по каналу

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

...