fastapi 는 비동기 어플리케이션으로 웹과 통신하기 위해서는 asgi server 가 필요합니다. 기본적으로 uvicorn 을 지원하며 hyptercorn 이나 daphne 와 같은 서버 프로그램으로도 대체가능합니다.
uvicorn 과 같은 asgi 서버는 요청을 비동기로 처리하기 때문에 하나의 쓰레드에 여러 코루틴이 동시적으로 생성되고 진행됩니다. 기존의 wsgi 서버에서 요청별 thread가 소모되는 것과 다르게 thread 생성없이 여러 작업을 동시적으로 처리합니다.
이 동시성 코드로 인해 요청별 고유한 context관리가 어려워집니다.
기존에 thread 별로 요청을 처리했기 때문에 threading.local 스토리지를 통해 요청의 컨텍스트를 관리할 수 있었지만 asgi application 에서 1개의 쓰레드에 여러 코루틴이 있기 때문에 컨텍스트 관리를 위해 threading.local 변수를 사용하는 것은 문제가 됩니다.
이 때 contextvars 를 사용합니다.
contextvars 는 비동기를 지원하는 어플리케이션에서 요청별 고유한 Id 를 관리하고자 할 때 유용하게 사용될 수 있습니다. contextvars 를 이용하면 전역변수에 대한 컨텍스트 관리가 용이해 집니다.
예로들어 FastAPI 미들웨어에서
위 작업을 하기 위해서는 우선 요청의 고유한 단위가 무엇인지 기준점을 파악해야 합니다. 단위를 파악하면 어플리케이션(fastapi) 에서 이 컨텍스트에 대해서 어떻게 유지되고 대한 고민이 필요합니다. 시작하는 시점ㅇ 어떤 지점에서 클라이언트 요청을 처리하기 시작하는지 알아야합니다.
contextvars 를 사용하기 위해서 uvicorn 과 fastapi 가 어떻게 통신하는지 구조를 파악해 보았습니다.
혹시 이미지 어떤거로 만드셨는지 알수있을까요?