django기반 SSE (Server-Sent-Events), celery를 이용한 실시간 SSE 만들기
- sse의 기반은 다음 페이지를 참고하였다.
- 참고 사이트 : https://www.photondesigner.com/articles/server-sent-events-daphne
- 프로젝트 저장소 : https://github.com/bluebamus/django-drf-sse.git
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로 검출되며 이를 네트워크 단절로 판단하여 이후 동작을 구현할 수 있다.