Redis Pub/Sub 메시징

RedisBeginner
지금 연습하기

소개

이번 실습에서는 Redis의 Pub/Sub 메시징 시스템을 탐구합니다. 채널 구독, 메시지 발행, 그리고 구독 취소 방법을 배우게 됩니다. SUBSCRIBE, PUBLISH, UNSUBSCRIBE, 그리고 PSUBSCRIBE 명령어를 사용하여 핵심 작업을 수행하는 방법을 안내합니다.

SUBSCRIBE로 채널 구독하기

이번 단계에서는 SUBSCRIBE 명령어를 사용하여 Redis에서 채널을 구독하는 방법을 배웁니다. 채널을 구독하면 해당 채널에 발행된 메시지를 받을 수 있습니다. 이는 Redis의 Pub/Sub 메시징 시스템에서 가장 기본적인 개념입니다.

터미널 1: 채널 구독

첫 번째 터미널을 엽니다(이를 터미널 1이라고 부르겠습니다). LabEx 환경에서 제공하는 Xfce 터미널을 사용하시면 됩니다.

redis-cli 명령어를 사용하여 Redis 서버에 연결합니다:

redis-cli

Redis 프롬프트(127.0.0.1:6379>)가 표시될 것입니다.

SUBSCRIBE 명령어를 사용하여 mychannel이라는 이름의 채널을 구독합니다:

SUBSCRIBE mychannel

출력 결과는 다음과 유사하게 나타납니다:

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1

출력 내용을 하나씩 살펴보겠습니다:

  • "subscribe": 채널을 성공적으로 구독했음을 나타냅니다.
  • "mychannel": 구독한 채널의 이름입니다.
  • (integer) 1: 현재 구독 중인 채널의 총 개수입니다.

중요: redis-cli 세션을 활성화한 상태로 채널을 구독 중인 터미널 1을 그대로 열어두세요. 이 터미널을 닫거나 Ctrl+C를 누르면 채널 구독이 해제되므로 닫지 마세요. 다음 단계에서는 메시지를 발행하기 위해 두 번째 터미널을 사용합니다.

PUBLISH로 메시지 발행하기

이번 단계에서는 PUBLISH 명령어를 사용하여 Redis의 채널에 메시지를 발행하는 방법을 배웁니다. 메시지 발행은 Pub/Sub 시스템의 핵심 기능으로, 특정 채널의 모든 구독자에게 데이터를 보낼 수 있게 해줍니다.

터미널 2: 메시지 발행

두 번째 터미널을 엽니다(이를 터미널 2라고 부르겠습니다). Xfce 터미널에서 새 탭을 열어 사용할 수 있습니다.

redis-cli 명령어를 사용하여 Redis 서버에 연결합니다:

redis-cli

Redis 프롬프트(127.0.0.1:6379>)가 표시될 것입니다.

이제 PUBLISH 명령어를 사용하여 mychannel 채널에 메시지를 발행합니다:

PUBLISH mychannel "Hello, Redis!"

터미널 2의 출력 결과는 메시지를 수신한 클라이언트의 수가 됩니다:

(integer) 1

여기서 출력 결과가 (integer) 1인 이유는 이전 단계에서 터미널 1을 통해 mychannel에 대한 활성 구독이 유지되고 있기 때문입니다.

터미널 1에서 메시지 확인하기

이제 (1단계에서 mychannel을 구독했던) 터미널 1로 다시 전환합니다. 방금 발행한 메시지가 실시간으로 표시되는 것을 볼 수 있습니다:

1) "message"
2) "mychannel"
3) "Hello, Redis!"

이는 다음을 의미합니다:

  • "message": 발행된 메시지임을 나타냅니다.
  • "mychannel": 메시지가 발행된 채널입니다.
  • "Hello, Redis!": 실제 메시지 내용입니다.

실시간 메시징 테스트하기

이제 실시간 메시징을 직접 실험해 볼 수 있습니다:

  1. 터미널 2로 돌아가서 더 많은 메시지를 발행합니다.
  2. 터미널 1로 전환하여 메시지가 즉시 나타나는지 확인합니다.
  3. 다양한 메시지를 발행해 보며 실시간 통신을 관찰합니다.

예시 - 터미널 2에서:

PUBLISH mychannel "This is message 2"
PUBLISH mychannel "Real-time messaging works!"

중요: 터미널 1터미널 2 모두 redis-cli 세션이 활성화된 상태로 유지하세요. 다음 단계에서도 두 터미널을 계속 사용합니다.

UNSUBSCRIBE로 구독 취소하기

이번 단계에서는 UNSUBSCRIBE 명령어를 사용하여 Redis 채널의 구독을 취소하는 방법을 배웁니다. 구독을 취소하면 특정 채널의 구독자 목록에서 클라이언트가 제거되어, 해당 채널에 새로 발행되는 메시지를 더 이상 받지 않게 됩니다.

터미널 1: 구독 모드 종료하기

(현재 mychannel을 구독 중인) 터미널 1로 갑니다. "Reading messages... (press Ctrl-C to quit)"라는 구독 상태가 표시되어 있을 것입니다.

터미널 1이 구독 모드 상태이기 때문에 일반 Redis 명령어를 직접 실행할 수 없습니다. 구독을 취소하려면 먼저 구독 모드를 종료해야 합니다:

  1. Ctrl+C를 눌러 구독 모드를 종료합니다.

  2. redis-cli 세션이 종료되고 터미널 프롬프트로 돌아가는 것을 볼 수 있습니다.

  3. Redis에 다시 연결합니다:

    redis-cli
    
  4. 이제 UNSUBSCRIBE 명령어를 실행할 수 있습니다 (연결을 끊는 것만으로도 이미 구독이 취소되므로 필수는 아닙니다):

    UNSUBSCRIBE mychannel
    

