본문 바로가기
RabbitMQ 4.3.0 이후 버전 Spring Cloud Bus 큐 생성 실패 트러블슈팅 요약항목 내용발생일2026-05-27환경Spring Cloud 기반 MSA / Podman영향 범위Config Server, Gateway (Spring Cloud Bus 사용 전체)근본 원인RabbitMQ 4.3.0에서 queue_master_locator deprecated feature 기본 차단정상 버전RabbitMQ 4.2.5 이하문제 버전RabbitMQ 4.3.0해결 방법rabbitmq.conf에 deprecated_features.permit.queue_master_locator = true 추가증상Config Server 또는 Spring Cloud Gateway 기동 시 RabbitMQ 채널 에러 반복 발생Channel error on connection → queue.declare no.. 2026. 5. 27.
ClickHouse 이중화(HA) 구성 가이드 - 서버 분리 - podman ver 개요SigNoz 모니터링 시스템의 ClickHouse 데이터베이스 이중화 구축시스템 구성구성도서버구분서버IP 주소역할컨테이너Node 1podman-test1192.168.3.125Primary + ZooKeeperclickhouse-1, zookeeper-1, zookeeper-3Node 2podman-test2192.168.3.239Secondaryclickhouse-2, zookeeper-2버전signoz:v0.91.0clickhouse-server:24.1.2-alpinesignoz-otel-collector:v0.128.2zookeeper:3.7.1ClickHouse 클러스터 설정클러스터명: cluster샤드 수: 1개복제본 수: 2개 (각 서버당 1개)엔진: ReplicatedMergeTree복.. 2025. 10. 15.
Spring Boot 가상 스레드와 Tomcat 스레드 풀 설정 영향 분석 결과 목적: Spring Boot에서 가상 스레드(Virtual Threads) 활성화가 Tomcat 스레드 풀 설정에 미치는 영향을 실증적으로 분석가설: 가상 스레드 활성화 시에도 Tomcat 스레드 풀 설정이 여전히 필요하고 성능에 영향을 미칠 것결론: 가상 스레드는 Tomcat 스레드 풀 제한을 완전히 우회함, 가상 스레드 true 지정 시 tomcat 설정이 무효화됨실험 환경시스템 정보Java: OpenJDK 21.0.2Spring Boot: 3.4.3서버: 내장 Tomcat 10.1.36테스트 gateway, engine : 192.168.2.13:8751, 192.168.2.13:8731테스트 설정engine-mvc-dev.yamlserver: shutdown: graceful tomcat: .. 2025. 9. 10.
8주차 (16~18장) 16장 플로우16.1 플로우는 연속적인 값의 스트림을 모델링한다16.1.1 플로우를 사용하면 배출되자마자 원소를 처리할 수 있다일시 중단 함수의 한계:// 일시 중단 함수는 단일 값만 반환 가능suspend fun createValues(): List { return buildList { add(1) delay(1.seconds) add(2) delay(1.seconds) add(3) delay(1.seconds) }}// → 3초 후에 모든 값이 한번에 출력됨플로우의 장점:// 플로우는 값이 계산되자마자 즉시 처리 가능fun createValues(): Flow { return flow { emit(.. 2025. 9. 1.
7주차(14,15) 14장 코루틴14.4-14.6 코루틴왜 코루틴이 필요할까?문제: 블로킹 코드의 한계*// 기존 방식 - 스레드를 블록시킴* fun showUserInfo(credentials: Credentials) { val userID = login(credentials) *// 네트워크 요청 (2초 대기)* val userData = loadUserData(userID) *// 네트워크 요청 (3초 대기)* showData(userData) *// 화면에 표시*}*// 문제점:// 1. 총 5초 동안 스레드가 멈춤// 2. UI가 있다면 화면이 얼어버림// 3. 서버라면 다른 요청을 처리할 수 없음*해결: suspend 함수 사용*// 코루틴 방.. 2025. 9. 1.
6주차 (13장) 13.1 API에서 DSL로목표: 깔끔한 API 만들기깔끔한 API의 2가지 조건*// 1. 명확성 - 무슨 일이 일어날지 명확하게 이해 가능*val user = User.Builder() .name("김철수") .email("chulsu@email.com") .build()*// 2. 간결성 - 불필요한 구문 최소화*val user = user { name = "김철수" email = "chulsu@email.com"}코틀린의 간결한 구문들Before vs After 비교*// 일반 구문 (번잡함)*StringUtil.capitalize(s)1.to("one")set.add(2)map.get("key")file.use({ f -> f.read() })val m = mutabl.. 2025. 9. 1.
5주차(11~12장) 11장 제네릭스타입을 나중에 지정할 수 있게 해주는 문법코드 재사용 가능(다양한 타입에도 동작함), 타입 안정성 확보(엉뚱한 타입 못넣음)List은 문자열만 담는 리스트List는 숫자만 담는 리스트// 일반 - String만 담을 수 있음val stringBox: List = listOf("사과", "바나나")// 제네릭 - 어떤 타입이든 담을 수 있음fun makeBox(): List = listOf()11.1 타입 인자를 받는 타입 만들기: 제네릭 타입 파라미터11.1 타입 인자를 받는 타입 만들기기본 개념*// 이렇게 쓰는 것들이 제네릭!*val numbers: List = listOf(1, 2, 3)val names: List = listOf("철수", "영희")val pairs: Map = m.. 2025. 9. 1.
4주차(9~10장) 9장 연산자 오버로딩과 다른 관례(convention)관례(Convention)란?특정 함수 이름과 언어 기능을 연결하는 약속9.1 산술 연산자 오버로딩기본 개념연산자를 오버로딩하는 함수 앞에는 반드시 operator가 있어야 함→ 실수로 관례에서 사용하는 함수 이름을 사용하는 경우를 막아줌data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) }}val p1 = Point(10, 20)val p2 = Point(30, 40)val p3 = p1 + p2 *// Point(40, 60) - plus 함수 호출됨!*지원.. 2025. 9. 1.
3주차 (6~8장) 6장 컬렉션과 시퀀스6.1 컬렉션에 대한 함수형 API6.1.1 filter와 mapval numbers = listOf(1, 2, 3, 4, 5)// filter: 조건에 맞는 것만 골라내기val evenNumbers = numbers.filter { it % 2 == 0 } // [2, 4]// map: 각 원소를 다른 형태로 변환val squares = numbers.map { it * it } // [1, 4, 9, 16, 25]6.1.2 reduce와 fold : 값들을 하나로 합치기val numbers = listOf(1, 2, 3, 4)// reduce: 첫 번째 값부터 시작해서 차례로 합치기val sum = numbers.reduce { acc, element -> acc + eleme.. 2025. 9. 1.