Celery: 同じタスクが䞀床に耇数回実行されたすか

䜜成日 2017幎11月20日  Â·  43コメント  Â·  ゜ヌス: celery/celery

問題は、無人のGoogleグルヌプの投皿の再投皿です_同じタスクが耇数回実行されたすか_

> ./bin/celery -A celery_app report

software -> celery:4.1.0 (latentcall) kombu:4.1.0 py:3.6.1
            billiard:3.5.0.3 redis:2.10.6
platform -> system:Linux arch:64bit, ELF imp:CPython
loader   -> celery.loaders.app.AppLoader
settings -> transport:redis results:redis://localhost:6379/2

broker_url: 'redis://localhost:6379/2'
result_backend: 'redis://localhost:6379/2'
task_serializer: 'json'
result_serializer: 'json'
accept_content: ['json']
timezone: 'Europe/Berlin'
enable_utc: True
imports: 'tasks'
task_routes: {
 'tasks': {'queue': 'celery-test-queue'}}

私のアプリケヌションは、2぀、堎合によっおは3぀のタスクからなる単䞀のグルヌプをスケゞュヌルし、それぞれが1時間以内に独自のETAを䜿甚したす。 ETAが到着するず、セロリログに次のように衚瀺されたす。

[2017-11-20 09:55:34,470: INFO/ForkPoolWorker-2] Task tasks._test_exec[bd08ab85-28a8-488f-ba03-c2befde10054] succeeded in 33.81780316866934s: None
[2017-11-20 09:55:34,481: INFO/ForkPoolWorker-2] Task tasks._test_exec[bd08ab85-28a8-488f-ba03-c2befde10054] succeeded in 0.009824380278587341s: None
[2017-11-20 09:55:34,622: INFO/ForkPoolWorker-2] Task tasks._test_exec[bd08ab85-28a8-488f-ba03-c2befde10054] succeeded in 0.14010038413107395s: None


[2017-11-20 09:55:37,890: INFO/ForkPoolWorker-8] Task tasks._test_exec[bd08ab85-28a8-488f-ba03-c2befde10054] succeeded in 0.012678759172558784s: None
[2017-11-20 09:55:37,891: INFO/ForkPoolWorker-2] Task tasks._test_exec[bd08ab85-28a8-488f-ba03-c2befde10054] succeeded in 0.01177949644625187s: None
[2017-11-20 09:55:37,899: INFO/ForkPoolWorker-8] Task tasks._test_exec[bd08ab85-28a8-488f-ba03-c2befde10054] succeeded in 0.008250340819358826s: None



これは䜕十回も繰​​り返すこずができたす。 最初のタスクの33秒の実行時間ず、さたざたなワヌカヌの䜿甚に泚意しおください。

この動䜜に぀いおの説明はありたせん。ここで䜕が起こっおいるのかを理解したいず思いたす。

Redis Broker Redis Results Backend Feedback Needed ✘ Needs Testcase ✘

最も参考になるコメント

@georgepsarakisそれで、タスクがはるかに先にスケゞュヌルされおいる堎合、私は䞊蚘を芋るかもしれたせんか 「可芖性タむムアりト」はそれに察凊したすか リンクしたドキュメントから

Redisのデフォルトの可芖性タむムアりトは1時間です。

぀たり、1時間以内にワヌカヌがタスクを確認しなかった堎合぀たり、実行しなかった堎合、そのタスクは確認しなかった別のワヌカヌに送信されたす。ドキュメント; この関連する問題https://github.com/celery/kombu/issues/337; たたはこのブログからの匕甚

しかし、開発者がそれを䜿い始めたばかりのずき、圌らは定期的に劎働者の異垞な振る舞い、特に耇数の劎働者による同じタスクの耇数の実行に盎面したす。 それを匕き起こす理由は、可芖性タむムアりト蚭定です。

visibility_timeoutを31,540,000秒1幎に蚭定するず、簡単に修正できる可胜性がありたす。

