Pletor Engineering

제품을 만들며 쌓은 경험적 자산을 공유합니다.

제품을 만들며 얻은 백엔드, 관측성, 인프라, 운영 경험을 가볍게 읽히는 실무 노트로 정리합니다.

Latest Posts

코드, 설정, 운영 기준을 함께 남기는 실무형 기술 글을 먼저 보여줍니다.

Kafka Active-Active의 핵심은 Kafka가 아니라 Ownership이다

Kafka 기반 Active-Active DR 아키텍처에서 Kafka가 해결하는 문제와 애플리케이션이 직접 책임져야 하는 Ownership, Outbox, Inbox, 장애 전환 전략을 정리합니다.

kafkaactive-activedisaster-recoverymsaarchitecture

AI가 코드를 써도, 소프트웨어는 퇴고가 필요하다

바이브 코딩의 시대에도 쓸 수 있는 애플리케이션을 만들려면 왜 도메인 이해, 검수, 반복 수정이 필요한지 정리합니다.

aisoftware-developmentengineeringworkflow

Kafka partition은 괜찮다는데 디스크가 없다

Kafka 4.3의 Partition Size Percentage metrics가 retention 압력을 보여주는 방식과 한계, 그리고 log.dirs 물리 free space 모니터링이 여전히 필요한 이유를 정리합니다.

kafkastoragemonitoringoperationstesting

AI는 코드를 배웠지만, 소프트웨어는 운영에서 배운다

AI가 글과 코드로 배운 지식의 강점과 한계, 그리고 실제 소프트웨어 품질이 운영 피드백을 통해 개선되는 이유를 정리합니다.

aisoftware-developmentoperationsobservability

Kafka Streams 4.2 이후, 장애를 덜 아프게 만드는 두 가지 변화

Kafka Streams 운영에서 자주 만나는 나쁜 레코드와 rebalance 문제를 Kafka 4.2 이후 DLQ 지원과 Streams Rebalance Protocol 관점에서 정리합니다.

kafkakafka-streamsdlqrebalanceoperations

Kafka 브로커 빼기 전에 먼저 Cordon부터

Apache Kafka 4.3에 추가된 cordoned.log.dirs 설정의 의미와 사용법을 정리합니다. 브로커나 log directory를 비우기 전에 새 replica 배치를 먼저 막는 운영 흐름을 다룹니다.

kafkaoperationsstoragedecommissionmaintenance

Kafka 4.0 Consumer Rebalance: 이제 조율은 브로커가 한다

Apache Kafka 4.0에서 GA가 된 새 rebalance protocol을 정리합니다. 기존 protocol과 무엇이 다르고, broker-side assignment와 incremental rebalance가 운영에 어떤 의미를 갖는지 다룹니다.

kafkaconsumerrebalanceoperationsarchitecture

Kafka Streams와 EIP Aggregator: 모으는 것보다 끝내는 것이 어렵다

EIP Aggregator 패턴을 Kafka Streams로 구현할 때 중요한 것은 groupBy와 aggregate가 아니라 correlation key, state store, completion condition, late event 처리입니다.

kafkakafka-streamseiparchitecturestream-processing

Kafka는 왜 Outbox와 Inbox 사이에 잘 맞을까

MSA 비동기 호출에서 Outbox와 Inbox 패턴이 필요한 이유와, Kafka가 이 패턴의 메시지 경로로 잘 맞는 이유를 정리합니다.

kafkamsaarchitecturemessagingreliability

Kafka가 끼어도 Trace는 끊기지 않아야 한다

MSA 흐름 중간에 Kafka가 들어오면 동기 호출처럼 trace가 자연스럽게 이어지지 않습니다. Kafka header로 trace context를 전파하고 producer와 consumer instrumentation을 설계하는 관점을 정리합니다.

kafkatracingopentelemetryobservabilitymsa

Kafka는 메모리가 남아 있는데 왜 OOM이 났을까

Kafka broker의 메모리를 heap과 page cache만으로 보면 놓치기 쉬운 direct buffer를 다룹니다. 시스템 메모리와 heap이 남아 있어도 direct memory 한도 때문에 allocation failure가 날 수 있습니다.

kafkamemoryjvmoperationsperformance

수정하지 않을 YAML 로그를 왜 전부 객체로 만들까

초당 수십/수백 건의 YAML 로그를 선별하던 경험을 바탕으로, 로그처럼 immutable한 데이터를 처리할 때 DOM/object tree 대신 stream/event 기반 처리를 고려해야 하는 이유를 정리합니다.

yamlloggingperformancestreamingoperations

Docker Compose는 편한데, .env 비밀값은 너무 쉽게 남는다

