it-swarm.dev

Kafka에 메시지를 보내려면 키가 필요합니까?

KeyedMessage<String, byte[]> keyedMessage = new KeyedMessage<String, byte[]>(request.getRequestTopicName(), SerializationUtils.serialize(message)); 
producer.send(keyedMessage);

현재 키 메시지의 일부로 키가없는 메시지를 보내고 있습니다. delete.retention.ms? 메시지의 일부로 키를 보내야합니까? 메시지의 일부로 키를 만드는 것이 좋습니까?

70
gaurav

키는 강력한 키 순서가 필요하고 상태 시스템과 같은 것을 개발하는 경우 주로 유용하고 필요합니다. 동일한 키 (예 : 고유 ID)를 가진 메시지가 항상 올바른 순서로 표시되어야하는 경우, 키를 메시지에 첨부하면 동일한 키를 가진 메시지가 항상 주제의 동일한 파티션으로 이동합니다. Kafka 파티션 내에서 순서를 보장하지만 주제의 파티션 간에는 보장되지 않으므로, 키를 제공하지 않으면 파티션간에 라운드 로빈 분배가 발생합니다.

상태 머신의 경우 키를 log.cleaner.enable 과 함께 사용하여 동일한 키로 항목을 중복 제거 할 수 있습니다. 이 경우 Kafka는 응용 프로그램이 주어진 키의 최신 인스턴스 만 신경 쓰고 키가 null이 아닌 경우에만 지정된 키의 이전 복제본을 삭제한다고 가정합니다. 로그 압축은 log.cleaner.delete.retention 속성으로 제어되며 키가 필요합니다.

또는 기본적으로 사용되는보다 일반적인 속성 log.retention.hours 는 오래된 로그의 전체 세그먼트를 삭제하여 작동합니다. 이 경우 키를 제공 할 필요가 없습니다. Kafka는 주어진 보존 기간보다 오래된 로그 청크를 단순히 삭제합니다.

즉, log compaction 을 활성화했거나 같은 키를 가진 메시지에 대해 엄격한 순서가 필요한 경우 반드시 키를 사용해야합니다. 그렇지 않으면 null 키가 더 나은 배포를 제공하고 일부 키가 다른 키보다 더 많이 나타날 수있는 경우 핫 스팟 문제를 방지 할 수 있습니다.

130
kuujo