Celery: [K8S] ์…€๋Ÿฌ๋ฆฌ ๋น„ํŠธ ๋ฐ ์›Œ์ปค๋ฅผ์œ„ํ•œ livenessProbe ๋ฐ readinessProbe

์— ๋งŒ๋“  2017๋…„ 06์›” 08์ผ  ยท  31์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: celery/celery

์•ˆ๋…•ํ•˜์„ธ์š”,

๋‚ด๊ฐ€๋Š” Kubernetes๋Š” livenessProbe์„ ์ œ๊ณตํ•˜๊ณ  readinessProbe ๋‚ด ํŒŒ์ด์ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐฐํฌ ํ•  ์ˆ˜๋Š” Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์—ฌ๊ธฐ ์ฐธ์กฐ .

์…€๋Ÿฌ๋ฆฌ ๋น„ํŠธ ๋˜๋Š” ์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž๊ฐ€ ์‚ด์•„ ์žˆ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
PID๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋„์›€์— ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์นœ์• ํ•˜๋Š”,

Deployment Question Needs Verification โœ˜

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

celery inspect ping ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด bash ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

        livenessProbe:
          exec:
            # bash is needed to replace the environment variable
            command: [
              "bash",
              "-c",
              "celery inspect ping -A apps -d celery@$HOSTNAME"
            ]
          initialDelaySeconds: 30  # startup takes some time
          periodSeconds: 60  # default is quite often and celery uses a lot cpu/ram then.
          timeoutSeconds: 10  # default is too low

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

Celery์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง API ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Celery ์ž‘์—…์ž๊ฐ€ ํ•˜ํŠธ ๋น„ํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ํฌ๋“œ๋Š” ๋ผ์ด๋ธŒ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ž‘์—…์ž๊ฐ€ ์ž‘์—…์ž ์˜จ๋ผ์ธ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ธ ๊ฒฝ์šฐ ํฌ๋“œ๊ฐ€ ์ค€๋น„๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ๋ฌธ์ œ ๋‚˜ ๊ธฐ๋Šฅ ์š”์ฒญ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ์—ฌ์‹ญ์‹œ์˜ค.

์ž‘๋™ํ• ๊นŒ์š”?

readinessProbe:
          exec:
            command:
            - "/bin/sh"
            - "-c"
            - "celery -A path.to.app status | grep -o ': OK'"
          initialDelaySeconds: 30
          periodSeconds: 10

@ 7wonders ๋จผ์ € ์…€๋Ÿฌ๋ฆฌ ๋…ธ๋“œ ์ด๋ฆ„์„ ์ถ”์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด readinessProbe๋Š” ์›ํ•˜๋Š” ์…€๋Ÿฌ๋ฆฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

@thedrow ํ , ์‹ค์ œ๋กœ ์‹ค์ œ ๋…ธ๋“œ๊ฐ€ ์‹คํŒจํ•ด๋„ ์„ฑ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋…ธ๋“œ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค

/bin/sh -c 'exec celery -A path.to.app inspect ping -d celery@$HOSTNAME' ๋Š” ์ค€๋น„ ์ƒํƒœ ํ™•์ธ์— ์ถฉ๋ถ„ํ•˜๋ฉฐ ํ•˜๋‚˜์˜ ๋…ธ๋“œ ๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ์•ฑ์—์„œ๋Š” ์ „์ฒด CPU๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ kubernetes ๊ธฐ๋ณธ๊ฐ’์€ 10 ์ดˆ๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ periodSeconds๋ฅผ ๋†’๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค (์šฐ๋ฆฌ๋Š” 300์œผ๋กœ ์„ค์ • ๋จ).

@redbaron ์ด ๋ช…๋ น์ด ์ž‘๋™ ํ–ˆ์Šต๋‹ˆ๊นŒ? ์ž‘๋™ํ•œ๋‹ค๋ฉด ํ™œ์„ฑ ๋ฐ ์ค€๋น„ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์„ค์ •์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ด๋–ค ์ด์œ ๋กœ์ด ์ค€๋น„ ์ƒํƒœ ํ”„๋กœ๋ธŒ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๊ฑฐ์˜ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๋ถ€ํ•˜์—†์ด ๋น„ ๊ฒฐ์ •์ ์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

