주식 가격을 클라이언트들에게 websocket 을 통해 push 하려고 Django 의 Channels 를 사용하던 중 의문점이 들었다.
해당 group 의 이름을 알면 그 group 에 연결된 모든 channel 들에게 메시지를 전달하는게 가능하다.
그래서 그 group 의 이름을 알아야했는데, 문서 어디를 찾아봐도 group 리스트를 구하는 방법이 나와있지 않았다.
그 때 갑자기 channel layers 를 관리하기 위해 redis 서버를 세팅했던 것이 생각났다.
바로 redis 서버에 접속해서 모든 keys 를 확인해봤더니,
서버에 모든게 저장되어있었다.
처음 세팅했던 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
django-channels 자체에서 모든 groups 와 연결된 channels 들을 가져오는 것이 불가능하다고 해서, 아 그럼 django 프로젝트 안에서 redis 서버에 접근한 다음 저 group name 을 가지고 오기만 하면 된다 라고 생각했으나, 그렇게 다시한번 서버에 접근하는것이 비효율적이라고 판단했다.
그래서 그냥 백그라운드 스레드를 실행시켜서 해당 ticker 를 key 로 잡고 연결된 channels 들을 해당 key 의 value 로 관리했다.