4

タスク (queueing-task) を使用して、他の複数のタスク (ファンアウト) をキューに入れています。task 引数が5 つ以上の要素を持つTaskインスタンスのリストであり、トランザクション内にあるQueue.addを使用しようとすると、このエラーが発生します。

JointException: taskqueue.DatastoreError caused by: 
    <class 'google.appengine.api.datastore_errors.BadRequestError'> 
    Too many messages, maximum allowed 5

トランザクションで 5 つ以上のタスクをキューに入れる別の方法はありますか?

または...

たぶん、トランザクションは必要ありません。原因:

  1. とにかく、これらのタスクのいずれかが 2 回キューに入れられても気にしません。
  2. それらのいずれかでキューイングが失敗した場合、キューイングタスク全体が再実行されます。

トランザクションで 5 つ以上のタスクをキューに入れる方法を教えてください。またはトランザクションを使用しないように教えてください。トランザクションは本当に必要ないからです。

4

1 に答える 1

2

問題の解決に近い解決策の 1 つは、残りのタスクをファンアウトするトランザクション タスクを 1 つ追加することです。既存のトランザクションに 1 つのファンアウト タスクを追加するだけです。

ビジネス ロジック上の理由がない限り、既に実行されているタスクを再実行しないでください。タスクの再挿入 (つまり重複) を防止するのは簡単で、リソースを節約できます。ファンアウト タスクは基本的に次のようになります。

class FanOutTask(webapp.RequestHandler):
  def get(self):
    name = self.request.get('name')
    params = deserialize(self.request.get('params'))

    try:
      task_params = params.get('stuff')
      taskqueue.add(url='/worker/1', name=name + '-1', params=task_params)
    except TaskAlreadyExistsError:
      pass

    try:
      task_params = params.get('more')
      taskqueue.add(url='/worker/2', name=name + '-2', params=task_params)
    except TaskAlreadyExistsError:
      pass

ファンアウト タスクをトランザクションで追加すると、確実にエンキューされます。既に実行されているタスクに起因するエラーは捕捉されて無視され、他のエラーはファンアウト タスクを再実行させます。このパターンを使用すると、多くのサブタスクを非常に簡単に挿入できます。

于 2010-09-30T15:26:50.843 に答える