1.Lettuce 라이브러리 내부 구성에 대한 이해와 Connection is already closed 로그 발생 원인 분석 [ 레디스 클러스터 환경 ]일반적으로 운영 환경에서는 레디스 클러스터를 사용한다. 클러스터 구조를 사용하면 데이터가 여러 서버에 쪼개져 관리된다. 키마다 슬롯 번호(0~16383)가 계산되고, 슬롯을 담당하는 서버가 정해져 있다. 그리고 각 마스터마다 복제본을 두어 마스터에 장애가 생기면 복제본을 승격시킨다. 참고로 클러스터는 이 페일오버를 자체적으로 처리하기 때문에 센티넬 구조와는 별개이다. 이 그림에서 가장 중요한 것은, 애플리케이션 서버가 마스터 노드와 실제적인 연결을 맺어야 한다는 것이다. 만약 마스터가 N개인 레디스 클러스터와 M개의 애플리케이션 서버를 구동하는 환경이..
1. 멀티 코어 기반의 처리량 극대화를 위한 Fork/Join 프레임워크[ 하드웨어의 발전과 기존 방식의 한계 ]Fork/Join 프레임워크를 이해하려면 하드웨어의 발전에 대해서도 이해할 필요가 있다. 초기의 하드웨어는 1개의 CPU 안에 1개의 코어만 담겨있는 단일 코어 구조였다. 따라서 해당 코어의 처리 성능을 높이는 사실상 유일한 방법은 클럭 속도를 올리는 것이었다.하지만 2000년대 단일 코어 클럭 속도 상승이 전력과 발열 한계에 부딪히면서 CPU 제조사들은 클럭 대신 코어 수를 늘리는 방향으로 선회했다. 이제는 여러 개의 코어를 활용할 수 있게 되었고, 멀티 코어 환경에서 컴퓨팅 리소스를 잘 활용하기 위한 도구들이 필요해졌다.2004년, ThreadPoolExecutor와 Executors 같은..
1. 도커 이미지 빌드 최적화를 위한 Layered Jar [ 기존 Fat JAR 방식의 문제와 Layered Jar의 등장 ]기존 Fat JAR 방식의 문제점Layered Jar란 스프링 부트 애플리케이션을 위한 Docker 이미지를 만들 수 있도록 도와주는 도구이다. 표준 jar 스펙은 jar 내부에 jar 파일을 가질 수 없다. 하지만 애플리케이션을 개발하다 보면 많은 외부의 프레임워크와 라이브러리를 사용하게 되어 다른 Jar가 필요해진다. 따라서 스프링 부트는 jar 내부에 다른 jar를 가지면서 java -jar로 실행할 수 있는 "fat jar" 형식을 예전부터 지원해 왔다. 이러한 fat jar 내부 구성은 다음과 같다. 이러한 fat jar를 도커 이미지로 만드는 것은 어렵지 않다. 하지..
1. 우리집 컴퓨터는 어떻게 네이버에 연결될까?[ 인터넷 연결을 위한 네트워크 구성 ]오늘날 우리는 집에서 외부로부터 데이터를 매우 빠르게 주고 받는다. 이것은 어떻게 가능한 것일까? 우리의 홈 네트워크는 어떻게 구성되어 있는지 살펴보도록 하자.우리가 집에서 네이버를 접속하는 상황을 생각해보자. 일반적으로 컴퓨터 끼리 통신을 하기 위해서는 연결이 되어야 한다. 하지만 네이버 서버(컴퓨터)는 춘천과 같은 먼 곳에 있을 것이기에, 우리가 직접 컴퓨터 선을 연결해서 데이터를 받는 것이 불가능하다. 따라서 우리는 통신사의 도움을 받아, 통신사가 연결해둔 선을 활용해서 데이터를 주고 받아야 한다. [ 구리선을 활용한 데이터의 교환 ]컴퓨터가 가진 것은 0과 1의 전기 신호를 이해하는 능력 뿐이다. 따라서 0과 ..
1. 에러 스택 트레이스 최적화를 도와주는 -XX:+OmitStackTraceInFastThrow(사라진 예외 스택 트레이스)[ OmitStackTraceInFastThrow 옵션이란? ]-XX:+OmitStackTraceInFastThrow 옵션은 JVM이 동일한 위치에서 반복해서 예외를 던질 경우, JIT 컴파일러가 스택트레이스와 메시지가 없는 싱글턴 예외로 바꿔 던지는 최적화 기법이다. 이는 JDK 1.4부터 기본 활성화되어 있는 상태이다.예외 생성 비용의 대부분은 fillInStackTrace() 메서드로 콜스택을 훑어 프레임 배열을 만드는 작업이다. 스택이 깊으면 예외 하나당 수 ms씩 소요되곤 하는데, 같은 지점에서 뻔한 예외가 수천 번 반복되면 매번 스택을 뜨는게 낭비이다. 따라서 JIT이 ..