4

Google App Engine で Twitter アプリを開発しようとしています。このアプリは基本的に、Twitter ユーザーとそのフォロワー、およびそのフォロワーなどからすべてのツイートを収集します。通常、1 回の実行でユーザーごとに 500 ツイートを収集し、ユーザーのデータをデータベースに挿入します。

ツイートの収集プロセスは 1 時間ごとに実行する必要があります。現在、これを行うためにcronジョブを使用しています。しかし、1 人のユーザーに対しても多くの期限超過エラーが発生します。これは良い兆候ではありません。私はPythonを使用しています。だから私はこれに何を使うべきか知りたかったのですか?Web で検索したところ、cron と共にタスク キューが使用できることがわかりました。しかし、私はそれを行う方法がわかりません。誰かが私を助けてくれれば、とても感謝しています。また、私が使用できる他の方法/アプローチはありますか?

4

1 に答える 1

4

DeadlineExceededExceptions を回避するには、複数の Deferred Push Task Queuesを使用します。タスク キューを使用すると、複数のタスクをより小さな作業単位に簡単に分割できます。これにより、個々のタスクがタスク キューに割り当てられた 10 分のしきい値を超えないようにすることができます。

タスク キュー API を使用すると、アプリケーションは、ユーザー リクエストによって開始された、ユーザー リクエストの外部で作業を実行できます。アプリが何らかのバックグラウンド作業を実行する必要がある場合、Task Queue API を使用して、その作業をタスクと呼ばれる小さな個別の単位に編成できます。アプリは、後で実行するタスクをタスク キューに追加します。

Deferred Task Queueは Push Task Queue であり、基本的にスケジュールされたタスクであり、いつ起動するかがあらかじめ決められています。Deferred Task の作成方法の短いサンプルを次に示します。

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 ユーザーからデータを取得するプロセスは、本質的に再帰的です。これは、フォロワーのフォロワーなどのデータを取得しているためです。単一のプロセスとしてのこのタスクは、非常にコストがかかる可能性があり、しきい値を超える可能性があります。

タスクは実行を終了し、元の要求から 10 分以内に 200 ~ 299 の HTTP 応答値を送信する必要があります。この期限は、60 秒の期限があるユーザー リクエストとは別のものです。タスクの実行が制限に近づくと、App Engine は (モジュール google.appengine.runtime から) DeadlineExceededError を発生させます。これをキャッチして、作業を保存したり、期限が過ぎる前に進行状況をログに記録したりできます。タスクの実行に失敗した場合、App Engine は構成可能な基準に基づいてタスクを再試行します。

ただし、各 Twitter ユーザーを完全に個別のタスクに分割すると、各タスクは、1 人のユーザーの Twitter の結果を取得するのにかかる時間だけ実行されます。これはより効率的であるだけでなく、ユーザーのデータの 1 つを取得する際に問題が発生した場合、そのタスクのみが失敗し、他のタスクは引き続き実行されます。

つまり、1 つのタスクですべてのデータを取得しようとしないでください。

または、万一、または何らかの理由でこれらのタスクが 10 分のしきい値を超える場合は、バックエンドを調べてください

于 2012-05-20T19:29:48.917 に答える