ASGI가 뭐에요? 에서 시작된... WSGI, CGI... 동기와 비동기

2024. 9. 12. 16:22카테고리 없음

장고에서 채팅을 구현하다가, ASGI 라는 말이 나오길래 엥? 저게 뭐지..? 

에서 시작된 글이다 ! 그냥 공식 문서 보고 이해가 되었다면 좋았을텐데... 안타깝게도 그렇지 않았음.

ASGI 정리글 이라고 쓰고 여기저기서 퍼온 글 이라고 읽는다~ 

 

 

일단, ASGI 를 이해하려면 옛날 옛적으로 거슬러 올라가야 함.

가벼운 목차는 다음과 같음.

  • 목차
    • Web server
    • CGI
    • WSGI
    • ASGI

ASGI 가 제일 최신에 나옴 -> 왜 나왔는지 알려면 ... 그 전 거를 알아야 함!

 

Web Server

맨처음 웹서버는 정적인 페이지 밖에 전달하지 못 했음! 기본적인 html 같은거

사용자의 요청이 들어오면 웹서버가 정적인 웹페이지를 전달해주는 방식이었음.

 

하찮은 나의 그림... 그냥 귀엽게 봐주십쇼!

 

 

만약 동적인 요청이 들어오면 어떻게 해야할까 ...?

 

그래서 나온 것이 CGI 다! 

(Common Gateway Interface)

CGI는 web server 와 application 간의 interface 이다.

정적인 web server 의 역할을 동적으로 개선해주기 위한 목적을 가지고 있다 ! 

 

사용자의 요청에 따라 서버에서 실행되는 프로그램을 통해
동적인 웹 페이지를 생성하거나 데이터를 처리하는 데 사용

 

 

정적인 걸 동적으로 바꿔줬으니 문제 해결?! 

 

CGI의 단점 ?!?!

  • 비효율적이다!
    • Request 수신 시마다 Apllication 프로세스를 다시 실행함
    • -> 메모리 적재 시간 소요 등의 문제 발생 (다량의 요청이 들어올 시 매우 비효율적)
    • 즉, CGI는 요청시마다 프로세스를 생성하여 커널 리소스 사용, 반납
    • 특히 스크립트 언어에서 두드러짐. C와 같이 컴파일된 언어의 프로그램을 실행하는 것보다 더 많은 시간이 필요하기 때문.

WSGI (Web Server Gateway Interface)

그렇게 나오게 된 것이 WSGI 이다~

  • Web Server 의 Request 를 Python Application 으로 보내주고 Response 를 받아서 Web Server 로 보내주는 Interface
  • Web Server 의 Request 를 Callable Object 를 통해 Application 에 전달함.
  • Callable Object 는(호출 가능한 함수)
    • Function 이나 Object 의 형태이다
    • HTTP Request 에 대한 정보와(Method, URL, Data, …) Callback 함수 정보를 전달

다른 블로그에는 이렇게 써져있더라구요 ..? 참고 하세요~

앞서서 설명한 CGI의 경우에는 요청에 대한 정보를 환경 변수나 STDIN 등으로 처리했지만
WSGI에서는 Callable object, 함수나 객체로 처리합니다.
서버에서 Callable object를 통해서 요청에 대한 정보와 Callback 함수를 전달하면
애플리케이션은 이 요청을 처리하고 Callback 함수를 실행합니다.
이런 인터페이스를 구현하는 서버나 어플리케이션을 WSGI compatible 하다고 하는데요,
그 중 특히 어플리케이션의 경우에는 WSGI application이라고 합니다.
  • WSGI Middleware 는 WSGI 의 구현체이다.
  • Request 를 Flask, django 와 같은 Web Framework 에 연결하는 WSGI server의 역할을 함.
  • gunincorn, uWSGI, Werkzeug 등이 있다.
  • WSGI 는 동시에 많은 Request 를 처리하는데 한계가 있음(동기적)
    • Celery, Queue 를 이용하여 성능 향상 가능

 

하지만? WSGI의 경우 비동기적인 요청은 처리하지 못 함..! 

단일 동기 호출방식임.

 

그게 뭔데요 ? 

??

 

이쯤에서 알아보는..! 

 비동기(Asynchronous) VS 동기(synchronous)

 

사전적인 의미로 보았을 땐 

동기 : 동시의 동시성의

비동기 : 비동시성의

 

라고 나오는데, 사전적인 의미랑은 살짝 다르다!

 

동기 작업이 순차적으로 진행됨
-> 작업이 순차적으로 실행되는 것

 

비동기  순차적이지 않음, 다른 작업의 완료 여부를 기다리지 않고 다른 작업을 실행하는 방식
-> 요청은 받은 뒤 먼저 작업이 끝난 순으로 실행되는 것

 

