Redis 구성과 Pub/Sub과의 관계

레디스 개발자 교육 신청 레디스 정기점검/기술지원
Redis Technical Support
레디스 엔터프라이즈 서버
Redis Enterprise Server

Redis 구성과 Pub/Sub과의 관계

단독(Standalone) 구성

Publish/Subscribe가 모두 제대로 처리된다.

마스터/복제(Master/Replica) 구성

  • 같은 서버(Master/Replica)내에서는 메시지를 전파하고 리턴값도 받는다.
    > publish ch01 Msg
    (integer) 1
  • Redis Master -> Replica: publish msg를 전파한다. 하지만 리턴값을 전달하지 못한다.
    > publish ch01 Msg
    (integer) 0
  • Replica -> Master, Replica_1 -> Replica_2: publish msg를 전파하지 않는다.

[주의] Java Lettuce/Spring은 마스터/복제 구성을 지원하지 않음.
            [Spring Boot 3.1.7, Lettuce 6.2.7, Redis 7.2.3 기준]

  • Java Lettuce MasterReplica (StatefulRedisMasterReplicaConnection)은 Pub/Sub를 지원하지 않습니다. 해당 연결(connection)에는 publish, subscribe 메서드가 없습니다.
  • Java Spring RedisStaticMasterReplicaConfiguration은 Pub/Sub를 지원하지 않습니다.
    아래와 같이 "지원하지 않는다"는 Exception이 발생하고 아래와 같은 메시지를 받습니다.
    "Pub/Sub connections not supported with Master/Replica configurations"
    Java Source: /org/springframework/data/redis/connection/lettuce/
                StaticMasterReplicaConnectionProvider.java

    Github 관련 이슈 2020년 01월 30일
    Mark Paluch(Lettuce 개발자) commented

    마스터/복제본 사용은 Pub/Sub에서 작동하지 않습니다.
    첫째, Lettuce에는 마스터/복제본에 대한 Pub/Sub 구현이 없습니다.
    두 번째 이유는 Redis Standalone 또는 Replica가 노드 간에 Pub/Sub 메시지를 전파하지 않기 때문입니다. 이는 Redis 클러스터에서만 사용할 수 있습니다.
    따라서 한 노드에서 보낸 메시지를 다른 노드에서 받을 수 없습니다.

    Using Master/Replica isn't going to work with Pub/Sub.
    First, there is no Pub/Sub implementation in Lettuce for Master/Replica.
    The second reason is that Redis Standalone or Replica does not propagate Pub/Sub messages across nodes.
    That's only available in Redis Cluster. So messages sent on one node cannot be received on a different node. We should improve at least the exception and our docs to indicate that Pub/Sub isn't supported.

센티널(Sentinel) 구성

Java Spring으로 구현할 경우 Auto Config 또는 Maunal Config (ReadFrom 설정) 둘 다 Publish/Subscribe가 제대로 처리된다.
Mark Paluch(Lettuce 개발자)는 (without setting ReadFrom)이라고 해서 마치 ReadFrom을 설정하면 PubSub가 작동하지 않을 것처럼 언급했지만 잘 작동한다.
단 처리는 모두 마스터에서 한다. Application에서 PubSub 연결은 마스터로만 한다.

클러스터(cluster) 구성

클러스터에서 Publish하면 복제를 포함한 모든 노드에게 보낸다. 따라서 마스터에서 publish한 메시지를 복제(Replica)에서 subscribe할 수 있다.  마스터 뿐만 아니라 복제에서도 publish할 수 있다. 복제에서 publish한 메시지를 다른 복제에서 subscribe할 수 있다. 
Pub/Sub를 중요하게 사용한다면 레디스 클러스터를 사용하세요.


Clients for Java Jedis, Lettuce, Redisson
Clients for C Hiredis

<< Pub/Sub Intro Redis Config & Pub/Sub Pub/Sub Internal >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.