2017-12-13 18 views
0

나는 (나머지 API와 스키마 레지스트리가있는) Confluent에서 Apache Kafka를 설치했습니다. 나는 spring-boot와 spring-kafka를 사용하여 프로듀서를 구현했다. (각 이벤트는 데이터베이스 트리거에서 생성된다.) 이제는 여러 인스턴스로 실행하고 싶습니다.하지만 kafka에서 중복을 생략하는 적절한 방법은 무엇입니까? 로드 밸런서 뒤에 스프링 부트가 거의없고 각각에 uuid가 생성 된 이벤트가있는 경우 kafka 하나만 보내는 방법은 무엇입니까? 나는 봄에 uuid를 생성 할 수 있지만 이벤트의 내용은 여전히 ​​같을 것이고 모든 인스턴스 (데이터베이스의 트리거는 각 제작자에게 어쨌든 컨텐츠를 보낼 것입니다)에서 전송할 요지는 없습니다.스프링 부트 및로드 밸런서를 사용하는 Kafka의 독립 제작자

답변

0

나는 아파치 카프카 Log Compaction 기능에 대해 살펴해야한다고 생각 :

로그 압축은 적어도 하나의 주제 파티션에 대한 각 레코드 키에 대한 마지막으로 알려진 값을 유지합니다. 압축 된 로그는 충돌 또는 시스템 장애가 발생한 후 상태를 복원하는 데 유용합니다.

그래서 UUID는 레코드 키가되고 다른 쪽 소비자는이 키의 레코드 하나만 사용할 수 있습니다.

+0

귀하의 의견에 과도하지 않은가요? 나는 compaction.lag.ms에 대해 거의 0ms를 가질 것입니다. - 작성된 모든 단일 이벤트 이후에 정리하기 : 압축은 I/O를 차단하지 않지만 서버의 자원을 필요로합니다. –

+0

생산자 측에서 데이터를 제한 할 수있는 다른 방법은 없습니다 , 그것들은 독립된 실례입니다. UUID의 기본 키를 사용하여 DB에 데이터를 저장할 수 있으며 다른 쪽에서 이미이 테이블을 폴링하여 Kafka에 전송할 수 있습니다. 또 다른 해결책은 소비자 측에서'filter'와 같을 수 있습니다 - 만약 당신이 같은'key'를 가지고 레코드를 얻으면 무시하십시오. 다음은 Spring Kafka의 솔루션입니다. https://docs.spring.io/spring-kafka/docs/2.1.0.RELEASE/reference/html/_reference.html#_filtering_messages –