devoong2
devoong2
devoong2
전체 방문자
오늘
어제

인기 글

최근 글

  • Category (35)
    • Java (4)
    • Spring (13)
    • JPA (4)
    • DesignPattern (1)
    • 동시성 (Concurrency) (4)
    • 회고 (1)
    • Redis (1)
    • Network (3)
    • Kafka (2)
    • Spring Batch (2)

최근 댓글

반응형
hELLO · Designed By 정상우.
devoong2

devoong2

Kafka 와 Redis 의 Pub/Sub 비교
Kafka

Kafka 와 Redis 의 Pub/Sub 비교

2024. 4. 29. 20:20
반응형

 

- Kafka, Redis 의 Pub/Sub 방식의 차이
    - Pub/Sub 이란?
    - Kafka Pub/Sub 의 특징
    - Redis Pub/Sub 의 특징
    - Kafka, Redis Pub/Sub 비교
    - 메시지 수신 단위의 차이

Kafka, Redis 의 Pub/Sub 방식의 차이

이번에는 Kafka 와 Redis 의 Pub/Sub 기능에 대해 서로 어떤 차이가 있는지 알아보려합니다.

그전에 우선 Pub/Sub 기능이 무었인지 간단하게 살펴보겠습니다.

 

Pub/Sub 이란?

Pub/Sub 은 Publush / Subscribe 의 줄임말입니다. 생산자/소비자 패턴이라고도 불립니다.

이 패턴은 메시지 기반의 미들웨어로 메시지를 발행하는 발행자(publisher) 와 메시지를 수신하는 구독자(subscribe) 로 나누어집니다.
그리고 중간에 Topic/Event Channel 이 위치하게 됩니다.

이 패턴은 다음과 같은 특징을 가집니다.

  • 발행자(publisher) 는 이 메시지를 누가 수신하는지 알지도 못하고 관심사가 아닙니다. 그저 Topic/Event Channel 에 메시지를 적재합니다.
  • 구독자(subscribe) 또한 이 메시지를 누가 발행했는지 알지도 못하고 관심사가 아닙니다. Topic/Event Channel 에 적재된 메시지를 가져오기만 하면 됩니다.
  • 발행자와 구독자 서로의 관심사가 분리되어있기에 느슨한 결합(Loose Coupling) 을 가집니다.
  • 비동기식 메시지 패턴입니다.

 

Kafka, Redis 서로의 Pub/Sub 방식이 어떻게 다른지 알아보겠습니다.

 

Kafka Pub/Sub 의 특징

Kafka Pub/Sub 에서는 Publisher, Subscriber 라는 네이밍보다는 일반적으로 Producer, Consumer 라는 네이밍을 사용합니다.
Publisher(Producer), Subscriber(Consumer) 이며 역할은 동일합니다.

 

Kafka Pub/Sub 의 특징은 다음과 같습니다.

  • Consumer 는 주기적으로 Topic 에 메시지가 있는지 확인하며 메시지를 가져온다. (Polling)
  • Consumer 가 메시지를 가져가도 Topic 의 메시지는 바로 삭제되지 않는다.
    보관 주기/용량이 넘어가면 삭제됨 (retention.ms / retention.bytes)
  • Consumer는 메시지를 읽고 확인(acknowledge)할 수 있어, 메시지의 처리 상태를 추적할 수 있다.
  • Consumer 들은 하나의 Consumer Group 으로 관리된다.
  • Consumer 는 각자의 offset 을 가지고 있다.
    offset 은 Consumer 가 메시지를 어디까지 읽었는지 기록한다.

 

Redis Pub/Sub 의 특징

Redis Pub/Sub 에서는 채널(토픽) 을 통해 데이터를 전송합니다.
여기서 채널은 Subscriber 가 채널을 구독하는 시점에 생성됩니다.

 

그리고 채널에 메시지를 발행하게 되면 채널을 구독하고 있는 모든 Subscriber 들에게 메시지가 전송됩니다.

컨텐츠 구독의 기능과 유사하다고 볼 수 있습니다.


