Redis pub/sub 소개

    Redis pub/sub 소개

    일반적인 pub/sub의 개념에서 알 수 있듯이, 메시지를 보내는 publish와 그 메시지를 수신할 수 있는 subscribe를 말한다. Kafka와는 달리, Redis에서는 subscribe가 된 상태의 클라이언트만 publish되는 메시지를 받을 수 있다. 쉽게 생각하면, Youtube 채널 구독과 비슷하다. 구독과 좋아요를 누르면, 나중에 새로운 글이 올라오면 노티가 올텐데, 구독중인 상태의 채널에 신규 콘텐츠가 올라오면 노티를 받을 수 있는 것과 같다.

     

    명령어

    • Redis 서버를 매개로, Redis 클라이언트간 통신을 도와줌
    • Redis 클라이언트는 Redis 서버내 "채널"을 생성함
    • 메시지를 수신하고 싶은 클라이언트는 사전에 해당 채널을 subscribe 함
    • 메시지를 보내는 클라이언트는 해당 채널에 메시지를 publsih할 수 있음
    • 메시지를 보내는 클라이언트가 메시지를 publish하면, subscribe 중인 클라이언트만 메시지를 수신함
     

     

    PUBSUB

    127.0.0.1:6379> help pubsub
    
      PUBSUB subcommand [argument [argument ...]]
      summary: Inspect the state of the Pub/Sub subsystem
      since: 2.8.0
      group: pubsub
    
    127.0.0.1:6379> pubsub help
     1) PUBSUB <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
     2) CHANNELS [<pattern>]
     3)     Return the currently active channels matching a <pattern> (default: '*').
     4) NUMPAT
     5)     Return number of subscriptions to patterns.
     6) NUMSUB [<channel> ...]
     7)     Return the number of subscribers for the specified channels, excluding
     8)     pattern subscriptions(default: no channels).
     9) HELP
    10)     Prints this help.

    일단은, 먼저 현재 상태를 조회하는 명령어부터 살펴보자. 위의 help에서 보이듯이, PUBSUB 명령어는 CHNNAELS/NUMPAT/NUMSUB의 subcommand를 포함하고 있다.

    // 활성화된 채널이 없을 때
    127.0.0.1:6379> pubsub channels
    (empty array)
    
    // 아래의 SUBSCRIBE 명령어로 채널을 한 개 활성화 시켰을 때
    127.0.0.1:6379> pubsub channels
    1) "c1"
    
    
    // 채널을 구독중인 클라이언트 수 확인
    127.0.0.1:6379> pubsub numsub c1
    1) "c1"
    2) (integer) 1
    127.0.0.1:6379> pubsub numsub c2
    1) "c2"
    2) (integer) 0
    
    // 패턴형으로 등록된 클라이언트 수 확인
    127.0.0.1:6379> pubsub numpat
    (integer) 0
    

     

    SUBSCRIBE

    127.0.0.1:6379> help subscribe
    
      SUBSCRIBE channel [channel ...]
      summary: Listen for messages published to the given channels
      since: 2.0.0
      group: pubsub

    파라미터로 명시한 채널을 구독한다. 여러 개의 채널을 동시에 구독할 수도 있다.

    // 채널을 개설함: 이제 누가 나한테 연락하려면 c1이라고 부르면 됨
    127.0.0.1:6379> subscribe c1
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "c1"
    3) (integer) 1
    
    127.0.0.1:6379> subscribe c1 c2
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "c1"
    3) (integer) 1
    1) "subscribe"
    2) "c2"
    3) (integer) 2
    

    위와 같이 여러 개의 채널을 등록하면, 각각의 채널로 메시지가 발행되면 모두 수신한다.

     

    PUBLISH

    127.0.0.1:6379> help publish
    
      PUBLISH channel message
      summary: Post a message to a channel
      since: 2.0.0
      group: pubsub

    채널에 메시지를 발행한다.

    // 채널 c1에 메시지를 발행했고, 2개의 클라이언트에게 전달되었음
    127.0.0.1:6379> publish c1 "test 1"
    (integer) 2
    
    // 채널 c2에 메시지를 발행했고, 1개의 클라이언트에게 전달되었음
    127.0.0.1:6379> publish c2 "test 1"
    (integer) 1

     

    PSUBSCRIBE

    127.0.0.1:6379> help psubscribe
    
      PSUBSCRIBE pattern [pattern ...]
      summary: Listen for messages published to channels matching the given patterns
      since: 2.0.0
      group: pubsub

    수신할 채널 이름의 패턴을 등록한다.

    // 패턴을 등록하여 수신시작
    127.0.0.1:6379> psubscribe c*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "c*"
    3) (integer) 1
    
    // 등록된 채널에는 포함되지 않음
    127.0.0.1:6379> pubsub channels
    1) "c1"
    
    // 패턴 조회: 1개 확인
    127.0.0.1:6379> pubsub numpat
    (integer) 1
    
    // 등록하지 않았던 채널 c2로 메시지 보냄
    127.0.0.1:6379> publish c2 "test 2"
    (integer) 1
    
    // 패턴으로 구독 신청한 채널에 메시지가 추가됨
    127.0.0.1:6379> psubscribe c*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "c*"
    3) (integer) 1
    1) "pmessage"
    2) "c*"
    3) "c2"
    4) "test 2"

     

    UNSUBSCRIBE, PUNSUBSCRIBE

    127.0.0.1:6379> help unsubscribe
    
      UNSUBSCRIBE [channel [channel ...]]
      summary: Stop listening for messages posted to the given channels
      since: 2.0.0
      group: pubsub
    
    127.0.0.1:6379> help punsubscribe
    
      PUNSUBSCRIBE [pattern [pattern ...]]
      summary: Stop listening for messages posted to channels matching the given patterns
      since: 2.0.0
      group: pubsub

    redis-cli에서는 ctrl+c로 곧바로 멈출 수 있지만, 별도 클라이언트로 붙었다면 unsubscribe 명령어를 통해 수신을 중단한다. 마찬가지로 punsubscribe 명령어로 일치하는 패턴의 채널 수신을 중단한다.

     


    댓글

    Designed by JB FACTORY