인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

FastAPI 완벽 가이드

마지막 본 블로그 정보를 Session으로 관리하기

connection pool과 관련해 질문을 드립니다.

작성

·

40

·

수정됨

0

sqlalchemy 강의 내용에 보면 connection pool에 대한 이론과 실습 설명이 있었습니다.

헌데 비동기를 이용하여 하나의 connection pool만 사용하는 것으로 실습과 코드가 마무리 되더군요.

제가 생각할 때, connection pool을 제대로 사용하기 위해서는 사용 가능한 모든 pool 을 병렬로 처리해야 하지 않을까란 생각이 들었습니다.

하지만, 비동기 병렬 처리를 하게 되면 트랜잭션 락으로 인해 race condition 상태 등의 더 복잡한 문제가 발생할거 같은데, 사용하는게 맞는가란 생각도 들었습니다.

이에 아래와 같은 질문을 드리려 합니다.

1. 실무에서 사용시 connection pool로 할당한 수만큼 비동기 병렬로 처리를 하는게 맞는지요?

2. 만약 맞다면, 트랜잭션 락은 어떻게 구현하여 사용하는게 일반적인지요?

  1. 혹은, 예제와 달리, fastapi에서는 요청이 들어오는대로 각각의 connection pool에 할당을 하고 10개가 넘는 경우는 대기를 하다 반환된 pool에 배치되는건지요?

 

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

제가 생각할 때, connection pool을 제대로 사용하기 위해서는 사용 가능한 모든 pool 을 병렬로 처리해야 하지 않을까란 생각이 들었습니다.

=> 왜 이런 생각이 드셨는지는 잘 모르겠습니다만, 일반적으로 여러개의 connection pool은 별로 잘 사용하지 않지만, 아래 경우에 보통 적용합니다

가. 애플리케이션이 접속해야 할 DB등이 서로 다른 경우라면 여러개의 connection pool을 설정하고 서로 다른 db connection을 해당 connection pool에서 가져오는 등의 경우에 멀티 connection pool을 사용합니다.

나. multiple process 모드로 uvicorn을 기동하여 사용하고자 하는 경우: 개별 uvicorn 프로세스가 개별 connection pool을 사용

 

connection pool을 하나만 사용해도 충분히 빠른 성능을 보장합니다.

fastapi는 비동기 처리를 위해 비동기 Connection Pool상에서 비동기 Connection을 이용합니다.

비동기 connection을 이용하면 해당 connection이 오랜 수행 시간이 걸리거나, 아님 Lock 걸려서 계속 작업을 수행중에 있더라도 fastapi는 다른 사용자 접속을 받아서 다른 Connection을 Pool에서 호출하여 작업을 수행할 수 있습니다.

즉 fastapi 비동기 request 처리 루틴은 1번 request가 들어왔을 때 connection pool에서 A connection으로 비동기 처리하는 도중 2번 request가 들어왔을 때 connection pool에서 다른 connection을 호출하여 해당 connection에게 비동기 처리를 부탁하고 자신은 다른 request를 계속 처리해 나갈 수 있습니다.

스프링 같은 병렬 thread기반의 경우 개별 thread가 DB Connection이 작업이 완료될 때까지 계속 대기하고 있지만, FastAPI의 비동기 처리 루틴은 DB Connection이 작업을 완료할 때 까지 기다리지 않고 다른 접속 요청을(또 다른 db connection을 호출하여 처리) 처리할 수 있습니다.

1. 실무에서 사용시 connection pool로 할당한 수만큼 비동기 병렬로 처리를 하는게 맞는지요?

=> connection pool로 할당한 수만큼 비동기 병렬로 처리한다는 의미를 정확히 이해하지는 못했지만, 하나의 connection pool에서 여러개의 connection을 유지하여 처리합니다. 여러개의 connection pool은 앞에서 설명드린 사항외에는 잘 사용하지 않습니다.

  1. 트랜젝션은 동기든, 비동기든 db connection가 일을 하는 겁니다. 비동기라서 달라지지는 않습니다(단 async/await 적용 필요)

  2. 혹은, 예제와 달리, fastapi에서는 요청이 들어오는대로 각각의 connection pool에 할당을 하고 10개가 넘는 경우는 대기를 하다 반환된 pool에 배치되는건지요?

=>fastapi에서는 요청이 들어오는대로 각각의 connection pool에 할당을 한다는 의미가 요청이 들어오는 대로 connection pool에서 개별 connection을 요청한다는 의미라면 맞습니다. 그리고 가용 가능한 connection 이 없다면 fastapi는 대기를 하다가 가용한 connection이 pool에 생기면 해당 connection을 이용합니다.

 

감사합니다.

bluebamus님의 프로필 이미지
bluebamus
질문자

감사합니다. 답변에 제가 원하던 궁금증의 해결사안이 모두 담겨 있었습니다.

이렇게 긴 답변으로 자세히 설명해 주셔서 진심으로 감사드립니다.

어제부로 드디어 완강을 하게 되었습니다.

이에 마무리 1분에서 말씀해 주시던, 다음 강좌는 언제쯤 마주하게 될런지 대략적인 계획이라도 알려주시면 감사드리겠습니다 🙂

수고 많이 하셨다고 말 드리고 싶습니다. 강의 내용과 답변 내용을 보니 준비를 정말 많이 하셔왔다는 생각뿐입니다. 덕분에 좋은 지식을 얻게 되었습니다.

권 철민님의 프로필 이미지
권 철민
지식공유자

오, 드디어 완강하셨군요. 축하드립니다.

원래 다음 강좌는 내년 봄쯤 완료하려고 했는데, 다른 스케쥴이 생겨서 불가피하게 더 늦어질 것 같습니다. 관심 가져 주셔서 감사드리고 잘 들으셨다니, 저도 기쁩니다 ^^

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

질문하기