전체 글62 [Seatflow] 03. GitOps 파이프라인 Helm Chart + Jenkins + ArgoCD Intro코드를 작성하고 푸시하면 자동으로 K8s에 배포되는 구조를 만들었다. 이번 편에서는 그 파이프라인 전체를 다룬다.이미 기존에 GitOps 방식은 개인서버에서도 사용하고 있었기 떄문에 크게 어려움은 없었다.간단하게 설명하자면, 크게 세 가지다. Helm Chart로 배포 명세를 관리하고, Jenkins가 이미지를 빌드해서 레지스트리에 올리고, ArgoCD Image Updater가 변경을 감지해서 ArgoCD가 K8s에 배포한다.전체 흐름git push (seatflow-msa) |Jenkins 변경된 서비스 감지 Gradle 빌드 Docker 이미지 빌드 (ARM64) GHCR push (tag: git-sha 앞 7자리) |ArgoCD Image Updater .. 2026. 6. 11. [Seatflow] 02. Gradle 멀티모듈 구조와 서비스 설정 Intro1편에서 모노레포를 선택한 이유를 설명했다. 이번 편에서는 실제로 어떻게 구성했는지를 다룬다.Gradle 멀티모듈이 어떻게 동작하는지, 공통 설정이 각 서비스에 어떻게 전달되는지, 그리고 각 서비스의 application.yml을 어떻게 잡았는지까지...Gradle 멀티모듈 동작 원리Gradle 멀티모듈은 하나의 루트 프로젝트 아래 여러 서브 모듈을 두는 구조다. 루트의 settings.gradle.kts가 어떤 모듈이 있는지 선언하고, build.gradle.kts가 공통 설정을 담당한다.seatflow-msa/ ← 루트 프로젝트├── settings.gradle.kts ← 모듈 선언├── build.gradle.kts .. 2026. 5. 31. [Mini-Broker] 06. 벤치마크 측정 Intro5편까지 mini-broker의 핵심 기능을 모두 구현했다. append-only log, sparse index, NIO TCP 서버, Producer/Consumer 클라이언트, 파티션, 컨슈머 그룹.이제 궁금한 건 하나다. 얼마나 빠를까?그냥 빠른지 느린지가 아니라, Apache Kafka와 비교했을 때 어느 정도인지. 그래서 JMH(Java Microbenchmark Harness)로 벤치마크를 작성했다.그런데 첫 번째 시도는 완전히 틀린 비교였다. 숫자는 나왔지만 의미가 없었다. 이 글은 그 실수와 수정, 그리고 최종 결과를 기록한다.첫 번째 시도 - 틀린 비교처음 작성한 벤치마크는 두 가지였다.AppendBenchmark — LogSegment.append() 직접 호출:@Benchm.. 2026. 5. 29. [Mini-Broker] 05. 파티션과 컨슈머 그룹, Kafka가 병렬 처리를 하는 방법 Intro4편까지 만든 브로커는 토픽 하나 = 파일 하나 구조였다. Producer가 메시지를 보내면 하나의 파일에 순서대로 쌓이고, Consumer가 처음부터 읽어오는 단순한 구조.근데 이 구조에는 한계가 있다.파티션이 하나뿐이면 Producer가 아무리 많아도 결국 하나의 파일에 순차적으로 써야 한다. 병렬 처리가 불가능하다. Consumer도 마찬가지다. 여러 Consumer가 같은 토픽을 읽으면 중복이 생긴다. "어디까지 읽었는지"를 추적하는 장치가 없기 때문이다.5편에서는 두 가지를 구현한다.파티션 — 토픽을 여러 파일로 나눠서 병렬 처리 가능하게컨슈머 그룹 — 각 파티션을 누가 담당하고, 어디까지 읽었는지 관리파티션이란?하드디스크 파티션이랑 비슷한 개념이다. 하나의 디스크를 여러 구역으로 나누.. 2026. 5. 26. [Mini-Broker] 04. Consumer 구현, sparse index 사용 Intro3편에서 Producer가 브로커에 메시지를 보내고, 브로커가 파일에 저장하는 흐름을 만들었다.근데 저장만 하고 꺼내오지 못하면 반쪽짜리다. 4편에서는 Consumer를 구현한다.Consumer가 브로커에 "orders 토픽의 offset 0부터 줘" 라고 요청하면, 브로커가 2편에서 만든 IndexReader.findPosition() 으로 빠르게 찾아서 응답하는 흐름이다. 2편의 sparse index가 여기서 진짜로 쓰인다.프로토콜 확장3편까지는 Producer 요청만 있었다. Consumer가 추가되면서 브로커가 두 종류의 요청을 구분해야 한다.request type 바이트 추가0x01 → PRODUCE (메시지 저장)0x02 → FETCH (메시지 조회)모든 요청 맨 앞에 1바이트 .. 2026. 5. 21. [Mini-Broker] 03. NIO Selector로 TCP 서버 직접 만들기 Intro1편에서 append-only 로그를, 2편에서 sparse index를 만들었다. 파일 I/O는 완성됐다.근데 지금까지 만든 건 "혼자 쓰는 파일 시스템"에 가깝다. 실제 브로커라면 Producer가 네트워크로 메시지를 보내야 한다.3편에서는 두 가지를 구현한다.NIO Selector 기반 TCP 서버 (BrokerServer)브로커에 메시지를 보내는 클라이언트 (ProducerClient)그리고 실제로 메시지를 전송해서 orders.log 파일에 저장되는 전체 흐름을 동작시킨다.왜 NIO Selector??Java에서 TCP 서버를 만드는 방법은 크게 두 가지다.전통적인 방식 — ServerSocket + 스레드while (true) { Socket client = serverSocke.. 2026. 5. 15. 이전 1 2 3 4 ··· 11 다음