추가 성능개선


            String message = objectMapper.writeValueAsString(messagePayload); // JSON으로 직렬화
 
            String key = exArticle.getId().toString();  // 게시물 ID를 키로 사용
            CompletableFuture<SendResult<String, String>> future = kafkaTemplatetest.send(topicName, key, message);

현재 코드는 매번 send할 때마다 JSON 직렬화를 수행하기 때문에, ObjectMapper를 빈으로 등록하여 변환 속도를 향상시켰다.

 
@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        return mapper;
    }

}

위와 같이 ObjectMapper를 빈으로 등록하면, 매번 객체를 새로 생성할 필요 없이 스프링 컨테이너가 관리하는 하나의 인스턴스를 재사용할 수 있어 메모리 사용 효율이 높아지고, 직렬화 처리 성능 또한 개선된다.

100명이 입찰요청을 1 초간격으로 할떄 순서 보장 하기

jmeter 로 동일한 작물을 100명이 짧은 간격으로 제안을 할때 순서 보장이 되는지 테스트 해 보았다.

최고값보다 큰 금액을 항상 제안해야 되기떄문에, 순차적으로 1씩 금액을 늘려서 제안을 하는 시나리오를 구성하였다.

ex) a가 1원 제안하면, b는 1초 뒤에 2원, c는 1초 뒤에 3원을 제안하는 식으로 구성하였다.

입찰 요청의 순서를 보장하기 위해 Kafka를 사용하여 입찰 메시지를 처리하도록 설계하였다.

bid_requests라는 토픽에 입찰 메시지를 보내되, 메시지의 key를 게시 작물 ID로 설정하였다.

Kafka는 동일한 key를 가진 메시지는 동일한 파티션에 저장되며, 해당 파티션 내에서는 메시지 순서가 보장되므로,

현재 시나리오처럼 모든 입찰 요청이 동일한 작물에 대한 것이라면 자연스럽게 같은 파티션으로 전달되어 순서가 유지된다.

결과

image.png