3

Добрый день,API для API приложений Google: Выполнение больших задач

Я запускаю back-end для приложения в качестве механизма приложения (Java). Используя конечные точки, я получаю запросы. Проблема в том, что мне нужно вычислить что-то большое, но мне нужно быстрое время отклика для интерфейса. Поэтому, как решение, я хочу прекомпопулировать что-то и сохранить в нем выделенный memcache.

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

Теперь эта отложенная задача выполняет большое количество операций хранилища данных. Иногда они тайм-аут. Поэтому я создал систему, в которой он повторяет тайм-аут до тех пор, пока он не удастся. Однако, когда я запускаю движок приложения, он немедленно создает две отложенные задачи. Он также продолжает повторять задачи, когда они терпят неудачу, несмотря на то, что я установил DeferredTaskContext.setDoNotRetry (true) ;.

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

Я просто хочу запустить метод, который занимает> 5 минут (вероятно, дольше по мере роста набора данных). Я хочу запустить этот метод при запуске, а затем на регулярной основе. Как бы вы это сформулировали? Моей первой мыслью была работа cron, но они ограничены во времени. Мне понадобилось бы задание cron, выполняющее отложенную задачу, надеясь, что они не набудут что-то, не создадут дубликаты или не начнут повторять попытку.

Спасибо за помощь и хороший день.

Dries

+0

Задачи cron имеют тот же крайний срок, что и отложенные задачи – Greg

+1

Как вы собираетесь делиться/получать доступ к этим данным (классификатору) через экземпляры. Помните, что каждый экземпляр имеет свою собственную память. Поэтому на данный момент я предполагаю, что вы начинаете эту сборку каждый раз, когда запускается экземпляр. После обработки он может быть сериализован до <1 МБ, если нет, тогда вам понадобится разделить сериализованный объект и сохранить его в кусках (в хранилище данных). Получить от datatstore не намного медленнее, чем memcache и является надежным. –

+0

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

ответ

1
  1. Ваши операции в хранилище никогда не следует тайм-аут. Вам нужно исправить это - скорее всего, используя курсоры и задав правильный размер партии для ваших больших запросов.

  2. Вы можете выполнить initialization of objects on instance startup - проверьте, доступен ли объект, если нет - выполните вычисления.

  3. Не забудьте сохранить результаты ваших вычислений в хранилище данных (в дополнение к Memcache), поскольку Memcache нестабилен. Таким образом, вам не нужно пересчитывать все через несколько секунд после завершения первого вычисления, если по какой-либо причине был удален объект Memcache.

  4. Отложенные задачи могут планироваться после истечения заданной задержки. Поэтому вместо использования задания cron вы можете создать задачу, которая будет выполнена через 1 час (например). Эта задача, когда она завершает свои собственные вычисления, может создать еще одну задачу, которая будет возбуждаться через час, и так далее.

+1

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

+0

Если вы можете сохранить его в Memcache, вы можете сохранить его в хранилище данных. И ни один запрос никогда не должен истекать, даже если вы извлекаете миллиард объектов, если вы используете курсоры. –

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