YUDA't

# AttributeError async & KeyError async

kombu와 celery의 버전이 충돌하는 것이니, celery 버전을 4.2.1로 업데이트한다.

GitHub celery 이슈에 있더라.(KeyError async #870)

celery와 버전이 엮인 라이브러리는 billiard, kombu, amqp, vine이다.

Collecting celery==4.1.1
  Downloading https://files.pythonhosted.org/packages/99/fa/4049b26bfe71992ecf979acd39b87e55b493608613054089d975418015b7/celery-4.1.1-py2.py3-none-any.whl (394kB)
    100% |████████████████████████████████| 399kB 24.1MB/s
Requirement already satisfied: pytz>dev in /home/venv/platform_env/lib/python3.5/site-packages (from celery==4.1.1) (2016.10)
Requirement already satisfied: billiard<3.6.0,>=3.5.0.2 in /home/venv/platform_env/lib/python3.5/site-packages (from celery==4.1.1) (3.5.0.4)
Requirement already satisfied: kombu<5.0,>=4.2.0 in /home/venv/platform_env/lib/python3.5/site-packages (from celery==4.1.1) (4.2.1)
Requirement already satisfied: amqp<3.0,>=2.1.4 in /home/venv/platform_env/lib/python3.5/site-packages (from kombu<5.0,>=4.2.0->celery==4.1.1) (2.3.2)
Requirement already satisfied: vine>=1.1.3 in /home/venv/platform_env/lib/python3.5/site-packages (from amqp<3.0,>=2.1.4->kombu<5.0,>=4.2.0->celery==4.1.1) (1.1.4)
Installing collected packages: celery
  Found existing installation: celery 4.0.0
    Uninstalling celery-4.0.0:
      Successfully uninstalled celery-4.0.0
Successfully installed celery-4.1.1

근데 celery 4.2.1에는 함정이 있었으니...




# [Errno 104] Connection reset by peer after started

celery를 실행하는 도중 이렇게 클라이언트와의 연결이 끊겨버려 celery task 자체는 돌아가나 리턴 값을 넘겨줄 수 없던 에러다.

이 에러가 환장이었던 건, 에러가 나오다 말다 해서 대체 어떤 상황에서 발생하는지 알 수가 없었다는 거다.

다행히도 celery GitHub 이슈가 있어서 참고했다.

해결 방법은 간단하다. celery 4.2 버전을 사용하지 말 것.


GitHub Issue: Avoid celery version 4.2. #296

GitHub Issue: Celery 4.2.0 workers lost connection with AMQP constantly! #4608

GitHub Issue: celery raise error: [Errno 104] Connection reset by peer after started #4867


+ 18.11.26 해결됨!!!

내가 여전히 에러가 난다고 하니, celery 프로젝트의 멤버 중 하나가 master branch의 dependency를 따랐냐고 댓글을 달아줬다.

$ pip install "celery[librabbitmq]"
$ pip install "celery[librabbitmq,redis,auth,msgpack]"


+ 18.11.28 다시 안 됨

이젠 뭐가 문젠지 감도 안 잡힌다. 파이썬 라이브러리 충돌은 아닌 것 같고 rabbitmq 문제인 듯 한데 이리저리 손 써봐도 안 돼서 그냥 정상 작동하는 다른 서버 이미지를 복붙했다...

지금은 celery 4.0 사용중




# kombu.exceptions.EncodeError

kombu.exceptions.EncodeError <{model_name}: {model_name} object> is not JSON serializable


celery task의 argument로 model object를 보냈을 때 발생한 에러이다.


이유인즉슨, celery가 task를 실행할 때 브로커(RabbitMQ)에게 메시지를 보내는데 이때 이 메시지는 serialization을 거친다.

이는 곧 task의 arguments도 serialize 된다는 건데, 이게 JSON으로 파싱되지 못할 경우 문제가 생긴다.

model object의 경우에는 당연히 JSON serializable 하지 않아서 에러가 난 것.

또 task의 리턴 값에도 이 serialization이 적용되기 때문에 주의해야 한다.


스택오버플로우 참고:

kombu.exceptions.EncodeError: <Flask 'src'> is not JSON serializable

kombu.exceptions.EncodeError: User is not JSON serializable




# child process exiting after exceeding memory limit

[2018-11-21 14:29:11,377: WARNING/MainProcess] /home/venv/platform_env/lib/python3.5/site-packages/celery/fixups/django.py:200: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!

warnings.warn('Using settings.DEBUG leads to a memory leak, never '

[2018-11-21 14:28:38,418: INFO/MainProcess] Received task: {my_file_name}.{my_task_name}[748b9bbbbbbbbbbbbbbbbbb2bb]

[2018-11-21 14:28:41,779: INFO/ForkPoolWorker-11] Task {my_file_name}.{my_task_name}[748b9bbbbbbbbbbbbbbbbbb2bb] succeeded in 0.06810039700940251s: True

[2018-11-21 14:28:41,780: ERROR/ForkPoolWorker-11] child process exiting after exceeding memory limit (140256KiB / 50000KiB)


이건 에러 로그에서 보이듯이 메모리 부족이 원인이다.

해결 방법은 celery 메모리 제한을 높여주는 것.

/etc/default/celeryd 파일에서 CELERYD_OPTS을 수정해주면 된다.

CELERYD_OPTS="--max-memory-per-child=150000"

그리고 django를 사용하고 있다면 아래처럼 settings.py에서 설정해줄 수도 있는데, 난 이게 먹히지 않아서 위의 방법을 썼다.

CELERY_WORKER_MAX_MEMORY_PER_CHILD = 150000