달력

112017  이전 다음

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  

Pub/Sub는 분산시스템에서 거의 뭐 필수적으로 사용되는 모델입니다.  간단히 말하면 그룹채팅같은거죠...


Redis에서는 이 모델을 어떻게 구현했는지 알아보겠습니다.



우선 channel에 참여하는 명령어 SUBSCRIBE는 (pubsub.c:pubsubSubscribeChannel) 를 호출합니다.

엇~?? 이거 어디서 많이 봤습니다.


redisClient->pubsub_channels(dict) 에 key : channel, value : NULL을 저장합니다.

그리고 watch와 마찬가지로 해당 server.pubsub_channels에 key와 client를 저장합니다.

WATCH와 다른점은 client에서 ilst가 아니라 dict로 정보를 저장하고 있다는점입니다.




서버에는 channel에 접속한 client 정보가(server.pubsub_channels),
클라이언트에는 subscribe한 channel명이 저장되어있습니다.(client.pubsub_channels)


특이한점은 channel을 패턴을 활용해서 여러체널을 한번에 참여할 수 있습니다.

패턴은 List자료구조 pubsub_patterns에 저장합니다.  psubscribe foo*는 pubsub_chennels에 저장되는게 아니라,

pubsub_patterns에 저장되게 됩니다.


dict가 아니라 list이기 때문에 search할때 O(n){n은 pubsub_patterns의 길이} 만큼 발생되게 됩니다.

아래에서도 보겠지만 publish를 하면  pubsub_channels에서 해당 channel에 저장되어있는 client에게 메세지 보내고,

pubsub_patterns에 저장되어있는 client에 메세지를 보냅니다. 그런데 패턴의 경우 stringmatchlen함수를 호출하는데

이놈이 List 길이만큼 탐색을 합니다.


말하고 싶은게 뭐냐면....'앵간하면 psubscribe보다는 subscribe를 쓰자' 입니다 ㅎㅎ


마지막으로 publish에 알아보겠습니다.

pubsubPublishMessage 함수로 channel명과 메세지가 인자로 넘어오면

pubsub_channels에서 channel을 검색하고, 있다면 연결되어있는 client로 메세지를 보냅니다. 

그리고 pubsub_patterns에서 channel을 stringmatchlen을 이용해서 검색하고, 

있다면 연결 되어있는 client로 메세지를 보냅니다.

저작자 표시 비영리
신고
Posted by 오산돌구
TAG