컨텐츠를 구독하는 경우에 구독자들은 새로운 컨텐츠가 등록되면 해당 컨텐츠에 대해 알림을 받게되는데요.
이때, 컨텐츠를 발행하는 주체가 Publisher 가 되고 컨텐츠 구독자들은 Subscriber 가 되는것입니다.

# subscriber
> subscribe {channel_name}
// 채널 생성

# publisher
> publish {channel_name} {message}
// 메시지 발행

 

Redis Pub/Sub 의 특징은 다음과 같습니다.

  • 메시지 발행 시 채널에 Subscriber 가 존재하지 않더라도 메시지는 발행되며 즉시 사라진다.
    (이벤트를 저장하지 않음)
  • 메시지 발행 후 Sucscriber 가 메시지를 정상 수신하였는지 확인하지 않는다.
  • Subscriber 가 채널의 메시지를 가져가는 방식이 아닌 채널로부터 수신받는 방식이다.
  • Group 이라는 개념이 없기에 Subscriber 들은 각각 이벤트를 모두 수신한다.
  • Subscriber 는 특정 패턴을 이용해 채널을 구독할 수 있다.

 

Kafka, Redis Pub/Sub 비교

Kafka 와 Redis 의 Pub/Sub 방식의 차이에 대해 간단하게 정리해보겠습니다.

     
  Kafka Redis
메시지 저장 여부 토픽에 메시지를 일정 주기동안 저장할 수 있음 메시지가 Subscriber 에게 전송되면서 채널에서 바로 삭제됨
메시지 수신 방식 Consumer 가 polling 방식으로 Topic 에서 메시지를 가져감 채널에서 Subscriber 들에게 메시지를 push
전송보장 ack 옵션에 따라 보장 가능 메시지를 수신했는지 따로 확인하지 않음
지연시간 메시지에 대해 ack 옵션에 따라 수신 확인 등의 작업이 있어 redis 보다는 비교적 느림(그래도 빠르다) In-Memory 기반으로 메시지 전송 후 수신 확인같은 별도의 작업이 없어 Kafka 보다 비교적 가볍고 빠름

 

메시지 수신 단위의 차이

일반적으로 운영되는 서비스들은 배포, Scale-Out, 고가용성 등을 위해 인해 여러대의 인스턴스로 운영됩니다.

이때 여러 인스턴스들이 특정 메시지 수신을 위해 Kafka 와 Redis 의 토픽(채널)을 수신하고 있다고 가정해보겠습니다.


Kafka 의 경우 하나의 메시지가 발행되더라도 여러 인스턴스들은 같은 Consumer Group 으로 묶여있기에
하나의 인스턴스에서만 메시지를 수신합니다. Kafka 메시지를 Consumer Group 단위로 수신하기 때문입니다.

 

Redis 의 경우에는 각 Subscriber 단위로 메시지를 수신합니다.
즉, 하나의 메시지가 발행되더라도 각 인스턴스들은 모두 메시지를 수신하게 됩니다.

그렇기에 이벤트를 전달하더라도 비즈니스의 성격 혹은 성능을 고려해서 선택해야합니다.

 

예를들면 낮은 Latency 를 요구하면서 모든 인스턴스들에게 캐시 동기화같은 기능이 필요한 경우라면
Redis Pub/Sub 이 적합할 수 있습니다.

혹은 의존성을 분리하고 특정 이벤트를 받아 중복없이 한건만 DB 에 저장해야하는 경우라면 Kafka Pub/Sub 이 적합할 수 있습니다.
Redis Pub/Sub 으로 전달받을 경우 N 건이 저장되어 비즈니스 요구사항이 틀어지거나 경합이 발생할 수 있기 때문입니다.

 

 

reference

  • https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC
  • https://aws.amazon.com/ko/compare/the-difference-between-kafka-and-redis/
반응형

'Kafka' 카테고리의 다른 글

[Kafka] 컨슈머의 Poll 동작과정 및 max.poll.records 에 대한 오해  (0) 2023.12.26
    'Kafka' 카테고리의 다른 글
    • [Kafka] 컨슈머의 Poll 동작과정 및 max.poll.records 에 대한 오해
    devoong2
    devoong2
    github 주소: https://github.com/limwoobin

    티스토리툴바