celery inspect ping -b " redis : // archii-redis-master : 6379"-d celery @ archii-task-crawl-integration-7d96d86b9d-jwtq7

๊ทธ๋ฆฌ๊ณ  ์ •์ƒ์ ์ธ ํ•‘ ์‹œ๊ฐ„ (10 ์ดˆ)์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์…€๋Ÿฌ๋ฆฌ๊ฐ€ ์š”๊ตฌํ•˜๋Š” CPU์— ์˜ํ•ด ์™„์ „ํžˆ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

~ ๋‚˜๋Š” ์ด๊ฒƒ์„ 30 ์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ƒ๋™๊ฐ์žˆ๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค : sh -c celery -A path.to.app status | grep "${HOSTNAME}:.*OK" ~
๋‚˜๋Š” ์ด๊ฒƒ์„ 30 ์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ƒ๋™๊ฐ์žˆ๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค : sh -c celery -A path.to.app inspect ping --destination celery@${HOSTNAME}
์ถ”๊ฐ€ ๋ถ€ํ•˜๋ฅผ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๊ณ  100 ๋ช…์ด ๋„˜๋Š” ์ž‘์—…์ž๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ค€๋น„ ์ƒํƒœ ํ”„๋กœ๋ธŒ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ Celery๋Š” ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กค๋ง ๋ฐฐํฌ์—์„œ ์ž‘์—…์ž ์‹œ์ž‘์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ minReadySeconds: 10 ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ํ”„๋กœ์ ํŠธ์˜ Celery ์‹œ์ž‘ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฏ€๋กœ ๋กœ๊ทธ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ค€๋น„ ์ƒํƒœ ํ”„๋กœ๋ธŒ๋Š” ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„ ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ž‘์—…์ž ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐฐํฌ๊ฐ€ ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ kubectl rollout status deployment ํ•ฉ๋‹ˆ๋‹ค. readinessprobes์—†์ด ์šฐ๋ฆฌ๋Š” ์…€๋Ÿฌ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๊ณ  ๊ทธ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์†”๋ฃจ์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

readinessProbe:
  exec:
    command:
      [
        "/usr/local/bin/python",
        "-c",
        "\"import os;from celery.task.control import inspect;from <APP> import celery_app;exit(0 if os.environ['HOSTNAME'] in ','.join(inspect(app=celery_app).stats().keys()) else 1)\""
      ]

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿคทโ€โ™‚๏ธ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @yardensachs!
๋‹ค๋ฅธ ์†”๋ฃจ์…˜์˜ ๋ฌธ์ œ์ ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜์‹ญ์‹œ์˜ค.
celery inspect ping ๋ช…๋ น์ด exit (0) ๋˜๋Š” ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

celery inspect ping ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด bash ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

        livenessProbe:
          exec:
            # bash is needed to replace the environment variable
            command: [
              "bash",
              "-c",
              "celery inspect ping -A apps -d celery@$HOSTNAME"
            ]
          initialDelaySeconds: 30  # startup takes some time
          periodSeconds: 60  # default is quite often and celery uses a lot cpu/ram then.
          timeoutSeconds: 10  # default is too low

~ ์•Œ์•„ ๋‘˜๋งŒ ํ•œ

์ž‘์—…์ด ์ž˜ ์ฒ˜๋ฆฌ๋˜๊ณ  ๋ฐฑ ๋กœ๊ทธ๊ฐ€ ์—†๋Š”๋ฐ๋„ ๋ถ€ํ•˜๊ฐ€ ๋” ๋†’์œผ๋ฉด ํ•œ ๋ฒˆ์— ๋ช‡ ๋ถ„ ๋™์•ˆ ํ•‘์ด ์ค‘๋‹จ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™œ์„ฑ ์ƒํƒœ ํ”„๋กœ๋ธŒ์—์„œ ์…€๋Ÿฌ๋ฆฌ ๊ฒ€์‚ฌ ํ•‘์„ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. eventlet์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ณ„์† ์กฐ์‚ฌ ์ค‘์ž…๋‹ˆ๋‹ค.

