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์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

ํ•œ ์‹œ๊ฐ„ ๋‚ด์— ์ž‘์—…์ž๊ฐ€ ์ž‘์—…์„ ์Šน์ธํ•˜์ง€ ์•Š์œผ๋ฉด(์ฆ‰, ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ?) ํ•ด๋‹น ์ž‘์—…์€ ์Šน์ธํ•˜์ง€ ์•Š์„ ๋‹ค๋ฅธ ์ž‘์—…์ž์—๊ฒŒ ์ „์†ก๋˜๋Š” ์‹์ž…๋‹ˆ๋‹ค... ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ๋‹ค์Œ์˜ ๊ฒฝ๊ณ  ์„น์…˜์„ ๋ณด๋Š” ๊ฒฝ์šฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ; ์ด ๊ด€๋ จ ๋ฌธ์ œ https://github.com/celery/kombu/issues/337; ๋˜๋Š” ์ด ๋ธ”๋กœ๊ทธ ์—์„œ ์ธ์šฉ:

๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ง‰ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ •๊ธฐ์ ์œผ๋กœ ์ž‘์—…์ž์˜ ๋น„์ •์ƒ์ ์ธ ๋™์ž‘, ํŠนํžˆ ์—ฌ๋Ÿฌ ์ž‘์—…์ž๊ฐ€ ๋™์ผํ•œ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์›์ธ์€ ๊ฐ€์‹œ์„ฑ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

visibility_timeout ๋ฅผ 31,540,000์ดˆ(1๋…„)๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅธ ์ˆ˜์ •์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  43 ๋Œ“๊ธ€

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๊ฐ€์‹œ์„ฑ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@georgepsarakis ์˜ํ˜น์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์ด๊ฒƒ์€ AMQP์˜ ๊ธฐ๋ณธ ์ œ๊ณต ์Šน์ธ ํŠน์„ฑ ์ด ์—†๋Š” ๋ธŒ๋กœ์ปค ์ „์†ก์— ๋Œ€ํ•ด ์•Œ๋ ค์ง„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ž‘์—… ์™„๋ฃŒ ์‹œ๊ฐ„์ด ๊ฐ€์‹œ์„ฑ ์ œํ•œ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜๋ฉด ์ž‘์—…์ด ์ƒˆ ์ž‘์—…์ž์—๊ฒŒ ํ• ๋‹น๋˜๋ฏ€๋กœ ์ž‘์—…์ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@georgepsarakis ์ž‘์—…์ด ํ›จ์”ฌ ๋” ๋จผ ๋ฏธ๋ž˜์— ์˜ˆ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ์œ„์˜ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”? "๊ฐ€์‹œ์„ฑ ์‹œ๊ฐ„ ์ดˆ๊ณผ"๊ฐ€ ์ด๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ? ๋งํฌ ํ•œ ๋ฌธ์„œ์—์„œ :

Redis์˜ ๊ธฐ๋ณธ ๊ฐ€์‹œ์„ฑ ์ œํ•œ ์‹œ๊ฐ„์€ 1์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

ํ•œ ์‹œ๊ฐ„ ๋‚ด์— ์ž‘์—…์ž๊ฐ€ ์ž‘์—…์„ ์Šน์ธํ•˜์ง€ ์•Š์œผ๋ฉด(์ฆ‰, ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ?) ํ•ด๋‹น ์ž‘์—…์€ ์Šน์ธํ•˜์ง€ ์•Š์„ ๋‹ค๋ฅธ ์ž‘์—…์ž์—๊ฒŒ ์ „์†ก๋˜๋Š” ์‹์ž…๋‹ˆ๋‹ค... ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ๋‹ค์Œ์˜ ๊ฒฝ๊ณ  ์„น์…˜์„ ๋ณด๋Š” ๊ฒฝ์šฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ; ์ด ๊ด€๋ จ ๋ฌธ์ œ https://github.com/celery/kombu/issues/337; ๋˜๋Š” ์ด ๋ธ”๋กœ๊ทธ ์—์„œ ์ธ์šฉ:

๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ง‰ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ •๊ธฐ์ ์œผ๋กœ ์ž‘์—…์ž์˜ ๋น„์ •์ƒ์ ์ธ ๋™์ž‘, ํŠนํžˆ ์—ฌ๋Ÿฌ ์ž‘์—…์ž๊ฐ€ ๋™์ผํ•œ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์›์ธ์€ ๊ฐ€์‹œ์„ฑ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

