[Django] WSGI vs ASGI

동기식 처리와 비동기식 처리에 대하여

SeongBeom Lee
4 min readAug 29, 2024

이번에 회사에서 진행하는 프로젝트 중 React.js 로 FE를 구성하고 django rest framework 로 BE를 구성하는 프로젝트를 진행한 후 궁금한 점이 생겨 글을 쓴다.

로컬의 Windows Server로 배포하여 후에 Docker를 이용하거나 AWS EC2를 통해 배포할일이 생길 경우를 대비하여 프로젝트 마감 후 잠깐의 여유기간에 공부를 하기로 했다.

WSGI와 ASGI의 가장 큰 차이점은 동기식이냐 비동기식이냐에서 갈린다. 즉, 우리는 먼저 동기식과 비동기식에 대해서 먼저 살펴본 후 WSGI와 ASGI의 차이에 대해 알아봐야할 필요가 있다.

동기식 처리(Syncronous)

동기식 처리란 하나의 요청이 완료되기 전까지 다른 요청을 처리하지 않는다는 뜻이다. 이는 웹 어플리케이션의 전통적인 방법이고 요청과 응답이 순차적으로 처리된다.

이때문에 하나의 스레드로 요청과 응답을 관리할 시에는 많은 요청과 응답이 발생할 경우 병목현상이 생길 수 있다. 이 때문에 멀리스레딩을 통해 효율적으로 요청을 처리해야한다. 이는 우리나라에서 Java Spring Boot가 쓰이는 이유 중 하나이다. (멀티스레딩 관리가 용이한 프레임워크 중 하나이기 때문이다.)

전통적인 CRUD 기반 웹 어플리케이션, REST API 서비스 등 주로 동기식 작업을 수행하는 어플리케이션에 적합하다.

비동기식 처리(Asynchronous)

하나의 요청이 완료되기 전에 다른 요청을 처리할 수 있다. 이를 통해 I/O 바운드 작업(예를 들어, 데이터베이스 쿼리, 외부 API 호출, WebSocket 등)을 더 효율적으로 처리할 수 있다.

이때문에 여러 요청을 동시에 처리하며 비동기 I/O 작업에서 뛰어난 성능을 발휘한다. 실시간 어플리케이션에 그래서 특히 적합하다.

WSGI(Web Server Gateway Interface)

WSGI의 요청 처리 흐름

WSGI는 동기식으로 작동한다. 즉, 요청이 들어오면 그 요청을 처리하는 동안 다른 요청은 대기한다. 하나의 요청이 끝나야 다음 요청을 처리할 수 있다는 뜻이다. 이는 단순하고 이해하기 쉽지만, I/O 바운드 작업에서는 효율적이지 않다.

I/O 바운드 작업의 예
1. 파일 읽기/쓰기
대용량 파일을 디스크에서 일걱나 디스크에 쓰는 작업

2. 네트워크 통신
네트워크를 통해 데이터를 주고받는 작업. API 요청을 보내거나 외부 서비스에서 데이터를 가져오는 작업.

3. 데이터베이스 쿼리
데이터베이스에서 데이터를 읽거나 쓰는 작업. 대규모 데이터베이스에서 복잡한 쿼리를 실행하는 경우.

4. 웹 요청 처리
서버에서 클라이언트의 요청을 처리하고 응답을 반환하는 작업. 웹

이 때문에 멀티스레드 및 멀티프로세스 모델이 필요하고 WSGI는 이런 확장성을 지원하고 있다. 이를 통해 웹 서버에서 여러 요청을 동시에 처리한다.

장점

  • 매우 단순한 인터페이스로 인한 쉬운 이해와 구현
  • 독립적인 서버와 어플리케이션으로 인한 유연성

단점

  • 실시간 데이터 전송에서의 비효율성
  • 비동기 지원 부족

ASGI(Asynchronous Server Gateway Interface)

웹 어플리케이션이 더 복잡해지고 실시간 데이터처리(WebSocket, 서버 센트 이벤트) 와 같은 비동기 작업이 필요해지면서 WSGI의 한계가 드러났고 ASGI는 그러한 요구에 비동기 작업을 효율적으로 처리할 수 있는 표준으로 개발되었다.

ASGI는 동기식 작업과 비동기식 작업을 모두 지원한다. 이로 인해 WebSocket, HTTP/2, 서버 센트 이벤트 같은 실시간 데이터 전송 기능을 기본적으로 지원한다.

ASGI 서버는 클라이언트의 요청을 받아 ASGI 애플리케이션에 전달하고, 애플리케이션의 응답을 클라이언트에 반환하는 역할을 한다.

대표적인 ASGI uvicorn, daphne, hypercorn 등이 있다.

장점

  • 비동기 작업 지원으로 인한 실시간 데이터 처리
  • 동기식 작업과 비동기식 작업 모두 지원
  • 현대적인 웹 어플리케이션 개발에 적합

단점

  • 비동기적 흐름으로 인한 디버깅과 오류 추적의 어려움
  • WSGI에 비해 낮은 라이브러리 호환성
  • 과도한 동시성 처리로 인한 비용 증가
  • 싱글 스레드 모델의 한계
  • 부하 관리의 복잡성
  • ASGI로의 마이그레이션의 어려움

참고

https://velog.io/@wogud9675/WEB-CGI-WSGI-ASGI-%EB%9E%80

--

--

SeongBeom Lee
SeongBeom Lee

Written by SeongBeom Lee

0 Followers

내가 적는 모든 코드에는 합리적인 근거와 논리가 필요하다.

No responses yet