본문 바로가기
Python

ASGI란 (WSGI의 후계자)

by yororing 2024. 3. 28.

00 서론

  • ASGIWSGI의 후계자이며, WSGI를 이해하기 위해선 사전에 CGI에 대한 이해가 있으면 도움이 됨

1. CGI란

  • 'Common Gateway Interface'의 약자
  • 클라이언트와 Web 서버 사이의 커뮤니케이션 메소드를 정의하는 인터페이스 (프로그램이라고도 할 수 있음)
  • 작동 예:
    • 일반적인 경우 클라이언트가 요청을 보내고 Web 서버가 해당 요청의 내용을 HTTP 프로토콜에 따라 파싱한 후, 반환된 내용을 캡슐화함
    • 서버가 HTML 페이지를 반환하고 HTTP 프로토콜에 따라 반환된 내용의 응답 형식을 구성함
    • TCP 연결, 원래의 HTTP 요청 및 해당 형식 모두 CGI 프로그램에 의해 완료됨

2. WSGI란

  • 'Web Server Gateway Interface'의 약자
  • Python Web 서버와 Web 앱 또는 프레임워크 간의 간단하고 보편적인 인터페이스 (또는 프로그램)

1) WSGI의 문제

  • WSGI를 업그레이드하지 않고 ASGI를 따로 만든 이유:
    • WSGI의 단일 호출 인터페이스가 WebSocket과 같은 더 복잡한 Web protocol에 적합하지 않기 때문
  • WSGI 앱은 동기 및 단일 호출 방식 (single, synchronous callable), 즉 요청을 받고 응답을 반환하는 방식으로 작동
    • 이런 방식은  long-poll HTTP나 WebSocket 연결과 같은 장기 연결(long-lived connection)을 불가능하게 함
  • WSGI 호출 방식을 비동기로 만들더라도, WSGI는 요청을 제공할 때 사용되는 경로단일, 하나로 되어있기에 다수 입력 이벤트 (e.g., WebSocket 프레임들 수신)를 가진 protocol들은 이것을 트리거 할 수 없음
  • 그러므로 ASGI라는 인터페이스 프로그램을 생성함

01 ASGI란

  • 'Asynchronous Server Gateway Interface' 의 약자
  • ASGI는 WSGI의 후계자로 웹 서버 (async-capable Python 웹 서버), 프레임워크, 그리고 앱 (응용 프로그램) 간의 호환성을 위한 표준 인터페이스 제공하는 프로그램
  • WSGI는 Python 웹 공간에서 동기 Python 앱을 위한 표준을 제공했다면, ASGI는 동기 및 비동기 앱 둘 다를 위한 표준 제공
    • 동기 vs 비동기 방식 (Synchronouns vs Asynchronous)
      • 동기 Sync
        • multi-thread, which means operations or programs can run in parallel
        • Async is non-blocking, which means it will send multiple requests to a server
        • 작업 실행 시 그 작업이 완료되지 않더라도 다음 코드를 실행하는 방식
      • 비동기 Async
        • single-thread, so only one operation or program will run at a time
        • 작업 실행 시 그 작업이 끝나기를 기다리는 방식 - 작업이 완료될 때까지 다음 코드의 실행을 멈추고 기다림
        • 구체적인 예시:
          • DBAPI 연동 과정에서 발생하는 대기 시간을 낭비하지 않고, CPU가 다른 작업을 할 수 있도록 하는 방식
  • ASGI는 WSGI의 원래 모드와 WebSocket의 확장 지원 (즉, ASGI는 WSGI의 확장)

1. 작동 방식

  • ASGI는 단일 비동기 호출로 구성됨
  • 3가지를 받음:
  1. scope: 특정한 연결에 관한 세부정보(details)를 포함한 dict
  2. send: 앱이 클라이언트에게 이벤트 메세지를 보내게 하는 비동기 호출
  3. receive: 앱이 클라이언트로부터 이벤트 메세지를 받을 수 있게 하는 비동기 호출
  • 이는 각 앱이 여러 입출력 이벤트 (incoming and outgoing events)를 허용하며 앱이 백그라운드 coroutine을 사용하여 앱이 다른 작업들을 수행하는 것을 가능케 함 (예: Redis queue와 같이 외부 트리거에서 이벤트를 수신하는 것 등)

2. 적용되는 서버, 프레임워크, 다른 도구들

1) 서버

  • Daphne, Granian, Hypercorn, NGNIX Unit, Uvicorn

Daphne

  • https://github.com/django/daphne
  • the current ASGI reference server, writtne in Twisted and maintained as part of the Django Channels project
  • supports HTTP/1, HTTP/2, WebSockets

Granian

  • https://github.com/emmett-framework/granian
  • a Rust HTTP server for Python applications
  • supports ASGI/3, RSGI, WSGI interface applications

Hypercorn

  • https://pgjones.gitlab.io/hypercorn/index.html
  • an ASGI server based on the sans-io hyper, h11, h2, ans wsproto libraries
  • supports HTTP/1, HTTP/2, WebSockets

NGINX Unit

  • https://unit.nginx.org/configuration/#configuration-python
  • unit is a lightweight and versatile open-source server that has three core capabilities: it is a web server for static media assets, an application server that runs code in multiple languages, and a reverse proxy

Uvicorn

  • https://www.uvicorn.org/
  • a fast ASGI server based on uvloop and httptools
  • supports HTTP/1 and WebSockets

2) 앱 프레임워크

  • BlackSheep, Connexion, Django/Channels, Esmerald, FastAPI, Litestar, Quart, Sanic, rpc.py. Starlette

BlackSheep

  • https://github.com/Neoteroi/BlackSheep
  • typed, fast, minimal web framework
  • has a performant HTTP client, flexible dependency injection model, OpenID Connect integration, automatic OpenAPI documentation, dedicated test client and excellent authentication and authorization policy implementation
  • supports HTTP and WebSockets

Connexion

Django/Channels

  • http://channels.readthedocs.io
  • Channels is the Django project to add asynchronous support to Django and is the original driving force behind the ASGI project
  • supports HTTP and WebSockets with Django integration, and any protocol with ASGI-natie code

Esmerald

FastAPI

  • https://github.com/tiangolo/fastapi
  • an ASGI web framework (made with Starlette) for building web APIs based on standard Python type annotations and standards like OpenAPI, JSON Schema, and OAuth2
  • supports HTTP and WebSockets

Litestar

Quart

Sanic

rpc.py

Starlette

  • https://github.com/encode/starlette
  • a minimalist ASGI library for writing against basic but powerful Request and Response classes
  • supports HTTP and WebSockets

3) 도구

a2wsgi

  • https://github.com/abersheeran/a2wsgi
  • convert WSGI application to ASGI application or vice versa
  • pure Python
  • only depend on the standard library

참조

  1. https://asgi.readthedocs.io/en/latest/index.html
  2. https://www.programmersought.com/article/60453596349/#google_vignette
  3. https://trustmitt.tistory.com/85  
  4.