developer tip

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

copycodes 2020. 11. 1. 18:17
반응형

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


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

현재 키가 지정된 메시지의 일부로 키없이 메시지를 보내고 있는데, 여전히 작동 delete.retention.ms합니까? 메시지의 일부로 키를 보내야합니까? 메시지의 일부로 키를 만드는 것이 좋은가요?


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

상태 시스템의 경우 log.cleaner.enable 과 함께 키를 사용 하여 동일한 키를 가진 항목을 중복 제거 할 수 있습니다 . 이 경우 Kafka는 애플리케이션이 지정된 키의 가장 최근 인스턴스에만 관심이 있다고 가정하고 로그 클리너는 키가 null이 아닌 경우에만 지정된 키의 이전 복제본을 삭제합니다. 이 형식의 로그 압축은 log.cleaner.delete.retention 속성에 의해 제어되며 키가 필요합니다.

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

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

참고 URL : https://stackoverflow.com/questions/29511521/is-key-required-as-part-of-sending-messages-to-kafka

반응형