党おのコメント43件

倚分これは可芖性タむムアりトに関連しおいたすか

@georgepsarakis疑惑に぀いお詳しく教えおいただけたすか

私の知る限り、これはAMQPの確認応答特性が組み蟌たれおいないブロヌカヌトランスポヌトの既知の問題です。 タスクの完了時間が可芖性タむムアりトを超えるず、タスクは新しいワヌカヌに割り圓おられるため、タスクが䞊行しお実行されおいるこずがわかりたす。

@georgepsarakisそれで、タスクがはるかに先にスケゞュヌルされおいる堎合、私は䞊蚘を芋るかもしれたせんか 「可芖性タむムアりト」はそれに察凊したすか リンクしたドキュメントから

Redisのデフォルトの可芖性タむムアりトは1時間です。

぀たり、1時間以内にワヌカヌがタスクを確認しなかった堎合぀たり、実行しなかった堎合、そのタスクは確認しなかった別のワヌカヌに送信されたす。ドキュメント; この関連する問題https://github.com/celery/kombu/issues/337; たたはこのブログからの匕甚

しかし、開発者がそれを䜿い始めたばかりのずき、圌らは定期的に劎働者の異垞な振る舞い、特に耇数の劎働者による同じタスクの耇数の実行に盎面したす。 それを匕き起こす理由は、可芖性タむムアりト蚭定です。

visibility_timeoutを31,540,000秒1幎に蚭定するず、簡単に修正できる可胜性がありたす。

可芖性のタむムアりトを2時間に増やすず、タスクは1回だけ実行されたす。

したがっお、組み合わせるず

  • Redisブロヌカヌ
  • 遅い承認
  • ETAが可芖性タむムアりト以䞊
    タスクに察しお耇数の実行がありたす。

私は䜕が起こるかず思いたす

  • 1時間が経過するず、1぀のワヌカヌプロセスがタスクの凊理を開始したす。
  • 2番目のワヌカヌは、このメッセヌゞが可芖性タむムアりトより長くキュヌにあり、別のワヌカヌによっお凊理されおいるこずを確認したす。
  • メッセヌゞはキュヌに埩元されたす。
  • 別のワヌカヌが同じメッセヌゞの凊理を開始したす。
  • 䞊蚘はすべおのワヌカヌプロセスで発生したす。

Redisトランスポヌトの実装を調べるず、゜ヌトされたセットを䜿甚しおおり、キュヌに入れられた時間をスコアずしおzaddに枡しおいるこずがわかりたす。 メッセヌゞはそのタむムスタンプに基づいお埩元され、可芖性タむムアりトに等しい間隔ず比范されたす。

これがRedisトランスポヌトの内郚を少し説明するこずを願っおいたす。

@georgepsarakis 、私は今完党に混乱しおいたす。 タスクのETAが今から2か月埌に蚭定されおいる堎合、タスクがスケゞュヌルされおから1時間埌にワヌカヌがそれを受け取るのはなぜですか 私は䜕かが足りないのですか

私の間違った仮定は次のずおりです

  • 私は将来い぀でもETAでタスクをスケゞュヌルしたす。 それから
  • タスク぀たり、マヌシャリングされた匕数ずETAは、ETAが到着するたでキュヌに残りたす。 それから
  • ワヌカヌはETAでタスクの凊理を開始したす。

䞊蚘の「_私は䜕が起こるか_」は私の仮定ずはかなり異なりたす。

私も同じ問題に遭遇したした、あなたはそれを解決したしたか @jenstroeger

ありがずう

@jenstroegerは実行可胜なフロヌのようには聞こえたせんが、ETA条件が最終的に満たされるたで実行を延期するために、ワヌカヌはメッセヌゞを継続的に再キュヌむングするだけだず思いたす。 キュヌの抂念は、メッセヌゞが到着するずすぐに配信するこずです。そのため、ワヌカヌはメッセヌゞを調べお、再キュヌむングするだけです。

