celery -A proj report
์ ์ถ๋ ฅ์ ํฌํจํ์ต๋๋ค.master
๋ถ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์์ ํ์ธํ์ต๋๋ค.๋ด ์ฑ์ django1.11 ๋ฐ celery4.1[sqs]์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ๋์์ต๋๋ค. Elastic Beanstalk๋ฅผ ํตํด Amazon AWS์ ๋ฐฐํฌ๋ฉ๋๋ค. AWS SQS๋ ๋ธ๋ก์ปค์ ๋๋ค.
๋ฌธ์ ๋ ๋งค์ผ ๋ฐค 10์ 42๋ถ๊ฒฝ์ ๋ํ๋๋ฉฐ ์ฝ 1์๊ฐ ๋์ ์ง์๋ฉ๋๋ค. ์๋ง ๊ฐ์ backend_cleanup ์์ ์ด ์คํ๋๊ธฐ ์์ํฉ๋๋ค. ๊ด๋ฆฌ์์ ์์ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ๋ฐ๋ผ ๊ฐ ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋ฉ๋๋ค. CPU ์ฌ์ฉ๋์ด 100%๋ก ์ ์ง๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ฑ์ ๋ชจ๋ ํ์ด์ง๋ฅผ ์ด๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ง 1์๊ฐ์ด ์ง๋๋ฉด CPU ์ฌ์ฉ๋์ด ์ ์์ผ๋ก ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๊ธฐ์ด์ด ์ค์ด๋ค๊ณ ์์ต๋๋ค. ๋ชจ๋ delay() ์์ ์ ์คํํ ์ ์์ต๋๋ค. SQS์์ ๋๊ธฐ์ด์ ์ ๊ฑฐํ๊ณ ์ฑ์ ๋ค์ ์์ํ ๋ค์ ์ ์ฒด ์ฝ๋๋ฅผ AWS Elastic Beanstalk์ ๋ค์ ์ ๋ก๋ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด delay() ์์ ์ด ์ ์์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ ๊ฑฐ, ๋ค์ ์์ ๋๋ ๋ค์ ์ ๋ก๋๋ฅผ ์ํํ์ง ์์ผ๋ฉด ๋น๋๊ธฐ ์์ ์ด ์คํ๋์ง ์์ต๋๋ค. ๊ธฐ๋ณธ ์ ๊ณต backendcleaup ์์ ๋ ์์ํ ์ ์์ต๋๋ค. ๋ด ์ฑ์๋ ๊ธฐ๋ณธ ์ ๊ณต celery.backend_cleanup ์์ ์ ์ ์ธํ๊ณ ๋ ์ฃผ๊ธฐ์ ๋๋ crontab ์์ ์ด ์์ต๋๋ค. ์๋ฌด๋์ด ๋ฌธ์ ๋ฅผ ๋์ ์ค ์ ์์ต๋๊น?
backend_cleanup ์์ ์ด ์๋ฃ๋ ํ ์ ์ฒด ์ฑ์ด ์ ์์ ์ผ๋ก ์ํ๋์ด์ผ ํฉ๋๋ค.
## ์ฌํ ๋จ๊ณ์ ์ค๋ช ๋์ด ์์ต๋๋ค.
๋ฐฉ๊ธ ๋ฌธ์ ๊ฐ ๊ธฐ๋ณธ ์ ๊ณต ์์ ์ธ celery.backend_cleanup์ ๊ดํ ๊ฒ์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ฐฉ๊ธ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฑ์ ์คํํ์ต๋๋ค. ์คํ 10์ 42๋ถ์ ์์ฒญ๋ backend_cleanup ์์ ์ด ์์๋์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ช ์ด ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
[2017-10-23 22:51:27,677: CRITICAL/MainProcess] Unrecoverable error: Exception('Request Empty body HTTP 599 Server aborted the SSL handshake (None)',)
Traceback (most recent call last):
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/worker.py", line 203, in start
self.blueprint.start(self)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
step.start(parent)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 370, in start
return self.obj.start()
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 320, in start
blueprint.start(self)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
step.start(parent)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 596, in start
c.loop(*c.loop_args())
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/loops.py", line 88, in asynloop
next(loop)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/hub.py", line 354, in create_loop
cb(*cbargs)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 111, in on_readable
return self._on_event(fd, _pycurl.CSELECT_IN)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 124, in _on_event
self._process_pending_requests()
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 132, in _process_pending_requests
self._process(curl, errno, reason)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 178, in _process
buffer=buffer, effective_url=effective_url, error=error,
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 150, in __call__
svpending(*ca, **ck)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
return self.throw()
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
retval = fun(*final_args, **final_kwargs)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 100, in _transback
return callback(ret)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
return self.throw()
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
retval = fun(*final_args, **final_kwargs)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 98, in _transback
callback.throw()
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 96, in _transback
ret = filter_(*args + (ret,), **kwargs)
File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/aws/connection.py", line 253, in _on_status_ready
raise self._for_status(response, response.read())
Exception: Request Empty body HTTP 599 Server aborted the SSL handshake (None)
๊ทธ ์ฌ์ด AWS SQS์์ ๋๊ธฐ์ด์ด ์ฌ๋ผ์ก์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ช ๊ฐ์ง backend_cleanup ์์ ์ด ๊ณ์ ์คํ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์นจ๋ด ๊ฒฝ๊ณ ๊ฐ ๋ํ๋ฌ์ต๋๋ค.
[2017-10-23 22:51:28,967: WARNING/MainProcess] ๋ฏธํ์ธ ๋ฉ์์ง 10๊ฐ ๋ณต์ ์ค
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก SQS ๋๊ธฐ์ด์ ๋ํ HTTPS ์ฐ๊ฒฐ์ด ์ค์ง๋์์ต๋๋ค. AWS Elastic Beanstalk์ ์ฑ์ ๋ค์ ๋ฐฐํฌํ์ง ์๋ ํ ์ฑ์ SQS์ ๋ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
์๋ฌด๋์ด ๋ฌธ์ ๋ฅผ ๋์ ์ค ์ ์์ต๋๊น? ๋ชจ๋ ์๋ต์ ํฌ๊ฒ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. CELERY_RESULT_BACKEND์ "django-db"์์ "redis"๋ก ๋ณ๊ฒฝํ๊ณ CELERY_TIMEZONE์ "UTC"๋ก ๋ณ๊ฒฝํ ํ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. Django Admin์ ์์ ๊ฒฐ๊ณผ์์ ์์ ๊ฒฐ๊ณผ ์ถ๊ฐ๊ฐ ์ค๋จ๋์์ง๋ง ๋ด ๋ฌธ์ ๋ ๋๋ถ๋ถ ํด๊ฒฐ๋์์ต๋๋ค.
์ผ์ ์ ๋ฎ์ด์ฐ๊ณ crontab ์ฌ์ฉ์ ํผํ ์ ์์ต๋๋ค.
'celery.backend_cleanup': {
'task': 'celery.backend_cleanup',
'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat
'options': {'expires': 12 * 3600}}
,
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ผ์ ์ ๋ฎ์ด์ฐ๊ณ crontab ์ฌ์ฉ์ ํผํ ์ ์์ต๋๋ค.
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,