@WillPlatnick Celery๋Š” ๋น„๋™๊ธฐ์‹์ด๋ฏ€๋กœ ์ œ์–ด ์ฝ” ๋ฃจํ‹ด์„์œ„ํ•œ ์˜ˆ์•ฝ ๋œ ์šฉ๋Ÿ‰์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 5.0์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

inspect ping ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” / ์ข€๋น„ ํ”„๋กœ์„ธ์Šค์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

root      2296  0.0  0.0      0     0 ?        Z    16:04   0:00 [python] <defunct>
root      2323  0.0  0.0      0     0 ?        Z    16:05   0:00 [python] <defunct>
...

์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์„ ๊ฐ•์ œํ•˜๊ธฐ์œ„ํ•œ --pool ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

celery inspect ping @WillPlatnick ๋Œ€์‹  ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ์—์„œ ํ”„๋กœ๋ธŒ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@mcyprian ์šฐ๋ฆฌ๋Š” ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ง๊ฐ์€ eventlet๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์„ ์šฐ์„  ์ˆœ์œ„๋กœ ๋‘์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Redis ๋ธŒ๋กœ์ปค์™€ ๋™์ผํ•œ CPU ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?
์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ด๋ฆ„์„ ํ์—์„œ "debug_task"๋กœ ์˜ˆ์•ฝํ•˜๋Š” ์‹คํ—˜์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ˜„์žฌ RabbitMQ์— ๋งŽ์€ ์˜ค๋ž˜๋œ ๋Œ€๊ธฐ์—ด์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค

sh -c celery -A path.to.app status | grep "${HOSTNAME}:.*OK"

https://github.com/celery/celery/issues/4079#issuecomment -437415370์— ์ œ์•ˆ ๋œ๋Œ€๋กœ rabbitmq์— ๋Œ€ํ•œ ๋Œ€๊ทœ๋ชจ ์˜ค๋ฅ˜ ๋ณด๊ณ ์„œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. https://github.com/celery/celery/issues/4355#issuecomment ์ฐธ์กฐ - 578786369

๊ฒ€์‚ฌ ํ•‘์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

celery -b amqp : // user : pass @ rabbitmq : 5672 / vhost ping ๊ฒ€์‚ฌ

-A path.to.celery๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์…€๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ์„๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฉด ํ™•์‹คํžˆ CPU ์‚ฌ์šฉ์— ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒ€์‚ฌ ํ•‘์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

celery -b amqp : // user : pass @ rabbitmq : 5672 / vhost ping ๊ฒ€์‚ฌ

-A path.to.celery๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์…€๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ์„๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฉด ํ™•์‹คํžˆ CPU ์‚ฌ์šฉ์— ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€! ๋กœ๋“œ ๋œ ์•ฑ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์…€๋Ÿฌ๋ฆฌ ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ด์ฌ ํ”„๋กœ์„ธ์Šค์˜ ์—„์ฒญ๋‚œ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋†’์€ ๊ธฐ๊ฐ„์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
celery inspect ping -A app.tasks -d celery @ $ HOSTNAME์€ "Error : Broadcast not supported by transport 'sqs'"๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
SQS๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ 'inspect'/ 'status'๋ช…๋ น์ด SQS์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋ชจ๋“  ์›๊ฒฉ ์ œ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด kombu.pidbox ํ‚ค์— ๋Œ€ํ•œ ๋ช…๋ น ์„ค์ •์œผ๋กœ ์ธํ•ด Redis ์ธ์Šคํ„ด์Šค๊ฐ€ CPU์—์„œ ๊ธ‰์ฆํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์œผ๋ฏ€๋กœ ping์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ๊ฒ€์‚ฌ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ์›๊ฒฉ ์ œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋กœ๋•์…˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•ด ์›๊ฒฉ ์ œ์–ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์ „์šฉ ์ƒํƒœ ํ™•์ธ ๋Œ€๊ธฐ์—ด์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ „ํ˜€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ๊ฑด๊ฐ• ๊ฒ€์‚ฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์›๊ฒฉ ์ œ์–ด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” RabbitMQ ์ œ๊ฑฐ ์ •์ฑ… (๋Œ€๊ธฐ์—ด์ด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋จ)๊ณผ ํ•จ๊ป˜ ์ „์šฉ ์ƒํƒœ ํ™•์ธ ๋Œ€๊ธฐ์—ด์„ ์–ผ๋งˆ ๋™์•ˆ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์†”๋ฃจ์…˜์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์ด ๊ฒ€์‚ฌ๋Š” ์‹ค์ œ๋กœ ์ž‘์—…์ž๊ฐ€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์™„๋ฃŒํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋„์ž… ํ•œ ์ดํ›„๋กœ ์šฐ๋ฆฌ๋Š” ๊ฐ‡ํžŒ ๋…ธ๋™์ž๋“ค์—๊ฒŒ ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@bartoszhernas ๋งˆ์Œ์— ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๊นŒ? ๋น„ํŠธ๋ฅผ ํ†ตํ•ด ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ž‘์—…์ž๊ฐ€ ํ”ฝ์—…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค?

