Django와 PostgreSQL 을 사용하고 있는 사람들 중,
DB connection 때문에 골머리를 쌓는 사람이 많을 것이다.
기본적으로 서버에서 핸들링 하지 못하는 에러가 있다면 / 비동기 작업내에서 db에 접근한다면 connection leak이 발생할 수 있고,
그렇다면 db connection 이 쌓이게되서 db 인스턴스가 죽어버리는 경우가 생긴다.
이를 방지하기 위해 db 단에서 idle_session_timeout과 idle_in_transaction_session_timeout 두가지 파라미터를 제공한다.
idle_session_timeout은 말그대로 하나의 세션안에서 긴 작업 (혹은 시스템 에러) 으로 인해 connection이 지정된 시간이상으로 유지되는 경우 자동으로 connection을 끊어버리는 옵션이다.
idle_in_transaction_session_timeout은 하나의 transaction (atomic) 안에서 idle 한 상태가 지속되면 자동으로 connection을 끊어버리는 옵션이다.
만약 django에서 Database atomic_request 옵션이 설정되어 있다면, idle_in_trasaction_session_timeout을 조절해야 할것이고, 그렇지 않다면 idle_session_timeout을 조절해야 할것이다.
실제로 django에서 request를 수신했을때, db 접근이 없더라도 middleware에서 커넥션을 생성한다. 그렇기때문에 connection이 끊길 수 있다는 생각을 항상 하자.
결론적으로 내가 생각하는 것은
api서버는 crud job 만을 위해 작동해야 한다.
간단한 data 구조 변형이라면 괜찮지만, 길어질 수 있는 작업은 celery로 처리하도록 하자.
celery에서는 왠만하면 db 접근을 직접적으로 하지말고 api 서버에 webhook 방식으로 작동할 수 있게 하자.
No comments:
Post a Comment