Study/django

django기반 SSE (Server-Sent-Events), celery를 이용한 실시간 SSE 만들기

bluebamus 2024. 7. 21. 00:00

 - sse의 기반은 다음 페이지를 참고하였다.

   - 참고 사이트 : https://www.photondesigner.com/articles/server-sent-events-daphne

 

The simplest way to add server sent events to Django 🏺

Add server sent events to your Django app with Daphne (and minimal code).

www.photondesigner.com

 

 - 프로젝트 저장소 : https://github.com/bluebamus/django-drf-sse.git

 

GitHub - bluebamus/django-drf-sse: Let's implement Server-Sent-Events (SSE) using django and drf. It works based on asynchronous

Let's implement Server-Sent-Events (SSE) using django and drf. It works based on asynchronous operations using Celery and Redis. - bluebamus/django-drf-sse

github.com

 

 1. 프로젝트 소개

   - 해당 프로젝트는 sse의 기본 동작을 구현했다.

   - 프로젝트는 poetry를 사용하여 패키지를 관리한다.

   - daphne를 사용하여 asgi로 동작한다.

   - localhost:8000 로 접속하면 기본 sse를 테스트 할 수 있다. 

   - localhost:8000/1/ 로 접속하면 celery를 이용한 sse를 테스트를 할 수 있다.

      - celery는 update_state를 이용해 실시간 상태 및 메타 데이터를 업데이트 한다.

      - view는 AsyncResult 객체를 사용해 state, current, result를 확인한다.

         - 비동기 작업을 하기 때문에 AsyncResult 객체 생성 및 상태를 확인하는 과정을 모두 비동기화 시켜야 한다.

         - await sync_to_async를 사용해 모든 호출을 비동기화 시킨다.

   - 기본 코드와 celery를 사용하는 코드를 비교하면 차이를 확인할 수 있다.

 

 2. 실행 방법

   - docker-compose up 을 이용해 docker 컨테이너를 실행시킨다.

 

 3. 주의 사항

   - 기본 sse는 윈도우에서도 동작을 한다.

   - 프로세스 문제로 gevent를 사용해 쓰레드로 구동하는 윈도우 환경에서 비동기 처리는 에러를 발생시켰다.

   - 리눅스에서 실행하면 문제없이 동작한다.

 

 4. 기타

   - 머신러닝의 단계별 처리 현황 추적 및 단계별로 수행해야 하는 외부 API를 이용한 서비스 처리의 실시간 현황을 client에 전송할때 유용하다.

   - 실시간은 기본 websocket을 사용하는게 맞지만, 양방향 통신이 필요 없다면 sse로 구현하면 서버 리소스를 줄이고 원하는 통신을 지속시킬 수 있다.

   - 테스트시 서버에서 데이터 전송 중 사용자가 웹페이지를 종료하면 비동기 동작의 종료가 try로 검출되며 이를 네트워크 단절로 판단하여 이후 동작을 구현할 수 있다.