Какой правильный подход для приложения Twitter на Google App Engine?

Я пытаюсь разработать приложение для Twitter на Google App Engine. Приложение в основном собирает все твиты от пользователя Twitter и его / ее последователей и их последователей и так далее. Обычно он собирает 500 твитов на каждый прогон для каждого пользователя, а затем вставляет данные для пользователя в базу данных.

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

1 ответ

Чтобы избежать DeadlineExceededExceptions, используйте несколько очередей отложенных задач. С очередями задач легче разбить несколько задач на более мелкие единицы работы, что не позволяет какой-либо отдельной задаче превышать 10-минутный порог, назначенный очередям задач.

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

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

import logging

from google.appengine.ext import deferred

  def do_something_expensive(a, b, c=None):
      logging.info("Fetching Twitter feeds!")
      # Fetch the Twitter data here


# Somewhere else - Pass in parameters needed by the Twitter API
deferred.defer(do_something_expensive, "BobsTwitterParam1", "BobsTwitterParam2", c=True)
deferred.defer(do_something_expensive, "BobsFriendTwitterParam1", "BobsFriendTwitterParam2", c=True)

Процесс извлечения данных у пользователей Twitter по своей природе рекурсивный, поскольку вы извлекаете данные для подписчиков подписчиков и т. Д., И эта задача как единый процесс может быть довольно дорогой и, вероятно, превысит пороговое значение.

Задача должна завершить выполнение и отправить значение ответа HTTP между 200–299 в течение 10 минут после исходного запроса. Этот крайний срок отделен от пользовательских запросов, которые имеют 60-секундный крайний срок. Если выполнение вашей задачи приближается к пределу, App Engine вызывает DeadlineExceededError (из модуля google.appengine.runtime), который вы можете перехватить, чтобы сохранить свою работу или записать ход выполнения до истечения крайнего срока. Если задачу не удалось выполнить, App Engine повторяет ее на основе критериев, которые вы можете настроить.

Однако если вы разделяете каждого пользователя Twitter на совершенно отдельную задачу, то каждая задача выполняется только столько времени, сколько требуется для получения результатов Twitter для одного пользователя. Мало того, что это более эффективно, но если есть проблема при получении одной из данных пользователя, только эта задача не будет выполнена, в то время как другие должны продолжать выполняться.

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

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

Другие вопросы по тегам