스타트업에서 인프라 비용은 늘 민감한 주제입니다. 특히 B2B SaaS를 운영하다 보면, 트래픽 패턴이 B2C와는 확연히 다르다는 걸 체감하게 됩니다. 이 글에서는 Claude를 활용해 사내 인프라 리소스 사용량을 분석하고, 트래픽 패턴에 맞게 비용을 최적화한 경험을 공유합니다. 우리 서비스의 트래픽 특성우선 저희는 B2B로 서비스를 운영하고 있고 고객사 대부분이 국내 기업이고, 몇가지 트래픽 특성을 갖고있습니다.고객사의 80%가 9to6 근무 패턴을 따릅니다.해외 접속은 전체의 약 10%에 불과합니다.새벽 시간대와 주말의 트래픽은 주간 피크 대비 극히 낮습니다.이 사실은 이미 사내 모든 서버 개발자가 알고 있었지만, 실제로 인프라 리소스가 얼마나 낭비되고 있는지는 데이터를 들여다보기 전까지 체감하지 못..
전체 글
성능 모니터링 & 메모리 측면INNODB_BUFFER_PAGE / _LRUinnoDB의 핵심인 버퍼 풀에 현재 어떤 데이터 페이지들이 올라와 있는지 볼 수 있습니다. page type을 보면 UNDO_LOG, SYSTEM, INDEX 등등 버퍼풀에 올라와있는걸 볼 수 있습니다. 추가로 어떤 테이블인지? 어떤 인덱스를 올려 뒀는지? 등등 확인할 수 있어서인덱스가 자주 사용되는지 등 체크할 수 있는 정보를 제공하고 있습니다. INNODB_BUFFER_POOL_STATSINNODB_BUFFER_POOL_STATS 테이블은 InnoDB 버퍼 풀(Buffer Pool)의 현재 상태와 지표를 한눈에 파악할 수 있는 모니터링 테이블입니다. 내 DB의 메모리(캐시)가 얼마나 효율적으로 일하고 있는지, 여유 공간은 있..
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(..
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 시스템이 가지고 있던 문제를 개선하며 민첩한 제품 조직을 구성하는데 도움이 되기에 많이 활용되고 있습니다. 하지만 이런 환경은 복잡성이 높아 추적을 어렵게 만드빈다. 수시로 업데이트 되는 서비스와 하나의 요청에서 여러 네트워크 홉을 거치게 되고 기존에 모니터링 시스템으로는 파악하..
예상과 달리 인덱스가 사용되지 않거나, 오히려 성능을 저하시키는 경우가 있습니다. 이번 포스팅에서는 성능 개선 중 상황을 통해 이러한 현상을 분석해보겠습니다.예상과 달리 인덱스가 사용되지 않아 성능이 저하되는 경우가 있었습니다. 왜 인덱스가 사용되지 않는지 분석해보겠습니다!상황 소개steadies 테이블에는 약 300만 건의 데이터가 있으며, 다음과 같은 구조를 가지고 있습니다:create table steadies( id bigint auto_increment, primary key, promoted_at timestamp not null, view_count int null..