Celery를 활용한 로깅 시스템 , 회고

최근 .csv, .tsv 등의 형태로 전송되는 로깅 파일을 저장하기 위한 시스템을 구축했다. 프로젝트를 진행하면서 사용한 기술에 대한 회고를 정리했다. (프레임워크에 종속되는 특성보다는 처리 로직에 초점을 맞추었다.) Before deploying Celery 테스트 서버에서 로깅 파일 처리 부하로 인해 서비스들이 멈추기 전까지는 메시지 큐를 활용하여 처리할 필요성을 느끼지 못했다. 그야 동시 요청 수도 없다시피하고 이상적인 환경이니까 그렇다. 이런 환경에서는 웹 애플리케이션 서버가 요청 검증, 파일 파싱, 데이터 전처리, DB I/O 모두 처리할 수 있다. 이 경우에는 파일로 만들어 저장하지 않고 Request 객체로 받은 binary를 파싱했다. 그러나 동시 요청수가 굉장히 많고 언제 Peak request를 찍을 지 알 수 없는 환경에서 안정적인 아키텍쳐는 아니다. 부하 발생 - 모니터링 툴 Locust를 사용하여 측정했을 때, 500명 동시 접속 환경까지 증가시키며 1초에 1번 계속해서 리퀘스트를 보냈을 때 WAS Worker가 2개인 환경에서 금방 리소스가 바닥나서 실패 응답을 받기 시작했다. 지연 응답이 아닌 실패 응답이 나타나기 시작하면 아키텍쳐든 코드든 효율성을 고려하여 수정해야한다. After deploying Celery 실시간에 가깝게 로그 파일을 처리하지 않고, 조금의 지연이 생기더라도 로그 파일을 제대로 처리한다는 보장이 있으면 파일 저장/파일 처리 로직을 담당하는 프로세스로 나누어서 각 프로세스의 작업의 무게를 줄일 수 있다. 이렇게 구성한다면 요청 인증/파일 저장/파일 처리 로직을 전부 맡아서 하던 WAS는 요청 인증/파일 저장까지만 하고 그 뒤의 일은 Background worker에게 맡긴다. 이렇게 한다면 메모리 누수와 같은 결함으로 시스템 전체의 자원이 동나지 않는 이상 WAS의 파일 처리량을 늘릴 수 있다. 그렇다면 Backgorund worker는 어떻게 자신이 처리해야 할 일을 알 수 있을까? 이 use-case에서는 자...