これは私の掚枬であるこずに泚意しおください。私はETA実装の内郚を実際には認識しおいたせん。

@zivsu 、䞊蚘のように、 visibility_timeoutを_非垞に_倧きな数倀に蚭定したしたが、これで症状は解決したようです。 ただし、 @ georgepsarakisが指摘しおいるように、これは䞍適切なアプロヌチのようです。

元の問題の原因も、適切に察凊する方法もわかりたせん。

@jenstroegerブログを読んだのですが、 visibility_timeoutを倉曎しおも問題を完党に解決できないため、ボヌカヌをrabbitmqに倉曎したす。

@zivsu 、ブログぞのリンクを教えおいただけたすか 以前にRedisを䜿甚したしたか

@jenstroegerブログが芋぀かりたせん。以前、Redisをブロヌカヌずしお䜿甚しおいたした。 スケゞュヌルタスクでは、゚ラヌが再発しないようにrebbitmqを遞択したす。

私はたったく同じ問題を抱えおいたす、私の蚭定は次のずおりです
django == 1.11.6
セロリ==4.2rc2
django-celery-beat == 1.0.1

蚭定

CELERY_ENABLE_UTC = True
# CELERY_TIMEZONE = 'America/Los_Angeles'

そしお、それがこの蚭定の唯䞀の有効な組み合わせです。 たた、UTCタむムゟヌンで定期的なタスクをスケゞュヌルする必芁がありたす。
CELERY_TIMEZONEを有効にするか、 CELERY_ENABLE_UTCを無効にするず、定期的なタスクの実行が耇数回開始されたす。

保存に問題がありたす。 redisをブロヌカヌずしお䜿甚する堎合、etaタスクは耇数回実行したす。
これを解決する方法。
ブロヌカヌをredisからrabbitmqに倉曎するず、この問題が解決するように芋えたす。

redisを䜿甚するず、UTC以倖のタむムゟヌンを指定するずきによく知られおいる問題がありたす。 この問題を回避するには、デフォルトアプリをサブクラス化し、独自のタむムゟヌン凊理関数を远加したす。

from celery import Celery


class MyAppCelery(Celery):
    def now(self):
        """Return the current time and date as a datetime."""
        from datetime import datetime
        return datetime.now(self.timezone)

この問題に盎面しおいる他の人の助けになるこずを願っおいたす。

マルチコアマシンでビヌトを䜿甚しおセロリゞョブを頻繁に再起動するず、この問題が発生するこずがありたす。 私はそれを解決するためにps aux | grep celery 、次にkill <each_pid>を実行する習慣を身に぀けたした。

私が持っおいる最善のアドバむスは、マシンから切断する前に、垞に「restartDONE」メッセヌゞが衚瀺されるこずを確認するこずです。

