TIL DAY 42 || Django Channels with Redis

TK·2021년 4월 25일
1

TIL

목록 보기
49/55

(수정 21.04.29)

주식 가격을 클라이언트들에게 websocket 을 통해 push 하려고 Django 의 Channels 를 사용하던 중 의문점이 들었다.

  • Django Channels 에서 유저가 consumer 를 통해 접근하면
  • 다음과 같이 해당 유저의 individual channel 이 설정해놓은 group 으로 참여되도록 했다.

해당 group 의 이름을 알면 그 group 에 연결된 모든 channel 들에게 메시지를 전달하는게 가능하다.
그래서 그 group 의 이름을 알아야했는데, 문서 어디를 찾아봐도 group 리스트를 구하는 방법이 나와있지 않았다.

그 때 갑자기 channel layers 를 관리하기 위해 redis 서버를 세팅했던 것이 생각났다.

바로 redis 서버에 접속해서 모든 keys 를 확인해봤더니,

서버에 모든게 저장되어있었다.

https://github.com/django/channels_redis#prefix

처음 세팅했던 channels_redis 모듈이

  • 채널과 그룹이 생성되고 어떤 채널들이 특정 그룹에 연결되는지와 같은 정보들을 저장하고,
  • 그 정보들을 사용하여 그룹에 있는 채널들에게 메시지를 보낼 수 있도록 한다.

다음은 redis 서버와 django channels 가 어떤식으로 상호작용하는지 설명한 글이다.

It depends on how you are using it. The primary purpose of redis in django-channel_layers is to store the necessary information required for different instances of consumers to communicate with one another.
For example, in the tutorial section of channels documentation, it is clear that Redis is used as a storage layer for channel names and group names. These are stored within Redis so that they can be accessed from any consumer instance. If for example, I create a group called 'users' and then add 3 different channel names to it, this information is stored in Redis. Now, whenever I want to send data to the channels in the group I can simply reference the group from my consumer and Django-channels will automatically retrieve the channel names stored under that group in Redis.
On the other hand, if you want to use consumers in a non-conventional way, that is, as background workers then Redis becomes a message queue. That's because when you send a message containing a task to be done by one of the background workers (a consumer that 'consumes' the tasks) those messages have to be stored somewhere so that the background workers can retrieve them as they finish up other tasks.

https://stackoverflow.com/questions/63754950/what-role-does-redis-serve-in-django-channels

How to retreive data from redis server

django-channels 자체에서 모든 groups 와 연결된 channels 들을 가져오는 것이 불가능하다고 해서, 아 그럼 django 프로젝트 안에서 redis 서버에 접근한 다음 저 group name 을 가지고 오기만 하면 된다 라고 생각했으나, 그렇게 다시한번 서버에 접근하는것이 비효율적이라고 판단했다.

그래서 그냥 백그라운드 스레드를 실행시켜서 해당 ticker 를 key 로 잡고 연결된 channels 들을 해당 key 의 value 로 관리했다.

profile
Backend Developer

0개의 댓글