Pletor가 공개한 Envoyage를 소개합니다. Docker Compose 흐름은 유지하면서 평문 secret env 파일이 Git, 백업, 배포 디렉터리에 남는 위험을 줄이는 작은 도구입니다.

dockerconfigurationsecurityopen-source

JVM 메트릭만으로는 컨테이너를 설명할 수 없다

Pletor가 공개한 node-metrics-agent를 소개합니다. Java 애플리케이션에서 host와 container node metric을 JMX로 노출하고 JMX exporter로 Prometheus에 연결하는 방법을 정리합니다.

javajmxprometheuscontainersobservability

Kafka Client Metrics는 관측의 빈틈을 메울 수 있을까

KIP-714로 도입된 Kafka 클라이언트 원격 메트릭 수집의 구조, 지원 메트릭, 설정 방법, 그리고 운영 현실에서의 한계를 정리합니다.

kafkaobservabilitymonitoringoperations

Kafka가 잘하는 대용량과 보내면 안 되는 대용량

Kafka는 대용량 이벤트 스트림에 강하지만 대용량 파일 전송 채널로 쓰면 시스템 전체의 storage amplification이 커지는 이유를 정리합니다.

kafkastoragearchitectureoperations

Kafka Broker가 느려졌지만 Kafka가 원인은 아니었다

특정 Kafka broker의 throughput 저하와 ISR 이탈을 추적하다가 VM 아래의 네트워크 블록스토리지 경합까지 내려간 경험을 정리합니다.

kafkaoperationsstorageobservability

컨테이너 설정 주입의 마지막 한 끗: env에서 config로

컨테이너에 주입된 환경 변수를 애플리케이션이 실제로 읽는 설정 파일로 바꾸는 gomplate 기반 실무 패턴을 정리합니다.

containersconfigurationgomplatekubernetes

겉보기엔 균형 잡힌 Kafka, Broker Metrics는 다르게 말한다

Kafka cluster에서 leader partition 수가 균등해도 실제 부하는 다를 수 있습니다. partition별 traffic, network, storage 사용량을 함께 보는 balancing 기준을 정리합니다.

kafkaoperationsload-balancingmonitoring

Kafka의 디스크는 어디로 가고 있나: Object Storage로 옮겨지는 Streaming Storage

WarpStream, AutoMQ, Apache Fluss, Kafka Diskless Topics를 통해 Kafka 생태계가 broker-local disk를 벗어나 object storage를 바라보는 이유와 차이를 정리합니다.

kafkastorageobject-storagearchitecture

Consumer Group만으로는 Queue가 되지 않는다: Kafka Share Group의 의미

Kafka Share Group이 왜 추가되었는지, 기존 Consumer Group과 무엇이 다른지, 어떤 기준으로 적용해야 하는지 정리합니다.

kafkaoperationsconsumerqueue

Konduo Community를 Docker Compose로 10분 안에 시작하기

Redis, PostgreSQL, Kafka 등 여러 운영 대상을 통합 관리하는 Konduo Community를 Docker Compose로 빠르게 구성하고 선택형 매뉴얼, Prometheus, 첫 로그인까지 확인합니다.

konduodockerquickstartprometheus

AI 애플리케이션에서 Redis가 맡는 다섯 가지 역할

AX 시대의 AI 애플리케이션에서 Redis가 캐시, 세션 상태, 검색 보조, 비동기 작업, 운영 제어 계층으로 쓰이는 방식을 정리합니다.

redisaiarchitectureoperations

Consumer Lag은 건강 점수가 아니다: Kafka Consuming Pressure라는 관점

Kafka Consumer Lag을 절대값으로만 판단하지 않고, producer 유입량과 consumer group 처리 능력을 함께 보는 운영 관점을 정리합니다.

kafkaobservabilityoperationsmonitoring

Consumer Group인데 Consumer가 아니다: Kafka 안에서 노드들이 서로를 찾는 법

Kafka Connect와 Schema Registry가 Kafka의 group coordination을 활용해 노드 멤버십, 리더 선출, 작업 분배를 다루는 방식을 정리합니다.

kafkakafka-connectschema-registrycoordination

로그가 병목이 될 때: Log4j2 Appender의 무거운 일을 요청 경로 밖으로 밀어내기

Log4j2 Custom Appender를 만들 때 hot path, bounded queue, AsyncAppender, throttling을 어떻게 바라보면 좋은지 실전 관점으로 정리합니다.

javalog4j2loggingobservability

Redis에도 Consumer Group이 있다: Streams를 캐시 너머로 보기

Redis Streams를 key-value 캐시 너머의 append-only event log, consumer group, pending message 처리 관점에서 살펴봅니다.

redisstreamsmessagingoperations

Tags

태그로 기술 영역과 운영 경험을 빠르게 찾아볼 수 있게 정리합니다.