Spring Kafka에서는 컨슈머가 가져온 메시지를 처리하는 방식에 따라 배치 리스너와 레코드 리스너로 구분할 수 있습니다.레코드 리스너 (Record Listener)하나의 메시지를 받아서 처리하는 방식poll()로 가져온 배치를 내부적으로 루프 돌며 개별 처리하는 방식@KafkaListener(topics = "my-topic", groupId = "my-group")public void listen(String message) { // 메시지 하나씩 처리 System.out.println("받은 메시지: " + message);}배치 리스너 (Batch Listener)여러 메시지를 한 번에 받아서 처리하는 방식poll()로 가져온 배치를 그대로 변환해 처리하는 방식@KafkaListener(..
BE
Kafka Consumer 설정별 성능 측정 실험1. 실험 개요1.1 실험 목적파티션 수를 늘리지 않고, Consumer 설정만으로 처리량을 얼마나 끌어올릴 수 있는지 측정1.2 실험 전제 조건파티션 수: 1개 고정 (파티션당 Consumer 1개, 1:1 매칭)메시지 수: 각 패턴당 10,000개처리 시간: 메시지당 10ms 고정 (Thread.sleep(10))브로커/네트워크: 충분한 리소스 보장 (로컬 환경)테스트 방식: 미리 10,000개 메시지를 토픽에 적재한 후, Consumer 시작하여 처리 속도 측정1.3 테스트 환경Spring Boot: 3.xSpring Kafka: 3.2.xKafka: 로컬 브로커Java: 17실행 방식: 로컬에서 Kafka와 Spring Boot 애플리케이션 동시 실..
Kafka 프로듀서 완벽 가이드프로듀서란?Kafka 프로듀서는 메시지를 Kafka 클러스터의 토픽에 발행하는 클라이언트입니다. 프로듀서는 메시지를 직렬화하고, 파티션을 선택하며, 배치로 묶어서 효율적으로 전송합니다.핵심 구현: clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.javaProperties props = new Properties();props.put("bootstrap.servers", "localhost:9092");props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");props.put("value.serialize..
카프카를 살펴보다가 ConsumerDelegate를 구현하고 있는 두가지 클래스를 볼 수 있었습니다. ClassicKafkaConsumer 와 AsyncKafkaConsumer인데요 컨슈머는 왜 2가지 방식으로 존재하는지 궁금했고 흥미로워서 이에대해서 정리를 해보고자 합니다.우선 클래스명을 보고 ClassicKafkaConsumer 가 좀 더 오래된 컨슈머겠구나 예상을 하고 들여다 봤습니다. 해당 클래스에는 주석부터 classic group protocol 을 사용하는 클라이언트라고 되어 있었습니다. 그럼 classic group protocol이란 무엇인가..?찾은 문서를 기반으로 설명하면 classic protocol/classic group protocol 으로 부르고 다음과 같은 특징이 있다고 합..
토스 페이먼츠 면접에서 Observbility 관련한 질문을 받았었는데.. 제대로 답변을 못했던 기억이 있어서 토스 페이먼츠는 어떻게 분산 환경에서 로그를 통해 이슈를 파악하는지 내용을 정리해 보고 현재 회사의 환경과 비교해 보려고 합니다. 현대의 소프트웨어 시스템은 클라우드, 컨테이너, MSA(Microservices Architecture) 등의 기술을 기반으로 하며, 이는 시스템의 가상화 및 추상화를 심화시켜 기존의 IT 시스템이 가지고 있던 문제를 개선하며 민첩한 제품 조직을 구성하는데 도움이 되기에 많이 활용되고 있습니다. 하지만 이런 환경은 복잡성이 높아 추적을 어렵게 만드빈다. 수시로 업데이트 되는 서비스와 하나의 요청에서 여러 네트워크 홉을 거치게 되고 기존에 모니터링 시스템으로는 파악하..
이것도 모르고 자바를 했다니..자바 IO/NIO 프로그래밍 책을 보던중에 아래와 같은 예제를 볼 수 있었다.public class ExtendThread extends Thread { @Override public void run() { System.out.println("Thread 클래스 상속"); }}class ExtendThreadTest { public static void main(String[] args) { Thread thread = new ExtendThread(); thread.start(); }}상속을 통해 Thread를 생성하고 시작하는 방식의 대한 예제이다.위에 예제는 상속을 통해 Thread를 생성하고 시작하는 방..
캐시 시리즈캐시를 통한 성능개선 - 이론편현재 상황병목현상스테디 프로젝트는 메인 페이지에서 ‘좋아요’ 수 와 조회수를 기반으로 한 기간별 인기 모집 글을 보여주고 있습니다. 현재 개발 서버에는 300만 건의 데이터가 존재하고 인기 글의 기간 범위가 늘어날수록 Latency가 길어지는 문제가 발생하고 있었습니다. 인덱스를 적용했음에도 만족스러운 응답속도가 나오지 않았고 비슷한 서비스를 목푯값으로 잡아 성능을 개선해 보는 경험을 공유하려 합니다.테스트 환경nGrinder , nGrinde-agentVUser 150 (3/50)Ramp-Up 사용 10s → 1 Thread 증가스크립트에 ThinkTime 700ms현재 성능VUser 수가 약 50 부터 1초 이상의 Latency가 발생하고 있습니다. RPS가 ..
1. 캐시의 기본 개념 캐시(Cache)란? 캐시(Cache)란 일반적으로 자주 사용되는 데이터나 값을 미리 복사해 놓는 임시 저장소를 의미합니다. 컴퓨팅 분야에서는 이러한 캐시를 사용함으로써 데이터에 대한 접근 시간을 단축시키고, 전체적인 처리 성능을 향상시킬 수 있습니다. 다양한 수준에서의 캐시 사용 CDN(Content Delivery Network) CDN은 지리적으로 분산된 서버에 정적 컨텐츠를 캐시하여 클라이언트가 요청했을 때 가까운 서버(Edge Server)를 사용해 컨텐츠를 더 빠르게 전송시키는데 목적을 두고있습니다. 하지만 모든 서버에서 같은 컨텐츠를 갖고 있는것은 아닙니다.(비효율적) 클라이언트가 CDN을 사용해 요청을 보내면 탐색후 캐시에서 발견되지 않으면 원본 서버에서 컨텐츠를 가..