WSGI vs ASGI

SeungHyuk Shin·2022년 4월 13일
0

들어가며

ASGI는 웹 서버, 프레임워크, 애플리케이션 간의 호환성을 위한 오랜 파이썬 표준인 WSGI의 정신적 계승자입니다.

WSGI는 파이썬 웹 공간에서 훨씬 더 많은 자유와 혁신을 허용하는데 성공했으며, ASGI의 목표는 비동기 파이썬의 영역까지 이를 지속하는 것입니다.

WSGI 문제가 무엇인가요?

"왜 WSGI를 업그레이드하지 않는가?"라고 물을 수 있습니다. 이는 수년 동안 여러 차례 제기되어 왔으며, 문제는 WSGI의 단일 호출 가능 인터페이스가 WebSocket과 같은 보다 복잡한 웹 프로토콜에 적합하지 않다는 데 있습니다.

WSGI 응용 프로그램은 요청을 받고 응답을 반환하는 단일 동기 호출 가능입니다. 긴 폴링 HTTP 또는 WebSocket 연결과 같이 오래 지속되는 연결을 허용하지 않습니다.

이 호출 가능을 비동기식으로 만들었다고 해도 요청을 제공할 수 있는 단일 경로만 있기 때문에 웹소켓 프레임 수신과 같은 여러 수신 이벤트가 있는 프로토콜은 이를 트리거할 수 없습니다.

ASGI는 어떻게 작동합니까?

ASGI는 단일 비동기 호출 가능한 구조로 되어 있습니다. 특정 연결, 송신, 비동기 호출 가능에 대한 세부 정보를 포함하는 범위를 가지며, 이를 통해 애플리케이션은 클라이언트에 이벤트 메시지를 보내고 비동기 호출 가능을 수신할 수 있습니다.

이것은 각 어플리케이션에 여러 개의 들어오는 이벤트와 나가는 이벤트를 허용할 뿐만 아니라 응용 프로그램이 다른 작업(예: Redis 대기열과 같은 외부 트리거에서 이벤트를 수신하는 것)을 수행할 수 있도록 백그라운드 코루틴을 허용합니다.

가장 간단한 형태로, 응용 프로그램은 다음과 같이 비동기 함수로 작성될 수 있습니다.

async def application(scope, receive, send):
    event = await receive()
    ...
    await send({"type": "websocket.send", ...})

보내거나 받는 모든 이벤트는 미리 정의된 형식의 Python dict입니다. 이러한 이벤트 형식이 표준의 기반을 형성하고 서버 간에 애플리케이션을 교환할 수 있도록 합니다.

이러한 이벤트에는 각각 정의된 유형 키가 있으며, 이 키를 사용하여 이벤트 구조를 유추할 수 있습니다. 다음은 HTTP 요청에서 본문과 함께 수신할 수 있는 이벤트 예입니다

{
    "type": "http.request",
    "body": b"Hello World",
    "more_body": False,
}

다음은 보내는 WebSocket 메시지를 보내기 위해 전달할 수 있는 이벤트의 예입니다.

{
    "type": "websocket.send",
    "text": "Hello world!",
}

WSGI 호환성

ASGI는 또한 WSGI의 상위 집합이 되도록 설계되었으며 둘 사이에 정의된 변환 방법이 있으므로 WSGI 응용 프로그램이 asgiref 라이브러리에서 제공되는 번역 wrapper를 통해 ASGI 서버 내에서 실행될 수 있습니다. 스레드 풀을 사용하여 비동기 이벤트 루프에서 동기 WSGI 응용 프로그램을 실행할 수 있습니다.

0개의 댓글