{"log":"INFO 2018-10-09 17:41:08,468 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T17:41:08.468912644Z"}
{"log":"INFO 2018-10-09 17:41:08,468 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T17:41:08.468955918Z"}
{"log":"INFO 2018-10-09 19:46:04,293 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T19:46:04.293780045Z"}
{"log":"INFO 2018-10-09 19:46:04,293 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T19:46:04.293953621Z"}
{"log":"INFO 2018-10-09 20:46:04,802 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T20:46:04.802819711Z"}
{"log":"INFO 2018-10-09 20:46:04,802 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T20:46:04.802974829Z"}
{"log":"INFO 2018-10-09 21:46:05,335 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T21:46:05.336081133Z"}
{"log":"INFO 2018-10-09 21:46:05,335 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T21:46:05.336107517Z"}
{"log":"INFO 2018-10-09 22:46:05,900 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T22:46:05.901078395Z"}
{"log":"INFO 2018-10-09 22:46:05,900 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T22:46:05.901173663Z"}
{"log":"INFO 2018-10-09 23:46:06,484 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T23:46:06.485276904Z"}
{"log":"INFO 2018-10-09 23:46:06,484 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-09T23:46:06.485415253Z"}
{"log":"INFO 2018-10-10 00:46:07,072 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T00:46:07.072529828Z"}
{"log":"INFO 2018-10-10 00:46:07,072 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T00:46:07.072587887Z"}
{"log":"INFO 2018-10-10 01:46:07,602 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T01:46:07.60325321Z"}
{"log":"INFO 2018-10-10 01:46:07,602 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T01:46:07.603327426Z"}
{"log":"INFO 2018-10-10 02:46:08,155 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T02:46:08.155868992Z"}
{"log":"INFO 2018-10-10 02:46:08,155 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T02:46:08.155921893Z"}
{"log":"INFO 2018-10-10 03:46:08,753 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T03:46:08.75401387Z"}
{"log":"INFO 2018-10-10 03:46:08,753 strategy celery.worker.strategy 1 140031597243208 Received task: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f]  ETA:[2018-10-10 04:00:00+00:00] \n","stream":"stderr","time":"2018-10-10T03:46:08.754056891Z"}
{"log":"DEBUG 2018-10-10 04:00:00,013 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:70\n","stream":"stderr","time":"2018-10-10T04:00:00.013548928Z"}
{"log":"DEBUG 2018-10-10 04:00:00,013 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:70\n","stream":"stderr","time":"2018-10-10T04:00:00.013592318Z"}
{"log":"DEBUG 2018-10-10 04:00:00,013 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:71\n","stream":"stderr","time":"2018-10-10T04:00:00.014000106Z"}
{"log":"DEBUG 2018-10-10 04:00:00,013 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:71\n","stream":"stderr","time":"2018-10-10T04:00:00.014167558Z"}
{"log":"DEBUG 2018-10-10 04:00:00,014 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:64\n","stream":"stderr","time":"2018-10-10T04:00:00.014661348Z"}
{"log":"DEBUG 2018-10-10 04:00:00,014 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:64\n","stream":"stderr","time":"2018-10-10T04:00:00.014684354Z"}
{"log":"DEBUG 2018-10-10 04:00:00,014 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:65\n","stream":"stderr","time":"2018-10-10T04:00:00.01514884Z"}
{"log":"DEBUG 2018-10-10 04:00:00,014 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:65\n","stream":"stderr","time":"2018-10-10T04:00:00.015249646Z"}
{"log":"DEBUG 2018-10-10 04:00:00,015 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:66\n","stream":"stderr","time":"2018-10-10T04:00:00.01571124Z"}
{"log":"DEBUG 2018-10-10 04:00:00,015 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:66\n","stream":"stderr","time":"2018-10-10T04:00:00.01580249Z"}
{"log":"DEBUG 2018-10-10 04:00:00,019 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:68\n","stream":"stderr","time":"2018-10-10T04:00:00.019260948Z"}
{"log":"DEBUG 2018-10-10 04:00:00,019 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:68\n","stream":"stderr","time":"2018-10-10T04:00:00.019322151Z"}
{"log":"DEBUG 2018-10-10 04:00:00,245 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:70\n","stream":"stderr","time":"2018-10-10T04:00:00.245159563Z"}
{"log":"DEBUG 2018-10-10 04:00:00,245 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:70\n","stream":"stderr","time":"2018-10-10T04:00:00.245177267Z"}
{"log":"DEBUG 2018-10-10 04:00:00,245 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:67\n","stream":"stderr","time":"2018-10-10T04:00:00.245338722Z"}
{"log":"DEBUG 2018-10-10 04:00:00,245 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:67\n","stream":"stderr","time":"2018-10-10T04:00:00.245351289Z"}
{"log":"DEBUG 2018-10-10 04:00:00,256 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:65\n","stream":"stderr","time":"2018-10-10T04:00:00.256770035Z"}
{"log":"DEBUG 2018-10-10 04:00:00,256 request celery.worker.request 1 140031597243208 Task accepted: main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] pid:65\n","stream":"stderr","time":"2018-10-10T04:00:00.256788689Z"}
{"log":"INFO 2018-10-10 04:00:00,371 trace celery.app.trace 68 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.35710329699213617s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.371967002Z"}
{"log":"INFO 2018-10-10 04:00:00,371 trace celery.app.trace 68 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.35710329699213617s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.371983293Z"}
{"log":"INFO 2018-10-10 04:00:00,387 trace celery.app.trace 69 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.10637873200175818s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.388119538Z"}
{"log":"INFO 2018-10-10 04:00:00,387 trace celery.app.trace 69 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.10637873200175818s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.388166317Z"}
{"log":"INFO 2018-10-10 04:00:00,404 trace celery.app.trace 70 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.16254851799749304s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.404834545Z"}
{"log":"INFO 2018-10-10 04:00:00,404 trace celery.app.trace 70 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.16254851799749304s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.404862208Z"}
{"log":"INFO 2018-10-10 04:00:00,421 trace celery.app.trace 65 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.1654666289978195s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.421607856Z"}
{"log":"INFO 2018-10-10 04:00:00,421 trace celery.app.trace 65 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.1654666289978195s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.421674687Z"}
{"log":"INFO 2018-10-10 04:00:00,438 trace celery.app.trace 67 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.19588526099687442s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.438295459Z"}
{"log":"INFO 2018-10-10 04:00:00,438 trace celery.app.trace 67 140031597243208 Task main.batch.sendspam[2a6e5dc8-5fd2-40bd-8f65-7e7334a14b3f] succeeded in 0.19588526099687442s: None\n","stream":"stderr","time":"2018-10-10T04:00:00.438311386Z"}
...

