웹소켓은 비동기 방식으로 여러 클라이언트의 요청을 처리합니다. 그러나, 비동기 메서드에서 동기적 ORM 쿼리를 직접 호출하면 현재 스레드가 블로킹되고, 데이터베이스의 응답을 기다리며 다른 요청을 처리하지 못하는 상황이 발생합니다. 이로 인해 데이터베이스 타임아웃이나 차단(blocking) 문제가 발생할 수 있습니다.
웹소켓에서 OperationalError: database timeout or blocking에 에러가 발생하는 이유는 Django ORM이 기본적으로 동기적이기 때문이다. 비동기 환경에서 Django ORM을 동기적으로 사용할 경우 성능 문제와 데이터베이스 타임아웃 혹은 차단이 발생할 수 있다.
# from django.contrib.auth import get_user_model
# async def get_user_data(user_id):
# User = get_user_model()
# user = User.objects.get(id=user_id) # 동기적 ORM 쿼리
# return user
--------------------
from asgiref.sync import sync_to_async
from django.contrib.auth import get_user_model
@sync_to_async
def get_user_data_sync(user_id):
User = get_user_model()
return User.objects.get(id=user_id)
웹소켓에서 비동기 작업을 하는 경우, Django ORM이 동기적으로 실행되면 성능 저하가 발생할 수 있기에
@sync_to_async 데코레이터를 이용해 동기적 ORM 작업을 비동기적으로 실행할 수 있도록 하면 동기적 ORM 쿼리를 별도의 스레드에서 실행시켜, 웹소켓의 비동기 작업에 지장을 주지 않도록 할 수 있습니다.
'프로젝트' 카테고리의 다른 글
[GCP] 인증서 관리자를 이용한 SSL 인증서 발급 및 적용 (0) | 2025.01.16 |
---|---|
웹소켓 포트 충돌 문제 (0) | 2024.12.30 |
Docker 네트워크 오류 (1) | 2024.12.19 |
OpenAI 연결 방법 (2) | 2024.12.19 |
EC2 Amazon Linux 이미지 - 버전 관리 (1) | 2024.12.18 |