묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
product level에서 celeryd를 사용하시나요?
명령어가 아닌, docker 컨테이너에서 데몬으로 만들어 사용해 보려고 celeryd를 https://celery-safwan.readthedocs.io/en/latest/userguide/daemonizing.html위 레퍼런스를 따라 설정을 해보았는데 이틀동안 작업을 해보았지만, 결코 celery가 작업을 가져가지 않더라고요.혹시 사용해 보신적이 있다면 제가 사용한 설정 내용에서 오류가 있는지 확인을 부탁드려도 될까요?# Names of nodes to start # most people will only start one node: CELERYD_NODES="worker1" # but you can also start multiple and configure settings # for each in CELERYD_OPTS #CELERYD_NODES="worker1 worker2 worker3" # alternatively, you can specify the number of nodes to start: #CELERYD_NODES=10 # Absolute or relative path to the 'celery' command: CELERY_BIN="/usr/local/bin/celery" #CELERY_BIN="/virtualenvs/def/bin/celery" # App instance to use # comment out this line if you don't use an app CELERY_APP="config" # or fully qualified: #CELERY_APP="proj.tasks:app" # Name of the projects settings module. export DJANGO_SETTINGS_MODULE="config.settings.dev" # Where to chdir at start. CELERYD_CHDIR="/www/test-project" CELERYBEAT_CHDIR="/www/test-project" # Extra command-line arguments to the worker CELERYD_OPTS="--time-limit=300 --concurrency=2" # Configure node-specific settings by appending node name to arguments: #CELERYD_OPTS="--time-limit=300 -c 8 -c:worker2 4 -c:worker3 2 -Ofair:worker1" # Set logging level to DEBUG #CELERYD_LOG_LEVEL="DEBUG" # Name of the celery config module. # CELERY_CONFIG_MODULE="config.celery" CELERYD_LOG_LEVEL="INFO" # %n will be replaced with the nodename. CELERYD_LOG_FILE="/log/gunicorn/celery/celery-%n%I.log" CELERYD_PID_FILE="/log/gunicorn/celery/celery-run-%n.pid" CELERYBEAT_LOG_FILE="/log/gunicorn/celerybeat/celerybeat.log" CELERYBEAT_PID_FILE="/log/gunicorn/celerybeat/celerybeat-run.pid" # Workers should run as an unprivileged user. CELERYD_USER="root" CELERYD_GROUP="root" # If enabled pid and log directories will be created if missing, # and owned by the userid/group configured. CELERY_CREATE_DIRS=1
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
celery의 로그 설정을 django의 settings.py에서 따로 해줘야 하는게 있을까요?
django의 logger를 사용해 log를 출력하는 경우CELERYD_HIJACK_ROOT_LOGGER = False를 해줘야 하는지요?celery의 동작과 관련한 모든 기본 출력을 django log에 함께 출력하는 방법이 있는지도 알고 싶습니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
django에서 view나 api에서 request를 celery로 넘길 수 있을까요?
django에서 view나 api로 받은 request 정보를 celery에 넘겨 client에게 응답 처리를 하게 만들 수 있을까요?시리얼라이저 문제로 celery에서 request를 arg로 받을 수 없는 것으로 알고 있습니다.그래도 tcp를 이용한 전송이기 때문에 가능은 할것 같은데어떻게 접근해야 될지 가늠이 되지 않아혹시 비슷한 고민을 해보신 적이 있으실까 싶어 이렇게 질문을 드려봅니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
child process에 lock/좀비 프로세스가 발생하면 어떻게 처리되나요?
작업의 처리 결과가 언제 종료될지 모르기 때문에 timeout 등의 설정은 하지 않은 전제에서child process에 작업을 수행하다가 lock이 발생하거나 이러한 문제로 좀비 프로세스가 되는 경우celery가 처리하는 루틴이 있는지 알고 싶습니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
DLQ와 관련한 이전 질문의 추가 질문 입니다.
이전에 아래와 같이 답변을 주신 글이 있습니다.1. Consumer가 거절하는 경우는 대부분 Celery자체가 어떻게 처리해야 할지 몰라서 일어나는 경우고, 보통 그런경우 새로운 Queue를 만드셔서 넣어 놓으신다음에 엔지니어가 나중에 수동으로 처리하는 경우가 대부분이고, 많은 에러가 난다면 그 전체를 다시 Queue에 넣어 Consumer를 고친 다음에 처리합니다.2. ACK Timeout이 나는 경우 Broker에서 확답을 못 받았기 때문에 그 메세지는 그대로 있고, Consumer가 재시작하는 순간에 다시 Queue에서 불러와 처리할 수 있습니다.이에 추가적인 질문을 드리려 합니다.1번에 대한 질문에서 거절이라는 의미로 "celery에서 작업을 가져왔지만 어떻게 처리할지 모른다"는게 이해가 잘 가지 않네요.이미 구현된 코드에서 처리할지 모른다는 경우가 어떤게 있을까요? 잘못된 arguments는 에러가 발생할 테고, 작업에서 만약 DB나 I/O가 필요한데 해당 정보가 없다면... 이 또한 예외나 에러가 발생할 텐데.. 이러한 모든 상황은 3번에 포함되는 것이라 1번의 경우가 어떤게 있을지 예시를 혹시 들어주시면 감사드리겠습니다.2번에 대해 ack는 수신자가 전달하는 것인데 consumer는 queue에서 작업을 가져가서 처리하지만 queue에서는 ack를 timeout 내 수신하지 못한 상황이고, 이 때문에 queue에서 작업을 삭제하지 않았다면 consumer는 동일한 작업을 다시 가져가 중복처리를 하게 되는거 아닌가요? 이에 대한 처리는 실무에서는 어떻게 하는지 알고 싶습니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
task 에러를 signal로 잡는 부분에 대해 질문 드립니다.
task_failure에 대한 질문입니다.@task_failure.connect(sender=add) def task_failure_handler( sender, task_id, exception, args, kwargs, traceback, einfo, **kwargs_extra ): print(f"Task {task_id} has failed: {sender.name} with exception {exception}") task_failure_clean_up.delay(task_id=task_id) # type: ignor위 코드에서 print 에 대한 출력이 나오지 않더라고요강사님의 코드에서도 그렇고 제 코드에서도 출력이 안되던데 혹시 이유를 아시는가 싶습니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
DLQ에 저장하는 패턴에 대해 질문 드립니다.
DLX에서 consumer가 DLQ에 에러를 저장하는 과정에 대해 이해가 잘 안되는 부분이 있습니다.에러가 발생하면 DLQ에 넣는다.다음 처리를 하는데 들어온 이벤트의 타입을 DLQ의 에러가 발생한 이전 이벤트 타입과 동일한지를 비교하여 같다면 있다면 DLQ에 넣는다2번 처리에서 consumer는 모든 작업을 수행하기 전 이벤트 타입을 DLQ에 있는 모든 이벤트 타입과 비교하는 작업을 한다는 전제인가요? 그렇다면 일반적으로 DLQ에 누적되는 각기 다른 이벤트 타입의 수가 많지 않을 것이기 때문에 (동일한 이벤트 타입들은 사실 1개로 처리) 이벤트 실행 중 발생하는 에러 결과를 DLQ에 넣는 것 보다, 작업 전 이미 발생한 에러 이벤트 타입과 비교하여 동일한 이벤트 들은 처리를 하기 전, DLQ에 넣는게 전체적으로 효율성이 높기 때문이라 볼 수 있는 것일까요?
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
DLX에 대한 질문입니다.
message들은 아래와 같은 경우가 원인이 될 수 있다고 말씀 하셨습니다.1. consumer가 거절하는 경우2. 시간이 너무 오래 걸려 acknowledgment timeout이 발생한 경우3. 처리를 하는 동안 에러가 발생한 경우첨부된 pdf나 코드상에서 최종 언급되는 방법으로 3번에 대한 항목만 있는 것 같은데요두 가지 질문이 있습니다.1번 질문으로 1,2번 항목은 사실 consumer가 처리할 수 없는거 아닌가 생각되는데 redis를 사용하는 지금 프로젝트에서 따로 처리를 하는 방법이 방법이 어떻게 있을지 알고 싶습니다. 2번 질문으로 제가 알고 있기로 rabbitMQ에서 ack와 관련한 기능이 있는 것으로 알고 있습니다. 혹시 해당 작업을 해보신적이 있으시다면 어떻게 처리, 구현 하셨는지 알고 싶습니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
기존 docker-compose는 admin의 깨져서 나옵니다.
gunicorn을 사용하면 nginx의 사용으로 static 제공이 되지 않으면 css, js가 다운로드 되지 않는 것으로 알고 있습니다.저장소의 celery 폴더에도 runserver를 사용하셨던데이 설명이 강의 초반부터 지금까지 못본것 같습니다.실습에 admin 페이지가 다 깨져 나오기 때문에모르는 다른 학습자 분들이 있다면 큰 어려움이 있을것 같습니다.직접 테스트 해보니 gunicorn 실행에는 admin이 다 깨져서 나오고 runserver로 실행하면 admin이 제대로 나오는 것을 확인하였습니다.docker-compose의 app 항목 추가 : command: > sh -c " python manage.py makemigrations && python manage.py migrate && gunicorn -b 0.0.0.0:8000 app.wsgi "
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
실습에 문제가 많아 수업노트보기의 저장소 코드를 확인해봤습니다.
코드를 직접 타이핑하여 테스트 하는데 문제가 많아 화면 하단에 있는 수업 노트 보기에 있는 저장소를 clone해 보았습니다.celery 폴더에 있는 docker-compose를 그대로 실행해보았습니다. 전제는 검증된 코드기 때문에 일단, 문제가 없을 것이고 해당 코드를 기반으로 제 문제를 추적하기 위해서 입니다.docker-compose를 실행하니 대부분의 컨테이너에서 문제가 발생하는 것을 확인하였습니다.여러 유료 강좌를 돈과 관계 없이 저에게 필요하다면 구매를 해서 보는 사용자로, 각 실습별로 코드가 제공되지 않는 것이 참 어렵다 생각했습니다.헌데 참고할 저장소의 코드도 신뢰할 수 없다는 것에 실망이 생깁니다.저장소의 코드에 대해 확인을 부탁 드리고자 합니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
celery-standalone에 대한 질문입니다.
main.py와 celery.py의 코드가 수업 내용에 따라 어떻게 되는지 전체가 제공이 되지 않아 특히 main.py는 예상만 하며 따라하고 있습니다.그 중에 group에 대한 질문입니다.celery와 celery-standalone을 실행하면서각각 celery, celery:1, celery:2 그리고 celery:3, celery:4, celery:5를 각각 큐로 할당하였습니다.이때 task_router의 설정과 관련해서celery-standalone에서 add에 대한 task 작업 큐를 celery로 정의해도 동작하나요?아니면 자신의 celery에 할당된 큐에대해서 task 큐를 할당할 수 있는 것인가요?
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
Celery Monitoring Tool, Flower에 대해 알아보기에 질문 있습니다.
"Celery Monitoring Tool, Flower에 대해 알아보기"에 main.py가 없어서 임의로 celery.py와 유사하게 작성하였습니다.celery와 celery-standalone이 동작하고 flow도 동작하게 만들었는데, 화면과 같이 broker가 보이지 않습니다.celery 하나만 보입니다.하지만, log를 확인하면 큐는 각각 3개씩 생성되는게 확인되었습니다.뿐만 아니라, workers에 나타나는 celery의 이름으로 되어 있는 링크를 누르면 unknown worker 'celery@...'로 출력됩니다.docker-compose의 코드는 화면과 동일하게 했습니다.docker-compose의 로그에는 flower와 관련하여 다음과 같은 로그가 확인됩니다.flower-1 | [I 240629 12:24:37 command:168] Visit me at http://0.0.0.0:5555flower-1 | [I 240629 12:24:37 command:176] Broker: redis://redis:6379/0flower-1 | [I 240629 12:24:37 command:177] Registered tasks: flower-1 | ['celery.accumulate',flower-1 | 'celery.backend_cleanup',flower-1 | 'celery.chain',flower-1 | 'celery.chord',flower-1 | 'celery.chord_unlock',flower-1 | 'celery.chunks',flower-1 | 'celery.group',flower-1 | 'celery.map',flower-1 | 'celery.starmap']flower-1 | [I 240629 12:24:37 mixins:228] Connected to redis://redis:6379/0flower-1 | [W 240629 12:24:38 inspector:44] Inspect method registered failedflower-1 | [W 240629 12:24:38 inspector:44] Inspect method stats failedflower-1 | [W 240629 12:24:38 inspector:44] Inspect method conf failedflower-1 | [W 240629 12:24:38 inspector:44] Inspect method scheduled failedflower-1 | [W 240629 12:24:38 inspector:44] Inspect method reserved failedflower-1 | [W 240629 12:24:38 inspector:44] Inspect method active_queues failedflower-1 | [W 240629 12:24:38 inspector:44] Inspect method revoked failedflower-1 | [W 240629 12:24:38 inspector:44] Inspect method active failed관련해서 어떻게 해결할 수 있는지 알고 싶습니다.제가 드린 정보가 부족하다면, celery.py main.py 를 남겨 주시면 감사 드리겠습니다.추가적으로app.conf.broker_transport_options 설정은 celery.py와 main.py 둘다 하는게 맞는건가요? 아니면 메인이라 생각되는 celery.py에만 설정하는게 맞는건가요?
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
group에서 keyword arg를 전송할 때에 대해 알고 싶습니다.
group에서 숏컷이 .s를 붙이면 되는 걸로 알고 있습니다.이때, args와 kwargs가 같이 전송되어야 하는 경우 어떻게 해야 하는지 알고 싶습니다.
-
해결됨실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
SNS 처럼 사용하기
강의 잘봤습니다! 혹시 SNS 와 같이 하나의 동일한 메세지(task) 를 여러 Worker 가 동작하게 만들 수 도 있을까요?
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
셀러리 사용에 문의드립니다.
현재상황은 다음과 같습니다. 윈도우 gui 오토메이션을 해야하는 task 가 있습니다.큐(sqs)는 우선큐 일반큐 두개를 스위칭 해야하는 상황입니다.우선큐에 메세지가 없을경우만 일반큐를 컨슘해야합니다.메세지를 처리하는 인스턴스는 윈도우 gui 를 사용하기 때문에 한대의 장비에서 동시에 하나의 task 만 실행될 수 있습니다. 위의 제약조건들로 인하여 gui 기반의 셀레니움 자동화 스크립트를 구성하고 우선큐와 일반큐를 스위칭하면서 10개 이상의 윈도우 장비가 큐를 폴링하고 있습니다. 이를 윈도우 장비 하나에 하나의 스탠드얼론 워커를 띄우는 형태로 구성하고. 예를 들어 열개의 인스턴스에 각각하나씩 열개의 스탠드얼론 셀러리 워커를 띄우려고 합니다. 하나의 스탠드 얼론 워커가 두개의 큐를 priority 따라서 폴링하는게 가능할까요? 스펙상에서는 되는거 같긴한데 문서를 봐도 잘 모르겠어서 혹시나 문의드립니다. 안된다면 각각의 큐를 폴링하는 스탠드 얼론 워커를 인스턴스에 브로커의 개수만큼 띄우고 (하나의 인스턴스 두개의 스탠드얼론워커) 뒤에 별도의 자동화 로직을 구성하고 큐의 우선순윈는 서비스로직으로 풀어야 하나 고민중입니다.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
Task Routing 부분 보니까요
강의에서는 1개의 Queue에 1개의 celery서버가 할당되어 있는 구조인데요. 1개의 Queue에 여러대의 celery 서버가 할당되어 있는 구조도 문제없는 구조 일까요? 예를 들어 celery 3대의 서버가 모두 대기상태일때 동일한 queue를 바라보면 메세지가 하나 날라왔을 때 동시에 3대의 celery 서버가 같은 큐를 처리할 것 같아서요. 그리고 같은 task에 대해서 queue 여러개로 로드밸런스하고 싶다면 어떻게 하는게 좋을까요?
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
celery 에서 task 작업 끝난 후 ack 받기
안녕하세요. celery 수업 잘 듣고 있습니다.제가 수업 내용을 활용 하여 test 코드를 작성 중입니다.구조는 publisher(kombu), broker(redis), consumer(celery) 구성하고 있습니다.질문은 celery 에 task가 작업이 끝난 후 결과를 broker 알리면 publisher 가 ack 를 받아 처리하는 구조가 가능 할까요?
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
rate_limit
안녕하세요 강사님께서 celery.py 에서 default 로 5/m 을 주었는데요.어떤 방법으로 해당 기본값을 사용할 수 있는지 궁금합니다. 제가 시도한 테스트 방법은 아래와 같습니다.rate_limit='' 에 빈값으로 주기 => 아무 응답 없음.rate_limit 인자를 없애기 =>5분이 아닌 12초 간격으로만 요청을 보내는 결과를 확인.
-
미해결실리콘밸리 엔지니어와 함께하는 샐러리(Celery)
docker-compose
docker-compose.yml 을 실행하면 아래와 같은 오류를 직면하여 질문 드립니다.. base 프로젝트 설정 부분이 대략적으로만 말씀주셔서 우선 github 보면서 따라하긴 해봤는데 제 경로 설정에 문제가 있는 것 같네요..
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요 선생님!! 장고 엑셀다운로드 로딩에 대하여 질문드립니다
안녕하세요!! 선생님!!! ㅎㅎㅎ 장고 다운로드 로딩에 대하여 질문드리려 합니다!! (웹은 장고로만 개발하였습니다!!) 제가 구현한 내용은 단순히 모델을 불러와서 가공후 csv 파일로 response하는 view를 만들었습니다! 그래서 다운로드 버튼을 클릭하면 모델에 있는 데이터가 다운이 되는 그러한 로직입니다! 위와 같이 그냥 요청이 오면 모델을 불러와서 응답해주는?? 단순한 view입니다!ㅎ 다만 join이 많이 걸려있고 데이터가 좀 많다보니 시간이 상당히 많이 소요가 되는데요.. 문제가 다운로드버튼(위에 설명한 view와 연결한버튼)을 클릭 한 후 서버가 이를 처리를 하는데 서버자체가 이 작업을 끝날때 까지 먹통이되는? (제 3자가 웹에 접속했을때도 이 처리 때문에 위 처리가 끝날때 까지 아무런 요청을 할 수 없습니다) 문제가 발생합니다.. 제가 사용한 서버는 AWS EC2를 활용해 도커 compose파일로 nginx, gunicorn, mariadb를 연결해서 하나의 서비스로 만들어 배포하였습니다. 또한 로드밸런서 세팅도 되있습니다. 로컬에서 개발서버로 테스트 할때는 그냥 다운로드 버튼을 클릭을 해도 바로 종료가 가능하고 다른 브라우저로 접근해도 독립적으로 작동했는데 배포를 하니깐 위와 같은 현상이 발생하네요! 서버 성능의 문제인가 해서 인스턴스 유형도 좀더 올려보고 했지만 역시 위문제는 해결되지 않았습니다..ㅠ 그래서 뭔가 비동기적으로 처리하기위해서 celery를 이용해 볼까 했는데 잘못된 접근인건지 잘모르겠지만 피라미터를 어떻게 설정해야할지 몰라서 구현에 실패를 했습니다 ㅠ 서버의 문제라면 어떻게 접근을 해야하는지,,,,, 아니면 장고로 위와 같은 문제가 해결이 가능하다면 어떻게 코드를 작성하면 좋을지 부족한게 많다보니 며칠째 해결이 안되네요 ㅠㅠ 부족한 설명이지만 잘 부탁드리겠습니다!! 너무 감사합니다 선생님!!