채팅 서비스의 핵심은 뭐다?
실시간 메세징이다
서버에서 웹 클라이언트로 메세지를 전달하려는 방법은 크게 4가지
(HTTP 1.1 기준) 웹 프로토콜인 HTTP는 항상 클라이언트로부터의 요청에 서버가 응답하는 구조
Django Channels 에서 기본적으로 제공하고 실시간 메세징이 가능한 Web Socket을 이용할거임
그럼 이 Web Socket이 어디에 쓰였냐 아 아 아 아 아 아
그러니 나도 한 번 배민쇼핑라이브 기술 써보자아가주악악!!!!!!!
Redis Pub/Sub
서버 단에서 채팅방의 다른 유저에게 메세지를 뿌리는 역할
유저로의 전달은 웹소켓이 담당
레디스 특정 채널에 구독신청을 하면 구독자(Subscriber)가 됨. 레디스 특정 채널에 메세지를 발행(Publish)하면, 구독 중인 구독자에게 메세지가 전달됩니다. ex) 유튜브 구독
레디스의 Pub/Sub는 메세지를 "전달하는" 시스템이기에 메세지를 보관안함!! 안함 안함!!
지난 채팅 메세지 조회가 필요하다면, 메세지를 DB에 넣어두고 필요할 때 조회
서버 대수를 늘려 Horizontal로 손쉬운 Scale out을 지원
ASGI는 파이썬 비동기 웹의 표준이기에 모든 비동기 파이썬 웹프러임워크의 기반
-장고 Channels는 웹을 넘어, 모든 통신 프로토콜을 지원할 수 있습니다
-Channels 기본에서 HTTP와 WebSocket을 지원합니다.
장고는 wsgi / asgi 모두를 기본에서 잘 지원하며, 원하는 방식으로 구동 가능
-장고의 일반적인 뷰 처리는 (django, djangorestframework 등) WSGI 방식이 성능이 더 잘나올 수도 있다고 함!
# 장고 프레임워크
django~=4.1.0
# 채널스 기본 라이브러리 + daphne
channels[daphne]~=4.0.0
# 채널스, 채널 레이어 Redis 백엔드 라이브러리
channels_redis~=4.0.0
# 환경변수의 손쉬운 settings 적용
django-environ
# 장고 내에서 손쉬운 bootstrap5 사용
django-bootstrap5
# 가벼운 HTTP 클라이언트 라이브러리
requests
# HTML 파싱 라이브러리
beautifulsoup4
# 테스트
pytest
pytest-django
pytest-testdox
pytest-asyncio
자 그럼 다음 시간부터 가보자 gogogogogogogogogogo곡!