Django 3.0 에서 Channels 기능을 제공하는데 Channels은 ASGI를 기반으로 만들어진 프로젝트입니다. 기존의 HTTP 통신을 넘어서 웹 소켓, 채팅 프로토콜, IoT 프로토콜 등을 처리할 수 있습니다. 장고의 핵심을 그대로 따오고 계층화 시켜서 장고는 동기로 실행하지만 기타 connection과 socket을 비동기적으로 처리할 수 있도록 합니다. 또한 동기, 비동기 모드를 선택할 수도 있습니다.

ASGI란?

ASGI는 Asynchronous Server Gateway Interface의 약어이며 Django 3.0부터 지원하는 새로운 기능으로 비동기 웹서버 및 어플리케이션을 만들 수 있도록 제공합니다. Django 3.0부터는 ASGI를 주로 지원하는 형태를 볼 수 있습니다.

WSGI의 문제점

WSGI는 파이썬 프레임워크 및 웹 서버에서 유연한 동작을 지원했습니다. WSGI의 디자인은 HTTP 스타일로 request/response 형식에 고정되어 있어서 이러한 패턴을 따르지 않는(대표적으로 웹 소켓) 프로토콜이 표준이 되어 가면서 문제가 발생했습니다. 즉, WSGI는 단일 처리만 가능한 동기 호출 방식이여서 웹 소켓 연결이나 긴 대기 시간을 갖는 HTTP 연결에 적합하지 않았습니다. WSGI를 비동기식으로 호출이 가능하게 했어도 요청을 처리하는 부분은 동기이므로 여러 요청을 받더라도 순서대로 처리하고 반환할 수 밖에 없었습니다.

ASGI 작동 방식

ASGI는 단일 비동기 방식으로 구성되어 있습니다. ASGI 어플리케이션은 send, receive 함수를 제공하는데 이 함수들을 비동기적으로 호출하여 이벤트를 처리합니다. 여러 송수신 이벤트를 허용 할 수 있을 뿐만 아니라 백그라운드 코루틴도 허용하므로 redis 큐와 같은 외부 트리거 이벤트를 읽는 것과 같은 어플리케이션의 다른 작업도 수행할 수 있습니다.

ASGI는 WSGI의 상위 집합 개념으로 설계되었으며 asgiref 라이브러리를 사용해 ASGI 서버 내에서 WSGI를 실행할 수 있습니다. 

구현

서버

Daphne

ASGI를 참조하는 서버로  파이썬 라이브러리의 Twisted로 작성되고 Django Channels 프로젝트의 일부로 유지 관리되고 있습니다. HTTP/1, HTTP/2 및 웹 소켓을 지원합니다.

Uvicorn

uvloop 및 httptools를 기반으로 하는 빠른 ASGI 서버입니다. HTTP/1 및 웹 소켓을 지원합니다.

프레임워크

Django/Channel

channel은 Django에 비동기를 지원하기 위해 추가한 Django 프로젝트입니다.

FastAPI

Quart

Quart는 Python ASGI 웹 마이크로 프레임 워크입니다. Flask 앱에서 asyncio 기능을 사용하기 쉽게 제공합니다.

Starlette

Channels란?

Channels는 Django를 변경해 Django에서 동기로 작동하는 코어 하위에 비동기 코드를 작성했습니다. 따라서 HTTP 통신 뿐만 아니라 웹 소켓, MQTT, 챗봇 등 긴 연결 시간이나 많은 연결들을 갖는 프로토콜을 처리할 수 있습니다.

Django의 동기적이고 사용하기 쉬운 특성을 유지하면서 Django view나 완전한 비동기 또는 이를 혼합하여 사용하는 것과 같은 방법을 제공합니다. 또한 인증 시스템과 세션 시스템 등과 통합돼 HTTP 전용 프로젝트를 다른 프로토콜로 쉽게 확장할 수 있습니다.

또한 프로세스들 사이에서 쉽게 통신할 수 있는 시스템인 채널 계층을 event-driven 아키텍쳐로 제공하고 프로젝트를 다른 프로세스로 분리할 수 있습니다.

ASGI는 Channels에 내장된 비동기 서버의 이름입니다. WSGI와 마찬가지로 Channels과 Daphne 서버에 귀속되지 않고 다른 서버와 프레임워크를 선택할 수 있습니다.