Redis와 Kafka의 차이점 [닫힘]


91

Redis는 Kafka와 마찬가지로 실시간 pub-sub로 사용할 수 있습니다.

언제 사용할지 혼란 스럽습니다.

모든 사용 사례는 큰 도움이 될 것입니다.


15
이 질문이 "의견 기반"으로 종결 된 이유를 잘 모르겠습니다. 둘 사이에는 객관적인 기술적 차이점이 있으며 기존 답변은 이러한 차이점을 명확하게 설명합니다.
— David Anderson

답변:


144

Redis pub-sub는 생성 한 모든 메시지가 한 번에 모든 소비자에게 전달되고 데이터가 어디에도 보관되지 않는 화재 및 잊어 버림 시스템과 거의 같습니다. Redis와 관련하여 메모리에 제한이 있습니다. 또한 생산자와 소비자의 수는 Redis의 성능에 영향을 미칠 수 있습니다.

반면 Kafka는 대기열로 사용할 수있는 높은 처리량의 분산 로그입니다. 여기에서 원하는 수의 사용자가 생산할 수 있고 소비자는 원하는 시간에 소비 할 수 있습니다. 또한 큐를 통해 전송 된 메시지에 대한 지속성을 제공합니다.

최종 테이크 :

Redis 사용 :

  1. 화재를 원하고 생성하는 모든 메시지가 소비자에게 즉시 전달되는 일종의 시스템을 원치 않는 경우.
  2. 속도가 가장 중요하다면.
  3. 데이터 손실을 견딜 수 있다면.
  4. 전송 된 메시지를 시스템에 보관하지 않으려는 경우.
  5. 처리 할 데이터의 양은 크지 않습니다.

kafka 사용 :

  1. 신뢰성을 원한다면.
  2. 소비 후에도 전송 된 메시지 사본을 시스템에 보유하려는 경우.
  3. 데이터 손실을 감당할 수없는 경우.
  4. 속도가 큰 문제가 아니라면.
  5. 데이터 크기가 크다

74
한 가지 주요 차이점은 Redis Pub / Sub는 푸시 기반이고 Kafka Pub / Sub는 풀 기반이라는 것입니다. 즉, Redis에 게시 된 메시지는 즉시 구독자에게 자동으로 전달되는 반면 Kafka 데이터 / 메시지는 소비자에게 푸시되지 않으며 소비자는 메시지를 처리 ​​할 준비가되면 메시지를 요청합니다. cloudkarafka.com/blog/… kafka.apache.org/documentation.html#design_pull
— Zeni

이것을 읽으 십시오 : redis.io/topics/persistence 전송 된 메시지를 보관하는 것이 가능해 보입니다. 내가 잘못?
— David D.

1
@DavidD : 제공 한 링크 redis는 전송 되었지만 아직 처리 되지 않은 메시지가를 다시 시작한 후 손실되지 않도록 구성하는 방법을 설명합니다 redis. 그것은 그렇게 할 수 있지만, redis수 없습니다 보류 (또는 유지 @Karthikeyan의 재사용 단어) 상자 밖으로.
— Younes

12

레디 스 5.0 버전은 제공 스트림 데이터 strucutre를. 배달이 보장되는 로그 데이터 구조로 간주 될 수 있습니다. 소비자가 생산자가 스트림에 추가 한 새 데이터를 기다릴 수있는 일련의 차단 작업과 소비자 그룹이라는 개념을 제공합니다.

기본적으로 스트림 구조는 Kafka와 동일한 기능을 제공합니다.

다음은 문서 https://redis.io/topics/streams-intro입니다.

이 기능을 지원하는 가장 인기있는 Java 클라이언트는 Redisson 과 Jedis입니다.


1
Nikita 자신 :) 우아한 도서관! 방금 사용하기 시작했습니다. 잘 구조화되고 신중하게 생각했습니다! 당신은 천재입니다!
— mmm

@mmm 감사합니다!
— Nikita Koksharov

적절한 사용과 관련하여 몇 가지 질문이 있으며 잘못된 가정을하는 것이 두렵습니까? 아마도 여기에 추가 한 두 가지 질문을 검토 할 수 있습니다. 또한 괜찮다면 때때로 당신을 괴롭히기 위해 Skype에 당신을 추가하고 싶습니다. 나는 그것을 어떻게 사용하고 싶은지에 대한 통찰력을 제공 할 수 있습니다. 총 멍청이가 아닙니다 :)
— mmm

예를 들어, 현재 캐시 가능한 맵을 만들고 있습니다 ... 런타임 ID를 키로 사용하고 시스템이 현재 데크에서 처리하고있는 항목 목록을 추가합니다 ... 목록, 나는 추측에 대한 ArrayList를 만들 수 있습니다 , 나는 redisson이 나를 위해 내부적으로 변환 할 것이라고 믿지만, 내가하지 않고 redisslon 목록을 만들면 이름을 지정해야합니다. 맞습니까? 그러면 내부적으로 그 목록에 어떤 이름을 부여 하시겠습니까? 임의의 ID? API는 사용 사례가 있으므로 createList, createMap 등이 적은 매개 변수를 제공하지 않아야합니까?
— mmm

물론 randomUuid를 보낼 수 있지만 redisson에 좋은 이름 생성기가 있다는 것을 알고 있으면 좋을 것입니다. 또한 "taken"요소를 포함하는 맵에 의해 백업 된 redisson deque가 포함 된 배치 작업을 처리하기 위해 자체 Deque를 작성하고 있습니다. 대기열을 처리하는 각 8 개의 스레드가있는 10 개의 시스템이 있고 핵폭탄이 발생하면 모두 처리되지 않은 상태로 손실되고 처리되지 않은 상태로 남게됩니다.
— mmm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.