AsyncResult 문제점
AsyncResult
AsyncResult 를 통해 원격 태스크 상태를 체크하려고 하면 편하긴 한데, API 안에서 거의 동시에 AsyncResult 객체를 만들려고 시도하면 병목현상으로 호스트 프로세스가 멈춰버리는 일이 생기는데, 이런 일이 발생하면 원인을 찾기가 상당히 힘들다. AsyncResult 의 문제라기보다는 동일한 Celery App 객체를 동시에 접근하고 상태를 바꾸려다보니 병렬성의 저주에 걸리기 때문. 해결방법은, 시스템리소스가 많으면 정의된 celery 인스턴스를 딥 카피해서 AsyncResult 를 호출하면 되기는 하는데, 찜찜하기 짝이 없다.
원래 태스크 폴링할 때는 그냥 Redis 에 직접 업데이트해서 상태 업데이트를 하는 편이 가장 깔끔한데, 그냥 귀차니즘때문에 Celery 자체 폴링메커니즘을 쓴 것인데, 오히려 이것 때문에 상당히 고생한 것. 정도를 걷는 것이 가장 빠른 길이나니.
또 AsyncResult 를 호출하게되면 메시지 브로커의 연결풀을 잡아먹게되는데, forget() 메소드로 할당된 자원을 해제 해주지 않으면, 주기적으로 서버가 무응답상태가 되어버린다. 물론 일정이상 무응답시에 자동 할복시켜버리기는 하는데, 오히려 그것 때문에 문제를 더 일찍 파악하지 못하게 될 수 있다.
그래도 Celery 만큼 좋은 것도 별로 없다. 특히 머신러닝 모델 서비스할 때는 딱히 대안이 있는 것도 아니고.