visibility_timeout ๋ฅผ 31,540,000์ดˆ(1๋…„)๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅธ ์ˆ˜์ •์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์‹œ์„ฑ ์ œํ•œ ์‹œ๊ฐ„์„ 2์‹œ๊ฐ„์œผ๋กœ ๋Š˜๋ฆฌ๋ฉด ์ž‘์—…์ด ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ์„ ๊ฒฐํ•ฉํ•˜๋ฉด:

  • ๋ ˆ๋””์Šค ๋ธŒ๋กœ์ปค
  • ๋Šฆ์€ ํ™•์ธ
  • ๊ฐ€์‹œ์„ฑ ์‹œ๊ฐ„ ์ดˆ๊ณผ์™€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ณผํ•˜๋Š” ETA
    ์ž‘์—…์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ƒ๊ฐํ•œ๋‹ค:

  • ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ•œ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ž‘์—…์ž๋Š” ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ ์ œํ•œ ์‹œ๊ฐ„๋ณด๋‹ค ์˜ค๋ž˜ ๋Œ€๊ธฐ์—ด์— ์žˆ์—ˆ๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์ž๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”์‹œ์ง€๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ๋ณต์›๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ž‘์—…์ž๊ฐ€ ๋™์ผํ•œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์˜ ์ž‘์—…์€ ๋ชจ๋“  ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Redis ์ „์†ก ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๋ฉด Sorted Sets๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ zadd ์— ์ ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ํ•ด๋‹น ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณต์›๋˜๋ฉฐ ๊ฐ€์‹œ์„ฑ ํƒ€์ž„์•„์›ƒ ๊ณผ ๋™์ผํ•œ ๊ฐ„๊ฒฉ๊ณผ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Redis ์ „์†ก์˜ ๋‚ด๋ถ€๋ฅผ ์•ฝ๊ฐ„ ์„ค๋ช…ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@georgepsarakis , ๋‚˜๋Š” ์ด์ œ ์™„์ „ํžˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์˜ ETA๊ฐ€ ์ง€๊ธˆ๋ถ€ํ„ฐ 2๊ฐœ์›”๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…์ด ์˜ˆ์•ฝ๋œ ํ›„ 1์‹œ๊ฐ„ ํ›„์— ์ด๋ฅผ ํ”ฝ์—…ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด (์ž˜๋ชป๋œ?) ๊ฐ€์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋‚˜๋Š” ๋ฏธ๋ž˜์˜ ์–ธ์ œ๋“ ์ง€ ETA๋กœ ์ž‘์—…์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์—
  • ์ž‘์—…(์ฆ‰, ์ •๋ ฌ๋œ ์ธ์ˆ˜)๊ณผ ETA๋Š” ETA๊ฐ€ ๋„์ฐฉํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ์—ด์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์—
  • ์ž‘์—…์ž๋Š” ETA์—์„œ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ "_๋‚˜๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค:_"๋Š” ๋‚ด ๊ฐ€์ •๊ณผ ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”? @jenstroeger

๊ฐ์‚ฌ ํ•ด์š”!

@jenstroeger ๋Š” ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์ด ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š”๋ฐ ETA ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰์„ ์—ฐ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…์ž๊ฐ€ ๊ณ„์† ๋ฉ”์‹œ์ง€๋ฅผ requeueํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์˜ ๊ฐœ๋…์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋Š” ์ฆ‰์‹œ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ž‘์—…์ž๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด ์ถ”์ธก์ด๋ฉฐ ETA ๊ตฌํ˜„์˜ ๋‚ด๋ถ€๋ฅผ ์‹ค์ œ๋กœ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@zivsu , ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด visibility_timeout ์„ _๋งค์šฐ_ ํฐ ์ˆซ์ž๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ ์ฆ์ƒ์ด ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @georgepsarakis๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ์ด๋Š” ์ข‹์ง€ ์•Š์€ ์ ‘๊ทผ ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์›๋ž˜ ๋ฌธ์ œ์˜ ์›์ธ๋„ ๋ชจ๋ฅด๊ณ , ์–ด๋–ป๊ฒŒ ์ œ๋Œ€๋กœ ๋Œ€์ฒ˜ํ•ด์•ผ ํ•˜๋Š”์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@jenstroeger ๋ธ”๋กœ๊ทธ๋ฅผ ์ฝ๊ณ  visibility_timeout ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ณด์ปค๋ฅผ rabbitmq ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

@zivsu , ๋ธ”๋กœ๊ทธ ๋งํฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์ „์— Redis๋ฅผ ์‚ฌ์šฉํ•˜์…จ์Šต๋‹ˆ๊นŒ?