์ฝ”๋“œ + ํ™œ์„ฑ ํ”„๋กœ๋ธŒ ์„น์…˜์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ๋Š” ์ •๋ง ์‰ฝ์Šต๋‹ˆ๋‹ค.

Kubernetes์—์„œ POD_NAME์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€๊ธฐ์—ด ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ ์ด๋ฅผ livecheck ์Šคํฌ๋ฆฝํŠธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

        livenessProbe:
          initialDelaySeconds: 120
          periodSeconds: 70
          failureThreshold: 1
          exec:
            command:
            - bash 
            - "-c" 
            - |
              python celery_liveness_probe.py $LIVENESS_QUEUE_NAME
        env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name

        - name: LIVENESS_QUEUE_NAME
          value: queue-$(MY_POD_NAME)

(Kubernetes๊ฐ€ ENV๋ฅผ ์ง์ ‘ ๋ช…๋ น์œผ๋กœ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ENV๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— bash -c๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค)

๊ทธ๋Ÿฐ ๋‹ค์Œ celery_liveness_probe.py๋Š” Django๋ฅผ ์„ค์ •ํ•˜์—ฌ Celery๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  POD ๋Œ€๊ธฐ์—ด์—์„œ ์ž‘์—…์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

# encoding: utf-8
from __future__ import absolute_import, unicode_literals

import os
import sys

if __name__ == "__main__":
    import django

    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ahoy.archive.settings")
    django.setup()
    from ahoy.archive.apps.eventbus.service import eventbus_service

    exit(0 if eventbus_service.health_check(sys.argv[1] if sys.argv and len(sys.argv) > 1 else None) else 1)

์ƒํƒœ ํ™•์ธ ๊ธฐ๋Šฅ์€ ์ž‘์—…์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

    def health_check(self, queue_name: Optional[str] = None) -> bool:
        event = self.celery.send_task(
            AhoyEventBusTaskName.LIVENESS_PROBE,
            None,
            queue=queue_name or self.origin_queue,
            ignore_result=False,
            acks_late=True,
            retry=False,
            priority=255
        )

        try:
            is_success = event.get(timeout=10)
        except (celery.exceptions.TimeoutError, AttributeError):
            is_success = False

        return is_success

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์—…์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์ž‘์—…์ž๋Š” ์ •์ƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ž๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒฝ์šฐ (์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐœ์ƒ) ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๊ณ  ํฌ๋“œ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์œ ์ผํ•œ์ฃผ์˜ ์‚ฌํ•ญ์€ ๊ธฐ์กด ๋Œ€๊ธฐ์—ด์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. RabbitMQ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์— ๋งŒ๋ฃŒ ์ •์ฑ…์„ ์„ค์ •ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.
https://www.rabbitmq.com/ttl.html#queue -ttl

@bartoszhernas ์ฝ”๋“œ๋ฅผ ๊ณต์œ 

๋‚ด ๋Œ€๊ธฐ์—ด์ด ๋™์ ์ด๋ฉฐ Redis๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ง์”€ํ•˜์‹  ๊ฒƒ์ฒ˜๋Ÿผ Redis์—์„œ ๋Œ€๊ธฐ์—ด ์ด๋ฆ„ ๋งŒ๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, Redis์˜ BullMQ์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์€ ๋งค๋ฒˆ ๋Œ€๊ธฐ์—ด์„ ์ง€์šฐ๋Š” Kubernetes ์šฉ CronJob์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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