파이썬/Etc.

ASGI(Asyncronous Server Gateway Interface)란?

wookkl 2021. 5. 8. 15:43

WSGI가 나오게 된 동기

파이썬은 현재 다양한 웹 애플리케이션(django, flask, fast api 등)을 자랑한다. 그러나, 이러한 폭 넓은 선택들은 새로운 파이썬 사용자에게 문제가 될 수 있다. 일반적으로 웹 프레임워크를 선택하면 사용가능한 웹 서버의 선택이 제한되고 그 반대도 마찬가지이기 때문이다. 따라서 WSGI는 웹 서버와 웹 프레임워크간의 구현에 구애받지 않는 인터페이스로 만들어져 이식가능한 웹 애플리케이션 개발을 할 수 있다.

WSGI의 한계

  • 웹소켓을 사용할 수 없다. wsgi.websocket을 사용할 수 있으나 표준화되지 않았다.
  • HTTP/2(Concurrency) 동시성을 적용할 수 없다.
  • Can't use async and await: 파이썬의 비동기를 사용할 수 없다.

비동기 웹이 나오게 된 동기

위의 WSGI의 한계점들을 개선하고자 async web이 등장하게 되었다.

from aiohttp import web 


# Can use async and await async
def hello(request): 
	await db.execute('SELECT * FROM table') 
    return web.Response(text='Hello, world') 
    
    
app = web.Application()
app.add_routes([web.get('/', hello)])
web.run_app(app)

 파이썬은 현재 다양한 비동기 웹 애플리케이션(aiohttp, sanic 등)을 자랑한다. 그러나, 이러한 폭 넓은 선택들은 새로운 파이썬 사용자에게 문제가 될 수 있다. 일반적으로 웹 프레임워크를 선택하면 사용가능한 웹 서버의 선택이 제한되고 그 반대도 마찬가지이기 때문이다. 따라서 ASGI는 웹 서버와 웹 프레임워크간의 구현에 구애받지 않는 인터페이스로 만들어져 이식가능한 웹 애플리케이션 개발을 할 수 있다.

ASGI의 작동

ASGI는 단일 비동기 호출이 가능한 구조로 되어 있다.

  • scope: 연결에 대한 세부사항을 가지고 있는 딕셔너리 형태
  • send: send를 비동기적으로 호출하여 애플리케이션이 클라이언트로 비동기 이벤트 메세지 보낼수 있음
  • receive: receive를 비동기적으로 호출하여 애플리케이션이 클라이언트로부터 비동기 이벤트 메세지를 받을 수 있음

예제

모든 이벤트에는 이벤트의 구조를 나타내는 type 키를 정의한다.

# receive
# HTTP 요청이 body키에 들어있다.
{
    "type": "http.request",
    "body": b"Hello World", 
    "more_body": False,
}

# send 
# 웹소켓을 통해 Hello, world라는 텍스트를 보낸다. 
{
    "type": "websocket.send",
    "text": "Hello world!", 
}

WSGI와의 호환

구조적으로 ASGI는 WSGI의 슈퍼셋으로 설계되었다. 그러므로 wsgi의 동기적인 요청을 asgiref 라이브러리를 통해 응답을 할 수 있다.