2016-10-21 1 views
6

저는 Kafka를 사용하고 있으며 단일 메시지를 놓칠 수없는 내결함성 시스템을 구축하기위한 유스 케이스가 있습니다. 그래서 여기에 문제가 있습니다 : Kafka에 게시가 어떤 이유로 (ZooKeeper down, Kafka broker down 등) 실패 할 경우, 다시 상황이 다시 발생하면 어떻게 그 메시지를 안전하게 처리하고 재생할 수 있습니까? 다시 말하지만 우리는 단일 메시지 오류조차도 감당할 수 없습니다. 또 다른 사용 사례는 카운터 기능과 같은 이유로 인해 카프카에 게시하지 못한 메시지의 수를 알 필요가 있으며 이제는 다시 게시해야합니다.kafka 게시 실패를 강력한 방식으로 처리하는 방법

해결 방법 중 하나는 이러한 메시지를 일부 데이터베이스 (예 : 쓰기가 매우 빠른 Cassandra와 같지만 카운터 기능이 필요하며 Cassandra 카운터 기능이 그리 좋지는 않으며 사용하지 않으려는 것 같습니다.) 그 종류의 짐을 취급 할 수 있고 또한 저희를 아주 정확하다 카운터 기능을 제공하십시오.

이 질문은 아키텍처의 관점과 그 기술을 사용하는 데 더 중요합니다.

추신 : 3000TPS와 같은 부분을 처리합니다. 따라서 시스템 시작이 실패하면 실패한 메시지는 매우 짧은 시간 내에 매우 빠르게 증가 할 수 있습니다. 우리는 자바 기반의 프레임 워크를 사용하고 있습니다.

도움 주셔서 감사합니다.

답변

4

카프카가 분산되고 내결함성이있는 방식으로 만들어진 이유는 당신과 똑같은 문제를 처리하는 것이기 때문에 핵심 구성 요소의 여러 인스턴스가 서비스 중단을 피해야합니다. Zookeeper를 피하려면 적어도 3 명의 Zookeeper 인스턴스를 배포합니다 (AWS에있는 경우 사용 가능 영역에 배포). 브로커 오류를 방지하려면 여러 브로커를 배포하고 프로듀서 bootstrap.servers 속성에 여러 브로커를 지정했는지 확인하십시오. Kafka 클러스터가 메시지를 내구성 영지에 기록했는지 확인하려면 acks=all 속성이 제작자에 설정되어 있는지 확인하십시오. 이것은 모든 비 동기화 복제본이 메시지 수신을 확인한 경우 (처리량을 희생시키면서) 클라이언트 쓰기를 확인합니다. 또한 브로커에 대한 쓰기가 백업을 시작하면 예외를 잡아서 처리하고 재 시도 할 수 있도록 대기열 제한을 설정할 수 있습니다.

카산드라 (잘 분산 된 내결함성 시스템)를 사용하면 아키텍처에 안정성을 추가하는 것처럼 보이지 않지만 복잡성은 증가하지만 카산드라는 작성되지 않았습니다. 메시지 큐에 대한 메시지 대기열, 나는 이것을 피할 것이다.

올바르게 구성하면 Kafka가 모든 메시지 작성을 처리하고 적절한 보증을 제공 할 수 있어야합니다.

+0

Chris! 나는 카프카가 그러한 상황을 다루는 방식으로 만들어 졌음을 이해하지만,이 말을 논증으로 삼아서 일이 항상 효과가 있다고 말하는 것은 약간의 대담한 말이며 나에게는 조만간 실패 할 운명이 따른다는 것을 이해합니다.중개인과 사육사 인스턴스가 충분하더라도 상황을 제어 할 수없는 방법을 보여주는 예제를 제공하기 만하면됩니다. 예 : 하나의 주제에 3 개의 복제본이 있고 min.insync.replicas를 2로 설정하면 즉, 브로커에 대한 쓰기는 3 개의 복제본 중 2 개가 동기화 된 경우에만 성공합니다. 이제 복제본이 동기화되지 않은 경우 새 요청을 수락하지 않습니다. – Coder

+0

@ 코더 이것은 지연된 복제본을 ISR의 구성원으로 유지하도록 클러스터가 올바르게 구성되어 있는지 확인하는 데 도움이되는 블로그입니다. http://www.confluent.io/blog/hands-free-kafka-replication-a -lesson-in-operational-simplicity/ –

+0

감사합니다. @ 크리스 이것은 유용합니다! – Coder

2

Chris는 이미 시스템 내결함성을 유지하는 방법에 대해 이야기했습니다.

카프카는 기본적으로 at-least once 메시지 배달 의미를 지원합니다. 메시지를 보내려 할 때 어떤 일이 발생하면 다시 시도합니다. 당신이 Kafka Producer 속성을 만들 때

, 당신은 this을 확인 더 많은 정보 retries 옵션 이상 0

Properties props = new Properties(); 
props.put("bootstrap.servers", "localhost:4242"); 
props.put("acks", "all"); 
props.put("retries", 0); 
props.put("batch.size", 16384); 
props.put("linger.ms", 1); 
props.put("buffer.memory", 33554432); 
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 

Producer<String, String> producer = new KafkaProducer<>(props); 

을 설정하여 구성 할 수 있습니다.

+1

감사합니다. @Shankar. 본질적으로 두 가지 종류의 실패 재발 가능 및 재복 출 불가능이 있습니다. 재 시도 할 수있는이 등록 정보는 재발 가능 오류가있는 경우에만 유용합니다. 예를 들어, 지도자가 내려 갔을 때 브로커에서 오류가 발생하고 zooKeeper가 새로운 리더를 할당하는 등의 작업을 수행하는 경우를 예로들 수 있습니다. 이러한 종류의 실패는 재발 가능하며 재산 이상이 작동합니다. 그러나 우리가 그 재산을 얼마나 높게 설정했는지에 관계없이 재수없는 것이 없다면 그것은 효과가 없을 것입니다. 입력 해 주셔서 감사합니다! – Coder

+0

@ 코더 : 입력 해 주셔서 감사합니다. 복구 할 수없는 오류가 무엇인지 알려 주실 수 있습니까? – Shankar

관련 문제