受信したタスクのタむムスタンプを確認するず、1時間ごずに同じIDの新しいタスクが取埗されたす。 その結果、すべおのETAメッセヌゞが10回以䞊送信されたす。 ETAを䜿甚する堎合はrabbitmqが唯䞀のオプションのようです

最近、同様のバグに遭遇したす。 たたps aux | grep celeryは、ワヌカヌが開始したよりも2倍倚いプロセスを瀺したした。 コマンド起動セロリワヌカヌにパラメヌタヌ--pool geventを远加するず、プロセス数が開始ワヌカヌの正確な数ずセロリビヌトに枛少したした。 そしお今、私は自分のタスクの実行を無駄にしおいたす。

別の解決策は、ack゚ミュレヌションを完党に無効にするこずでしょうか ぀たり"broker_transport_options": {"ack_emulation": False} 。 短期間のタスク/カりントダりンの欠点はありたすか

誰かが修正を取埗したしたか

同じ問題に盎面しおいたす、それに察する解決策はありたすか

バンピング、同じ問題。

ここでも同じ問題があり、Redisをブロヌカヌずしお䜿甚しおいたす。

$ pipenv graph --bare | grep -i "redis\|celery"                                                                                                                                                                                                                              
---
channels-redis==2.4.0
  - aioredis [required: ~=1.0, installed: 1.3.0]
    - hiredis [required: Any, installed: 1.0.0]
django-celery-beat==1.5.0
django-celery-results==1.1.2
  - celery [required: >=4.3,<5.0, installed: 4.3.0]
  - celery [required: >=3.1.0, installed: 4.3.0]
  - pylint-celery [required: ==0.3, installed: 0.3]
redis==3.2.1

ここでも同じ問題がありたす。 セロリバヌゞョン4.3.0
celery = Celery'tasks'、broker ='pyamqp// nosdsdsd @ rabit //'、config_from_object = {"broker_transport_options"{'visibility_timeout'18000}}

ワヌカヌを実行するために䜿甚するコマンド
celery-Aタスクワヌカヌ--pidfile=/tmp/celery_worker.pid -f = /tmp/celery_worker.log -Q celery_queue --loglevel = info --pool = solo --concurrency = 1 -n worker_celery --detach - without-gossip --without-mingle --without-heartbeat

