운영 중인 카프카 토픽의 처리량이 증가하면 파티션을 증설하고, 그에 맞춰 컨슈머도 1:1로 함께 늘리는 경우가 많습니다. 이때 컨슈머의 auto.offset.reset 값을 어떻게 설정하느냐에 따라 메시지 유실 여부가 달라지는데, 이를 이번 포스팅에서 정리해보려고 합니다. 1. 파티션과 컨슈머의 관계, 그리고 auto.offset.reset 옵션[ 파티션과 컨슈머의 일반적인 관계 (1:1 균형 상태) ]기본적으로 컨슈머는 파티션과 1대1 관계를 유지해야 한다. 다음의 그림은 파티션 3개와 컨슈머 3대가 1:1로 매핑된 안정적인 운영 상태로, 컨슈머 그룹이 각 파티션을 균등하게 나눠 담당하므로 처리량이 잘 분산되고, 모든 파티션은 이미 자신만의 커밋된 오프셋을 가지고 있다. 만약 컨슈머의 수가 파티션의..
계층형 아키텍처, 헥사고날 아키텍처, 벌티컬 슬라이스 아키텍처 등 다양한 패턴들이 나왔음에도 불구하고, 우리는 아직까지 정착된 아키텍처 패턴을 갖지 못했다. 누군가는 계층형 아키텍처로 개발하면 확장이 어렵다고 말하고, 누군가는 헥사고날 아키텍처로 개발하면 유지보수가 어렵고 공수가 크다고 얘기한다. 이번 포스팅은 여러 가지 아키텍처 패턴을 적용해보면서 느꼈던 각각의 장점을 결합하여 정착한 아키텍처 패턴을 소개한다. 1. 아키텍처 패턴(Architecture Pattern)이란?[ 아키텍처 패턴의 필요성과 개념 ]개발자들은 비즈니스 로직 자체를 작성하는 데에도 많은 시간을 소요하지만, 적지 않게 여러 고민을 하는 시간 역시 존재한다. “클래스 이름을 뭐라고 하지?”, “해당 클래스를 어느 패키지에 위치..
1. 운영 환경을 위한 실용적인 로그 레벨(Practical Log Level)[ 실용적인 로그 레벨(Practical Log Level) ]먼저 개인적으로 서비스를 운영하면서 느꼈던 로그 레벨에 대한 부분을 표로 정리하면 다음과 같다. 사용 환경상황DEBUG개발개발 중에 문제를 추적하고 진단하는 데 사용됨INFO개발, 운영서비스를 운영하고 상황을 이해하는 데 사용됨WARN개발, 운영잠재적인 문제나 주의가 필요한 상황을 알리기 위해 사용됨ERROR개발, 운영시스템 오류나 예외 상황을 기록하기 위해 사용됨 관련 부분을 보다 자세하 살펴보면 다음과 같다. DEBUG개발을 진행하면서 문제를 추적하고 진단하기 위한 개발 및 테스트용 로그주로 로직 검증, 버그 추적, 데이터 흐름 파악을 위해 사용되므로, 운영 ..
1. MCP 서버 프로토콜, SSE에서 Streamable HTTP 방식으로의 대변경 [ MCP 프로토콜과 JSON-RPC 2.0 데이터 포맷 ]이전 포스팅에서 설명하였듯, MCP(Modal Context Protocol)는 Antropic(엔트로픽)이 2024년 11월 26일 처음 제안되어 오늘날 가장 널리 사용되고 인기있는 AI 프로토콜 중 하나이다. MCP와 같은 AI 프로토콜은 다양한 AI 구성 요소 간에 정보를 주고 받기 위해 탄생하게 되었다.구체적으로, MCP는 클라이언트와 서버 간 메시지 교환 형식으로 JSON-RPC 2.0을 사용한다. JSON-RPC 2.0은 RPC(Remote Procedure Call) 방식의 프로토콜 중 하나로, JSON을 메시지 포맷으로 사용하는 경량의 비동기 통신..
1. Gradle 의존성 분석을 통해 NoClassDefFoundError, NoSuchFieldError 오류 트러블슈팅 & 해결하기[ Gradle의 의존성 분석을 위한 Task들 ]Gradle의 dependencies TaskGradle은 의존성 분석을 위한 다양한 Taks들을 제공하는데, 크게 2가지를 활용하게 된다.dependencies모든 의존성과 그 트리 구조를 출력하는 Task전체적인 의존성을 파악하고, 특정 의존성이 '왜 추가되었는지' 확인하는 데 용이함dependencyInsight특정 의존성에 대한 상세 정보를 출력하는 Task특정 의존성에 대해 '왜 이 버전이 결정되었는지' 확인하는 데 용이함 먼저 dependencies Task를 실행해보자. 다음과 같은 명령어로 실행할 수 있다....