아마 그림을 보면 더 이해가 잘 될 것이다!

 

동기는 일을 차례차례 처리하고 실행된다면

비동기는 순서따위 없는 것! 

 

그럼 단일 동기 호출 방식에서 '단일'은 무엇일까?

 

말그대로 '하나의'라고 생각하면 된다 

반대 의미랑 같이 생각하면 이해하기가 쉬운데,

반대말은 '다중'이다

 

그림을 함께 보자!

 

동기는 동기인데, 단일이라면 동기가 하나있는 것

다중이라면 동기가 여러개 있는 것!

 

비동기도 마찬가지이다.

 

다음 그림을 보자

 

식당으로 예를 들어보자!

단일 동기는

일을 잘 못 하는 알바 한 명이라고 볼 수 있다.

이 알바는 주문 받는 일을 끝내고

서빙을 한 다음에

청소를 하는 식으로 순차적으로 일을 끝낸다

 

다중 동기는

그러한 알바생이 여러명 있는 것이다.

각자 맡은 일을 한 번에 하나씩 밖에 못 하고(주문, 서빙, 청소 등)

그 일이 끝나야 다음 일을 할 수 있다

 

그다음으로는 비동기이다.

 

단일 비동기는 

멀티 짱짱 잘 하는 알바생이 한 명있는 것이다.

매장 청소를 하다가 손님의 컴플레인을 처리하면서 서빙도 하고

다시 청소를 하다가 손님이 오면 주문을 받을 수 있는 일 잘하는 알바생이라고 생각하면 된다!

 

다중 비동기는 

멀티 짱짱 잘 하는 알바생이 여러명 있는 것이다!

(일 잘하는 알바생이 여러명~? 럭키비키~ 🍀)

 

뭔가 어렵게 느껴지지만, 그냥 일처리 순서 & 방식이라고 생각하면 된다.

어떻게 코드를 짜느냐에 따라 달라지기 때문에 대충 이런거구나~ 하고 넘어가자!

 

 

ASGI(Asynchronous Server Gateway Interface)

 

자자 다시 넘어와서 앞서 말했던 WSGI 는 동시에 많은 Request 를 처리하는데 한계가 있다고 했다.(동기적)

그래서 나온 것이 ASGI다! ASGI 는 WSGI와 똑같지만 요청을 비동기로 처리할 수 있다는 점이 다르다.

(비동기 처리를 위해 나온 ASGI ..!)

ASGI 공식 문서 -
“ASGI는 WSGI의 정신적 계승자입니다. 파이썬 웹 서버, 프레임워크, 어플리케이션 사이에 비동기적인 표준 인터페이스를 제공합니다. WSGI가 파이썬 앱에 대한 동기성에 대한 표준을 제공했다면 ASGI는 동기성과 비동기성 모두에 대한 표준을 제공합니다”
  • WSGI 에서 지원 되지 않는 Websocket, HTTP 2.0 을 지원함
  • ASGI 는 WSGI 와 호환됨(=ASGI는 WSGI의 상위 버전임)
  • WSGI의 단점
    • 요청을 받고 응답을 반환하는 단일 동기 호출 방식이라는 것
    • 웹소켓을 사용할 수 없음. wsgi.websocket을 사용할 수 있지만, 표준화안됨
  • 단일 astnchronous(비동기) 호출이 가능 하므로 여러 이벤트를 주고받을수 있음
    => 대용량 트래픽 처리를 유연하게 할 수 있음

 

그래서! 채팅 기능을 구현하기 위해선 ASGI 를 써야 한다!



 


 

사실 굉장히 어려웠던 거 같지만,

간단히 요약 하면 다음과 같다.

 

처음엔 Web Server 가 있었음. 근데 ? 정적인 페이지 밖에 처리하지 못 함

그래서 동적인 요청도 처리하기 위해 CGI 가 나옴

하지만 CGI 매번 프로세스를 새로 실행해야했기에 비효율적이었음

=> 보완해서 나온게 WSGI 임! 일 잘하는 줄 알았던 우리 WSGI는 대용량 처리에 약했는데, (단일 동기 호출 방식)

비동기 처리도 할 수 있도록 ASGI가 나오게 됨! 

 

결국에 CGI, WSGI, ASGI 다 interface라는 걸 잊지 말자! 요청과 응답을 잘 하기 위해 만들어진 거라는 것! 

각 interface 마다 완벽 이해까진 아니어도 전체적인 흐름을 이해하기엔 충분히 도움이 됐을 거라 생각한다!

 

난 이만... 다시 채팅 공부하러 ,,,, 흑