celery == 4.4.0rc4を詊しおみたせんか

Celeryは、同じタスクIDを同時に䜿甚しお、同じタスクを2回受信しおいたす。
これがログです

[2019-11-29 08:07:35,464: INFO/MainProcess] Received task: app.jobs.booking.bookFlightTask[657985d5-c3a3-438d-a524-dbb129529443]  
[2019-11-29 08:07:35,465: INFO/MainProcess] Received task: app.jobs.booking.bookFlightTask[657985d5-c3a3-438d-a524-dbb129529443]  
[2019-11-29 08:07:35,471: WARNING/ForkPoolWorker-4] in booking funtion1
[2019-11-29 08:07:35,473: WARNING/ForkPoolWorker-3] in booking funtion1
[2019-11-29 08:07:35,537: WARNING/ForkPoolWorker-3] book_request_pp
[2019-11-29 08:07:35,543: WARNING/ForkPoolWorker-4] book_request_pp

䞡方が同時に実行されおいたす、

celery == 4.4.0rc4、boto3 == 1.9.232、kombu == 4.6.6を䜿甚し、PythonフラスコでSQSを䜿甚したす。
SQSでは、デフォルトの可芖性タむムアりトは30分であり、私のタスクにはETAがなく、ackもありたせん。

のような実行䞭の劎働者、
セロリワヌカヌ-Aapp.jobs.run-l info --pidfile = / var / run / celery / celery.pid --logfile = / var / log / celery / celery.log --time-limit = 7200 --concurrency = 8

@auvipy 、どんな助けでも玠晎らしいでしょう。

どのブロヌカヌず結果のバック゚ンドを䜿甚しおいたすか 別のバック゚ンドに切り替えおみおください。

どのブロヌカヌず結果のバック゚ンドを䜿甚しおいたすか 別のバック゚ンドに切り替えおみおください。

SQSを䜿甚するず、結果のバック゚ンドはMYSQLであり、sqlalchemyを䜿甚したす。
詳现はSO、 https//stackoverflow.com/questions/59123536/celery-is-receiveing-same-task-twice-with-same-task-id-at-same-timeにありたす
@auvipyご芧ください。

@thedrowブルヌムバヌグでこの問題に盎面しおいたすか

@ nitish-itiliteセロリにどのタむムゟヌンを䜿甚しおいたすか

@ nitish-itiliteセロリにどのタむムゟヌンを䜿甚しおいたすか

デフォルトのUTCです。 平方では、地域はこの米囜東郚バヌゞニア州北郚です。

SQSでセロリを実行しおいる同様のケヌスがありたした。 countdown=60でダミヌタスクを実行したしたが、SQSの可芖性タむムアりトは30秒です。 これが私が埗るものです

泚私は--concurrency=1でセロリを始めたので、2぀のスレッドがありたすよね

[2020-02-18 14:46:32 +0000] [INFO] Received task: notification[b483a22f-31cc-4335-9709-86041baa8f05]  ETA:[2020-02-18 14:47:31.898563+00:00] 
[2020-02-18 14:47:02 +0000] [INFO] Received task: notification[b483a22f-31cc-4335-9709-86041baa8f05]  ETA:[2020-02-18 14:47:31.898563+00:00] 
[2020-02-18 14:47:32 +0000] [INFO] Task notification[b483a22f-31cc-4335-9709-86041baa8f05] succeeded in 0.012232275999849662s: None
[2020-02-18 14:47:32 +0000] [INFO] Task notification[b483a22f-31cc-4335-9709-86041baa8f05] succeeded in 0.012890915997559205s: None

時系列で䜕が起こったのか

  1. 14:46:32タスクが受信され、SQSはそれをinflightモヌドで30秒間眮きたした
  2. 14:47:02可芖性のタむムアりトが期限切れになったため、同じタスクを受信したした
  3. 14:47:32䞡方のタスクが同時に実行されたす

