토픽을 생성할 때 주의해야할 점

  1. 토픽명
    1. 토픽명은 한번 정하면 바꾸기가 매우 어렵다. 여러 서비스나 여러 팀에서 토픽을 사용하기 때문.
    2. 따라서 토픽은 반드시 Rule을 정해 패턴화하자
  2. 토픽의 파티션 개수 계산
    1. 1초당 메시지발행수 / Consumer Thread 1개가 1초당 처리하는 메세지 수
    2. 100 / 100 = 10개의 파티션 필요
    3. 파티션 수는 늘릴 수 있으나 줄일 수 없다 (파티션 하나에 1개의 컨슈머가 매핑되기 때문) 따라서 파티션 개수를 최초에 잘 정하는게 매우 중요하다.
  3. Retention 시간 및 byte block size
    1. 디스크의 크기와 데이터의 중요성에 따라 판단하기

TopicBuilder를 이용해 토픽을 생성하기

@Configuration
public class KafkaTopicConfiguration {
		@Bean
    public AdminClient adminClient(KafkaAdmin kafkaAdmin){
        return AdminClient.create(kafkaAdmin.getConfigurationProperties());
    }
    @Bean
    public NewTopic clip2(){ // 토픽을 생성
        return TopicBuilder.name("clip2").build();
    }
    @Bean
    public KafkaAdmin.NewTopics clip2s(){
        return new KafkaAdmin.NewTopics(
                TopicBuilder.name("clip2-part1").build(),
                TopicBuilder.name("clip2-part2")
                        .partitions(3)
                        .replicas(1)
                        .config(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(1000*60*60))
                        .build()
        );
    }
}

위처럼 스프링에서는 Configuration을 하면 프로젝트가 실행될 때 Topic을 생성하게 된다.

이때 TopicBuilder를 활용하여 토픽 이름, 파티션, 레플리카, 리텐션 등을 지정할 수 있으며 위 코드의 경우 리텐션을 1시간으로 설정하였다. 다만 이미 생성된 토픽이 있고 프로젝트를 재 실행할 경우 파티션의 개수만 수정되고 나머지는 그대로 유지된다.

desciprtionTopics를 사용하면 보다 세부적인 토픽정보를 볼 수 있다.

토픽 생성 결과

Untitled

토픽 삭제 및 토픽 정보 확인

@Bean
	public ApplicationRunner runner(AdminClient adminClient){ // <key value> Type Param
		return args -> {
			Map<String, TopicListing> stringTopicListingMap = adminClient.listTopics().namesToListings().get();
			for(String topicName : stringTopicListingMap.keySet()){
				System.out.println(stringTopicListingMap.get(topicName));
				Map<String, TopicDescription> descriptionMap = adminClient.describeTopics(Collections.singleton(topicName)).all().get();
				System.out.println(descriptionMap);
				if(!stringTopicListingMap.get(topicName).isInternal()){ // 내부 토픽은 절대 삭제해선 안된다.
					adminClient.deleteTopics(Collections.singleton(topicName));
				}
			}
		};
	}

Untitled