@jenstroeger ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „์— Redis๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ์ • ์ž‘์—…์˜ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก rebbitmq๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์žฅ๊ณ ==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 ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ฃผ๊ธฐ์  ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์„ธ์ด๋ธŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. eta ์ž‘์—…์€ redis๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๊ณฑํ•˜๊ธฐ ์‹œ๊ฐ„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฑฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ข€..
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> ์„ ์‹คํ–‰ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์˜€์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ์กฐ์–ธ์€ ๊ธฐ๊ธฐ์—์„œ ์—ฐ๊ฒฐ์„ ๋Š๊ธฐ ์ „์— ํ•ญ์ƒ "๋‹ค์‹œ ์‹œ์ž‘ ์™„๋ฃŒ" ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{"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"}
...

Received task timestamps๋ฅผ ํ™•์ธํ•˜๋ฉด ๋งค์‹œ๊ฐ„ ๋™์ผํ•œ ID๋กœ ์ƒˆ ์ž‘์—…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ชจ๋“  ETA ๋ฉ”์‹œ์ง€๊ฐ€ 10๋ฒˆ ์ด์ƒ ์ „์†ก๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ETA๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋งŒ rabbitmq๊ฐ€ ์˜ต์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ๋น„์Šทํ•œ ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ps aux | grep celery ๋Š” ์ž‘์—…์ž๊ฐ€ ์‹œ์ž‘ํ•œ ๊ฒƒ๋ณด๋‹ค ๋‘ ๋ฐฐ ๋” ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž ์‹คํ–‰ ๋ช…๋ น์— ๋งค๊ฐœ๋ณ€์ˆ˜ --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
์…€๋Ÿฌ๋ฆฌ = ์…€๋Ÿฌ๋ฆฌ('์ž‘์—…', ๋ธŒ๋กœ์ปค='pyamqp://nosd:sdsd@rabbit//', 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 -- ํ—˜๋‹ด ์—†์ด -- ์„ž์ด์ง€ ์•Š๊ณ  -- ์‹ฌ์žฅ ๋ฐ•๋™ ์—†์ด

celery==4.4.0rc4๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Celery๋Š” ๋™์‹œ์— ๋™์ผํ•œ ์ž‘์—… ID๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ๋‘ ๋ฒˆ ์ˆ˜์‹  ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

[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

๋‘˜ ๋‹ค ๋™์‹œ์— ์‹คํ–‰ ์ค‘์ด๋ฉฐ,

ํŒŒ์ด์ฌ ํ”Œ๋ผ์Šคํฌ์—์„œ SQS์™€ ํ•จ๊ป˜ celery==4.4.0rc4 , boto3==1.9.232, kombu==4.6.6 ์‚ฌ์šฉ.
SQS์—์„œ ๊ธฐ๋ณธ ๊ฐ€์‹œ์„ฑ ์ œํ•œ ์‹œ๊ฐ„์€ 30๋ถ„์ด๋ฉฐ ๋‚ด ์ž‘์—…์—๋Š” ETA๊ฐ€ ์—†๊ณ  ack์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‹ฌ๋ฆฌ๋Š” ์ž‘์—…์ž,
์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž -A app.jobs.run -l ์ •๋ณด --pidfile=/var/run/celery/celery.pid --logfile=/var/log/celery/celery.log --time-limit=7200 --concurrency =8

@auvipy , ์–ด๋–ค ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๋ธŒ๋กœ์ปค์™€ ๊ฒฐ๊ณผ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ๋กœ ์ „ํ™˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์–ด๋–ค ๋ธŒ๋กœ์ปค์™€ ๊ฒฐ๊ณผ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ๋กœ ์ „ํ™˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

SQS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ ๋ฐฑ์—”๋“œ๋Š” sqlalchemy๊ฐ€ ์žˆ๋Š” MYSQL์ž…๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ SO, https://stackoverflow.com/questions/59123536/celery-is-receiving-same-task-twice-with-same-task-id-at-same-time
@auvipy ์ข€ ๋ด์ฃผ์„ธ์š”.

@thedrow ๋‹น์‹ ์€ ๋ธ”๋ฃธ๋ฒ„๊ทธ์—์„œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@nitish-itilite : ์…€๋Ÿฌ๋ฆฌ์˜ ์‹œ๊ฐ„๋Œ€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@nitish-itilite : ์…€๋Ÿฌ๋ฆฌ์˜ ์‹œ๊ฐ„๋Œ€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ธฐ๋ณธ UTC์ž…๋‹ˆ๋‹ค. sqs ์—์„œ ์ง€์—ญ์€ ์ด ๋ฏธ๊ตญ ๋™๋ถ€(๋ฒ„์ง€๋‹ˆ์•„ ๋ถ๋ถ€)์ž…๋‹ˆ๋‹ค.

SQS์™€ ํ•จ๊ป˜ ์…€๋Ÿฌ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋น„์Šทํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. countdown=60 ์œผ๋กœ ๋”๋ฏธ ์ž‘์—…์„ ์‹คํ–‰ํ–ˆ์ง€๋งŒ SQS์˜ ๊ฐ€์‹œ์„ฑ ์ œํ•œ ์‹œ๊ฐ„์€ 30์ดˆ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ €๋Š” --concurrency=1 ๋กœ ์…€๋Ÿฌ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ–ˆ์œผ๋ฏ€๋กœ ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?

[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๊ฐ€ 30์ดˆ ๋™์•ˆ inflight ๋ชจ๋“œ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  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]

(๊ณต๊ฐœ ๊ฒŒ์‹œ๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ์—์„œ ์ž‘์—… ์ด๋ฆ„์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.)

๊ณ ์œ ์„ฑ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ์ž‘์—…์ž ์ค‘ ํ•œ ๋ช…์ด ์ž‘์—… ๋„์ค‘์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์ž๋Š” ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋‹ค
์…€๋Ÿฌ๋ฆฌ==4.4.1
์žฅ๊ณ -์…€๋Ÿฌ๋ฆฌ-๊ฒฐ๊ณผ==1.2.1

๊ทธ๋ฆฌ๊ณ  ๋Œ€๊ธฐ์—ด์— AWS SQS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ๋Š” ์ด๋ก ์ด ์žˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋‚ด ๋Œ€๊ธฐ์—ด์˜ "๊ธฐ๋ณธ ํ‘œ์‹œ ์‹œ๊ฐ„ ์ดˆ๊ณผ" ์„ค์ •์€ 5์ดˆ๋กœ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ๋‘ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…์„ ๋นผ๋ƒˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์‚ฌ๋งํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์‹œ์„ฑ ์ œํ•œ ์‹œ๊ฐ„์„ 2๋ถ„์œผ๋กœ ์˜ฌ๋ ธ๋”๋‹ˆ ๋” ์ž˜ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 8-12์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์— 2๋ถ„์ด ๊ณผ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ๋‘ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…์„ ๋นผ๋ƒˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์‚ฌ๋งํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@JulieGoldberg , Celery๊ฐ€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ˜•ํŽธ์—†๋Š” ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Celery ์ž‘์—…์ž๋Š” ๋‹ค๋ฅธ ์ž‘์—…์ž๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์ ๊ทน์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ž‘์—…์„ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‹ฌ๊ฐํ•˜๊ฒŒ ๊นจ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๊ทผ๋ฐ ์ƒ๋Ÿฌ๋ฆฌ์•ผ ์ด์   ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋“ค์–ด๊ฐ€์„œ ๋†€๋žŒ๐Ÿ˜’)

Kubernetes์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes ์ธ์Šคํ„ด์Šค์—๋Š” Redis์˜ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” 10๋ช…์˜ ์ž‘์—…์ž(์…€๋Ÿฌ๋ฆฌ ์•ฑ ์ธ์Šคํ„ด์Šค)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ์ƒ:
์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž๋Š” 30๋ถ„ ํ›„์— ๊ณ„ํš๋  ETA ์ž‘์—…์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. Kubernetes ํฌ๋“œ๊ฐ€ ํšŒ์ „๋˜๊ฑฐ๋‚˜(Kubernetes์— ์˜ํ•ด ์ž‘์—…์ž๊ฐ€ ์ข…๋ฃŒ๋จ) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์‹  ๋ฒ„์ „์ด ๋ฐฐํฌ๋˜๋ฉด(๋ชจ๋“  ์ž‘์—…์ž๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ์ƒˆ ์ž‘์—…์ž๊ฐ€ ์ƒ์„ฑ๋จ) ๋ชจ๋“  ์ž‘์—…์ž๊ฐ€ ์˜ˆ์•ฝ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ •์˜๋œ ์‹œ๊ฐ„์— ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ž‘์—…์ž์˜ ๊ฒฝ์šฐ ๋ช‡ ์‹œ๊ฐ„์—์„œ ์ตœ๋Œ€ 1๋…„๊นŒ์ง€ visibility_timeout ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด ๋ณด์•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค. enable_utc = True ์„ค์ • ๋˜๋Š” worker_prefetch_multiplier = 1 ๊ฐ์†Œ๋กœ ๋™์ผํ•œ ๋™์ž‘์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ด๊ฒƒ์ด ๋‚ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€๊ฐ€ GET์„ ํ†ตํ•ด ๋กœ๋“œ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…(๋ณด๊ณ ์„œ ์ƒ์„ฑ)์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ(ํŒŒ๋น„์ฝ˜๊ณผ ๊ด€๋ จ์ด ์žˆ์Œ) Chrome์€ ๋ชจ๋“  ํŽ˜์ด์ง€ ๋กœ๋“œ์— ๋Œ€ํ•ด 2๊ฐœ์˜ GET ์š”์ฒญ์„ ๋ณด๋‚ด ์ž‘์—…์„ ๋‘ ๋ฒˆ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
GET ์š”์ฒญ์€ ๋ถ€์ž‘์šฉ์ด ์—†์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ท€ํ•˜๊ฐ€ ์ œ์ถœํ•œ ์–‘์‹์œผ๋กœ ๋ชจ๋‘ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ๋‘ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…์„ ๋นผ๋ƒˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ž๊ฐ€ ์‚ฌ๋งํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@JulieGoldberg , Celery๊ฐ€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ˜•ํŽธ์—†๋Š” ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Celery ์ž‘์—…์ž๋Š” ๋‹ค๋ฅธ ์ž‘์—…์ž๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์ ๊ทน์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ž‘์—…์„ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‹ฌ๊ฐํ•˜๊ฒŒ ๊นจ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๊ทผ๋ฐ ์ƒ๋Ÿฌ๋ฆฌ์•ผ ์ด์   ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋“ค์–ด๊ฐ€์„œ ๋†€๋žŒ๐Ÿ˜’)

๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•˜๋Š” ๋Œ€์‹  ์†”๋ฃจ์…˜๊ณผ PR์„ ์ œ์‹œํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes ์ธ์Šคํ„ด์Šค์—๋Š” Redis์˜ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” 10๋ช…์˜ ์ž‘์—…์ž(์…€๋Ÿฌ๋ฆฌ ์•ฑ ์ธ์Šคํ„ด์Šค)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ์ƒ:
์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž๋Š” 30๋ถ„ ํ›„์— ๊ณ„ํš๋  ETA ์ž‘์—…์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. Kubernetes ํฌ๋“œ๊ฐ€ ํšŒ์ „๋˜๊ฑฐ๋‚˜(Kubernetes์— ์˜ํ•ด ์ž‘์—…์ž๊ฐ€ ์ข…๋ฃŒ๋จ) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์‹  ๋ฒ„์ „์ด ๋ฐฐํฌ๋˜๋ฉด(๋ชจ๋“  ์ž‘์—…์ž๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ์ƒˆ ์ž‘์—…์ž๊ฐ€ ์ƒ์„ฑ๋จ) ๋ชจ๋“  ์ž‘์—…์ž๊ฐ€ ์˜ˆ์•ฝ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ •์˜๋œ ์‹œ๊ฐ„์— ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