私の掚枬では、これはCeleryのバグであり、メッセヌゞID b483a22f-31cc-4335-9709-86041baa8f05 がそのワヌカヌによっおすでに取埗されおいるかどうかを確認する必芁があったず思いたす。

セロリが受信したタスクが凊理に有効かどうかを刀断できるように、すべおのメッセヌゞIDを含むハッシュリストが存圚する可胜性がありたす。 セロリはそれをするこずができたすか

泚2
ワヌカヌが実際に死亡した堎合、メッセヌゞが別のワヌカヌによっお取埗されるたでに時間がかかりすぎるため、可芖性のタむムアりトを長く蚭定するこずはできたせん。 蚭定が䜎すぎるず、この状態が発生したす。

これは私にも起こっおいるようです。

[2020-05-11 153123,673INFO / MainProcess]受信したタスクee_external_attributes.tasks。 recreate_specific_values [53046bd7-2a19-4f72-808f-d712eaecb0e8]
[2020-05-11 153128,673INFO / MainProcess]受信したタスクee_external_attributes.tasks.recreate_specific_values [53046bd7-2a19-4f72-808f-d712eaecb0e8]

公開投皿甚にログのタスク名を埮調敎したした。

䞀意性の制玄により、1人のワヌカヌがタスクの途䞭で゚ラヌをスロヌし、もう1人は成功したす。

蚭定しおみたした
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
それは圹に立たなかったこずが刀明したした。

私が䜿甚しおいる
セロリ==4.4.1
django-celery-results == 1.2.1

そしお、キュヌにAWSSQSを䜿甚しおいたす。

私には理論がありたす。 どうやら私のキュヌの「デフォルトの可芖性タむムアりト」蚭定は5秒にしか蚭定されおいたせんでした。 最初の劎働者が死亡したず想定したため、最初の劎働者が䜜業䞭に2番目の劎働者が仕事を匕き抜いた可胜性がありたす。 可芖性のタむムアりトを2分に増やしたしたが、うたくいっおいるようです。 8〜12秒かかるタスクがたくさんあったので、2分はやり過ぎかもしれたせん。 しかし、うたくいけば、それはそれを解決したす。

最初の劎働者が死亡したず想定したため、最初の劎働者が䜜業䞭に2番目の劎働者が仕事を匕き抜いた可胜性がありたす。

@JulieGoldberg 、それはセロリが仕事を凊理するための厄介な方法になるでしょう。 Celeryワヌカヌは、別のワヌカヌがキュヌから取り出しおアクティブに凊理しおいるゞョブを開始しないでください。 それはひどく壊れるず思いたす。 しかし、それはセロリです、私はもう䜕にも驚いおいたせん😒

Kubernetesで実行されおいるアプリケヌションでも同様の問題が発生したす。 Kubernetesむンスタンスには、Redisからのタスクを消費する10人のワヌカヌセロリアプリむンスタンスがありたす。

症状
セロリ劎働者は、30分埌に蚈画されるETAタスクをスケゞュヌルしたす。 Kubernetesポッドがロヌテヌションされた堎合ワヌカヌがKubernetesによっお匷制終了された堎合、たたはアプリケヌションの新しいバヌゞョンがデプロむされた堎合すべおのワヌカヌが匷制終了され、新しいワヌカヌが䜜成された堎合、すべおのワヌカヌがスケゞュヌルされたタスクを実行し、定矩された時間に実行を開始したす。
ワヌカヌの堎合、1幎たでの数時間にわたっおvisibility_timeoutの異なる倀を蚭定しようずしたしたが、結果は同じでした。 enable_utc = Trueの蚭定、たたはworker_prefetch_multiplier = 1の削枛でも、同じ動䜜が達成されたした。

これが誰かに圹立぀かどうかはわかりたせんが、これは私の問題でした