참고: Ctrl+C를 누르는 순간 이미 모든 구독에서 연결이 해제됩니다. UNSUBSCRIBE 명령어는 시연 목적으로 보여드린 것이며, 실제 사용 시에는 연결을 끊는 것만으로도 모든 채널의 구독이 자동으로 해제됩니다.

터미널 1의 출력 결과는 다음과 같습니다:

1) "unsubscribe"
2) "mychannel"
3) (integer) 0

출력 내용을 하나씩 살펴보겠습니다:

  • "unsubscribe": 채널 구독을 취소했음을 나타냅니다.
  • "mychannel": 구독을 취소한 채널의 이름입니다.
  • (integer) 0: 현재 구독 중인 채널의 총 개수입니다. mychannel의 구독을 취소했기 때문에 이제 0이 됩니다.

터미널 2: 구독 취소 후 발행 테스트

이제 터미널 2로 전환하여 mychannel에 또 다른 메시지를 발행해 봅니다:

PUBLISH mychannel "Is anyone still there?"

터미널 2의 출력 결과는 다음과 같습니다:

(integer) 0

이는 터미널 1에서 해당 채널의 구독을 취소했기 때문에 메시지를 수신한 클라이언트가 없음을 나타냅니다.

메시지가 수신되지 않았는지 확인하기

터미널 1을 살펴보세요. 채널 구독을 취소했기 때문에 새로운 메시지가 나타나지 않는 것을 확인할 수 있습니다.

이는 채널 구독을 취소하면 해당 채널에 발행되는 추가 메시지를 받지 못하게 되는 반면, 발행자는 여전히 메시지를 보낼 수 있음(단, 수신하는 사람이 없음)을 보여줍니다.

Important: 다음 단계를 위해 두 터미널과 각각의 redis-cli 세션을 모두 활성화 상태로 유지하세요.

PSUBSCRIBE로 패턴 구독하기

이번 단계에서는 Redis의 PSUBSCRIBE 명령어를 사용하여 패턴을 기반으로 채널을 구독하는 방법을 배웁니다. PSUBSCRIBE를 사용하면 지정된 패턴과 일치하는 여러 채널을 한 번에 구독할 수 있습니다. 이는 연관된 여러 채널을 개별적으로 각각 구독하지 않고, 그룹 단위로 메시지를 받고 싶을 때 유용합니다.

터미널 1: 패턴 구독

이전 단계에서 mychannel 구독을 취소했으므로, 터미널 1에는 이제 일반 Redis 프롬프트가 표시되어야 합니다.

터미널 1에서 PSUBSCRIBE 명령어를 사용하여 news.* 패턴과 일치하는 채널들을 구독합니다:

PSUBSCRIBE news.*

출력 결과는 다음과 유사하게 나타납니다:

Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

출력 내용을 하나씩 살펴보겠습니다:

  • "psubscribe": 패턴을 성공적으로 구독했음을 나타냅니다.
  • "news.*": 구독한 패턴입니다. .*는 모든 문자와 일치하는 와일드카드입니다.
  • (integer) 1: 현재 구독 중인 패턴의 총 개수입니다.

터미널 2: 패턴 일치 채널에 메시지 발행하기

터미널 2로 이동하여 PUBLISH 명령어를 통해 news.sports 채널에 메시지를 발행합니다:

PUBLISH news.sports "Sports news update!"

터미널 2의 출력 결과는 메시지를 수신한 구독자의 수가 됩니다:

(integer) 1

패턴 일치 확인하기

(패턴을 구독했던) 터미널 1로 다시 전환합니다. 방금 발행한 메시지가 표시되는 것을 볼 수 있습니다:

1) "pmessage"
2) "news.*"
3) "news.sports"
4) "Sports news update!"

이는 다음을 의미합니다:

  • "pmessage": 패턴에 일치되어 수신된 메시지임을 나타냅니다.
  • "news.*": 일치한 패턴입니다.
  • "news.sports": 메시지가 실제로 발행된 채널입니다.
  • "Sports news update!": 메시지 내용입니다.

여러 채널 테스트하기

터미널 2에서 패턴과 일치하는 다른 채널들에도 메시지를 발행해 봅니다:

PUBLISH news.technology "New AI breakthrough!"
PUBLISH news.weather "Sunny skies ahead!"
PUBLISH sports.basketball "This won't match the pattern"

터미널 1을 보면 오직 news.* 채널들의 메시지만 수신되고, news.* 패턴과 일치하지 않는 sports.basketball은 수신되지 않는 것을 확인할 수 있습니다.

중요: 두 터미널과 redis-cli 세션을 모두 활성화 상태로 유지하세요. 패턴 구독 기능을 통해 연관된 여러 채널을 동시에 모니터링할 수 있음을 보여줍니다.

요약

이번 실습에서는 Redis Pub/Sub 메시징의 기본 사항을 살펴보았습니다. SUBSCRIBE 명령어로 채널을 구독하고, PUBLISH 명령어로 채널에 메시지를 발행하며, UNSUBSCRIBE 명령어로 채널 구독을 취소하고, PSUBSCRIBE 명령어로 패턴을 사용해 채널을 구독하는 방법을 배웠습니다. 이러한 명령어들은 Redis를 활용한 실시간 메시징 애플리케이션을 구축하는 데 필수적입니다.