@elMateso k8(ํฌ๋“œ์˜ ์†Œ๋น„์ž ๋ฐ ๋Œ€๊ธฐ์—ด๋กœ redis)์˜ Airflow ๋ฐฐํฌ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐํฌ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํŒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://www.polidea.com/blog/application-scalability-kubernetes/#tips -for-hpa

์—ฌ๊ธฐ์—์„œ ๊ฐ™์€ ์–ผ๊ตด์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ์–ด๋–ค ํƒ€์ด๋ฐ ๊ตฌ์„ฑ(๊ฐ€์‹œ์„ฑ ์‹œ๊ฐ„ ์ดˆ๊ณผ, ETA ๋“ฑ)์—๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰ ์‚ฌ์ด์— ๋งˆ์ดํฌ๋กœ์ดˆ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์…€๋Ÿฌ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๋ฉ”์‹œ์ง€ ACK๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์ง€๋งŒ RabbitMQ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ Redis์˜ ๋™์‹œ์„ฑ ๋ฐ ACK์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  Redis๋„ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. RabbitMQ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ž‘์—…์ด ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•ด ๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์„๊นŒ์š”?

์˜ˆ: 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๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์บ์‹œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€์ด ํ™๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? https://github.com/vinayinvicible/kombu/commit/a755ba14def558f2983b3ff3358086ba55521dcc

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