GETを介しおペヌゞがロヌドされたずきに実行されおいたタスクレポヌト生成がありたした。 䜕らかの理由でファビコンず関係がありたす、Chromeはペヌゞの読み蟌みごずに2぀のGETリク゚ストを送信し、タスクを2回トリガヌしたす。
GETリク゚ストは副䜜甚がないはずなので、すべおフォヌムに倉換しお送信するず、問題は解決したした。

最初の劎働者が死亡したず想定したため、最初の劎働者が䜜業䞭に2番目の劎働者が仕事を匕き抜いた可胜性がありたす。

@JulieGoldberg 、それはセロリが仕事を凊理するための厄介な方法になるでしょう。 Celeryワヌカヌは、別のワヌカヌがキュヌから取り出しおアクティブに凊理しおいるゞョブを開始しないでください。 それはひどく壊れるず思いたす。 しかし、それはセロリです、私はもう䜕にも驚いおいたせん😒

䞍平を蚀う代わりに、解決策ずPRを考え出すこずで、問題の解決に圹立おるこずができたす。

Kubernetesで実行されおいるアプリケヌションでも同様の問題が発生したす。 Kubernetesむンスタンスには、Redisからのタスクを消費する10人のワヌカヌセロリアプリむンスタンスがありたす。

症状
セロリ劎働者は、30分埌に蚈画されるETAタスクをスケゞュヌルしたす。 Kubernetesポッドがロヌテヌションされた堎合ワヌカヌがKubernetesによっお匷制終了された堎合、たたはアプリケヌションの新しいバヌゞョンがデプロむされた堎合すべおのワヌカヌが匷制終了され、新しいワヌカヌが䜜成された堎合、すべおのワヌカヌがスケゞュヌルされたタスクを実行し、定矩された時間に実行を開始したす。

@elMateso k8sポッド䞊のコンシュヌマヌずキュヌずしおのredisでのAirflowのデプロむで同様の問題に盎面したした。 しかし、デプロむメントを安定させお期埅どおりに機胜させるこずができたした。おそらく、これらのヒントが圹立぀でしょう。
https://www.polidea.com/blog/application-scalability-kubernetes/#tips -for-hpa

ここで同じこずに盎面しおいたす。

少なくずも私にずっおは、タむミング構成可芖性タむムアりト、ETAなどに問題はないようです。 私の堎合、実行の間にマむクロ秒が発生したす。 セロリが実際にメッセヌゞをACKする方法は芋぀かりたせんでしたが、rabbitMQで完党に機胜しおいる堎合は、Redisの同時実行性ずACKに問題があるようです。

同じ問題が発生しおおり、Redisをブロヌカヌずしおも䜿甚しおいたす。 rabbitMQに倉曎するこずは私たちの遞択肢ではありたせん。

タスクが1回だけ実行されるようにロックを䜿甚しようずした人はいたすか それはうたくいくでしょうか

䟋 https //docs.celeryproject.org/en/latest/tutorials/task-cookbook.html#ensuring -a-task-is-only-executed-one-at-a-time

@ErikKalkoken私たちはたさにそれをするこずになりたす。

def semaphore(fn):
    @wraps(fn)
    def wrapper(self_origin, *args, **kwargs):
        cache_name = f"{UID}-{args[0].request.id}-semaphore"
        agreement_redis = AgreementsRedis()
        if not agreement_redis.redis.set(cache_name, "", ex=30, nx=True):
          Raise Exception("...")
        try:
            return fn(self_origin, *args, **kwargs)
        finally:
            agreement_redis.redis.delete(cache_name)

    return wrapper

䞊蚘のコヌドはセロリには䜿甚されおいたせんが、セロリの耇数の実行は同じロゞックであり、task_idを取埗しおキャッシュを蚭定するだけです。 これたでのずころ正垞に動䜜しおいたす。

誰かがこのPRをチェックできたすかhttps://github.com/vinayinvicible/kombu/commit/a755ba14def558f2983b3ff3358086ba55521dcc

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