개발자
현재 서비스에서 1분 주기로 도는 배치가 약 5개 정도 있고, 각각의 배치마다 약 500 ~ 8000건 정도의 데이터를 update 하고 있습니다. 사용하고 있는 DB는 AWS 의 RDS는 아니고, 온프레미스 환경의 PostgreSQL 을 사용중입니다. 문제는 커넥션이 과하게 할당되어 DB가 가끔 죽는 불상사가 일어난다는 점인데, 다른 분들은 lambda 에서 DB Connection 관리를 어떻게 하고 계신지가 궁금합니다. 현재 Connection 은 DB Connection Pool 내에서 맺어지고 있습니다. 만약 RDS 를 사용했다면 RDS Proxy 같은 서비스를 이용해서 커넥션 관리를 했을텐데, DB를 옮길 수는 없는 상황입니다. 차선책으로 생각나는 방법은 EC2 인스턴스를 띄워 람다는 해당 인스턴스에서 Connection 을 할당받아 쿼리를 수행하고, 반납하는 형태의 방법인데... 혹시 다른 좋은 방안이 있을지 궁금합니다!
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 10월 24일
AWS Lambda에서 DB 커넥션을 관리하는 다양한 방법이 있습니다만, 각각의 장단점이 존재합니다. 1. **Connection Pooling**: 원래 Connection Pooling이 서버 환경에서 가장 효과적인 방식인데요, Lambda의 무상태(stateless) 성질 때문에 어려움이 있습니다. 그러나 영구적 Lambda 환경에서는 가능하므로, 사용 가능한 람다 환경이라면 이를 고려해볼 만 합니다. 2. **DB Connection Reuse**: AWS Lambda 함수 호출 사이에 일부 컨텍스트를 재사용하여 연결을 유지할 수 있습니다. 이 접근 방식은 정말 많은 양의 요청보다는 한정된 요청에 더 적합합니다. 3. **외부 커넥션 관리 솔루션 사용**: pgbouncer 같은 외부 커넥션 풀러를 도입해서 모든 데이터베이스 연결을 여기로 전달하는 것입니다. 이런 솔루션들은 별도의 관리가 필요하지만 지금 처럼 DB 커넥션이 과도하게 생겨서 문제를 일으킬 경우 이런 외부 풀러들을 활용하는 것도 좋습니다. 4. **Dedicated Database Proxy**: EC2 인스턴스를 대신하여 AWS에서 제공하는 RDS Proxy나 DMS 등을 사용할 수도 있습니다만, 이는 온프레미스 환경에 제한적일 수 있습니다. 여기서 가장 중요한 것은 데이터베이스 연결이 과다하게 생기지 않도록 관리하는 것입니다. 그 방법 중 일부는 SQL 쿼리를 최적화하거나, 불필요한 DB 호출을 피하는 것이 될 수 있습니다. 추가로, Lambda 함수의 동시 실행 수를 제한하여 필요 이상으로 많은 연결이 생성되지 않도록 할수 있는데, 이는 비용과 성능 사이의 Trade-Off가 발생할 수 있어 주의해야 합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!