Article 29

HTTP/2.0 Stream Blocking & 흐름제어

HTTP/2.0의 흐름제어는 뭘까?흐름 제어는 전송계층(TCP)에서 수행하는 것 아닌가?한 스트림이 커넥션을 독차지하지 않도록, 연결에 대한 전체 스트림의 리소스 배분을 수행해야 한다.이것이 HTTP/2.0의 흐름제어이다. HTTP/2.0 흐름제어와 TCP 흐름제어의 차이점항목TCP 흐름 제어HTTP/2.0 흐름 제어보호 대상- 연결 전체 (TCP 수신 버퍼)- 스트림 별- 연결 전체제어 단위- 바이트 (시퀀스 번호)- 프레임 페이로드 (바이트)주요 목적- 수신 측의 소켓 버퍼가 넘치지 않도록 전송 속도 억제- 연결 안정성 유지- 멀티플렉싱되는 여러 스트림 간 자원 경쟁 완화- 특정 스트림 일시적 쓰로틀링/우선순위 조절윈도우 크기 표기- 16-bit Window Size 필드- WINDOW_UPDATE ..

HTTP/2.0 - HTTP 멀티플렉싱, HoL Blocking, 그리고 HTTP/3.0의 등장 배경

HTTP/2.0의 등장 배경HTTP/1.1은 그 구현의 단순성과 명료함, 접근성으로 많은 사랑을 받아왔고, 받고 있다.하지만, 하나의 커넥션으로 여러 요청/응답을 처리하기 어렵고, 응답을 받아야만 그 다음 요청을 보낼 수 있는 것은 분명한 아쉬움으로 남아있었다.그리하여, 다양한 곳에서 속도를 개선하기 위한 다양한 방법의 연구가 진행되었다.최종적으로, 구글의 "SPDY" 가 HTTP/2.0의 표준으로 결정되었다.하나의 TCP 커넥션에 여러 요청을 동시에 보내, 레이턴시를 줄이는 것 - HTTP 멀티플렉싱RTT가 20ms인 경우, 12.34% 성능 개선 효과를 보았다.RTT가 80ms인 경우, 23.85% 성능 개선 효과를 보았다.RTT가 200ms인 경우, 26.79% 성능 개선 효과를 보았다.HTTP/2..

스택과 힙, 힙의 단편화

최근 즐겨보는 유튜브 채널에서 재밌는 면접 질문을 보았다.웹 백엔드 개발자를 위한 주제는 아닌것 같긴 한데, 주제가 상당히 흥미롭고 재밌어서 작성해본다. GC에 대한 이해도를 높힐 수 있어 좋은 시간이었다.스택과 힙의 차이멀티스레딩 환경에서의 스택과 힙의 차이스택해당 스레드용메모리의 수명 파악 가능코드의 깊이로지나치게 깊은 스택은, 코드의 가독성을 떨어트린다.힙멀티스레드 환경에서의 전역변수 역할고수준 언어에서, 스택과 힙은 반드시 필요하다.메모리 단편화네이티브 메모리 할당의 문제점malloc은 느리다.시스템 콜이 필요함이는 nio의 native memory 할당에도 같이 적용된다.따라서, 메모리 할당과 해제에 신중해져야 한다.할당받은 native 메모리를, 직접 쪼개가며 재사용해야 할 수도 있다!메모리를..

메모리 압축(Memory Compaction), 그리고 Garbage Collector

우리는 단편화 문제에서 메모리 압축이 필요한 이유를 알 수 있었다. 지금부터 메모리 압축에 대해서 알아보자.메모리 압축 방식가장 기본적이고 간단한 메모리 압축은 두가지 방식으로 나뉘어진다.Sliding살아있는 객체들을 전부 한쪽 끝으로 몰아넣는다.장점추가 메모리의 요구가 없다.단점전체 메모리가 크게 이동해야 하기 때문에, stop-the-world 시간이 길어진다.Copying Compaction동작 방식공간을 절반으로 나눈다.1회 압축시마다, 데이터를 반대쪽으로 이동시킨다.이를 압축마다 반복한다.장점구현이 단순하다.Bump Allocator 연산을 사용할 수 있기 때문에, Stop-the-world 시간이 빠르다.sizeof(object) 연산을 이용해 다음 빈 포인터를 O(1)만에 찾는다.메모리의 이..

메모리 단편화와 페이징

메모리 단편화를 해결하는 방법, 페이징에 대해 알아보자.페이징페이징이란, 가상 메모리 공간의 메모리 관리 기법을 의미한다.페이징의 설계 방식메모리를 페이지 단위로 잘라서 사용한다.물리 메모리의 크기 단위를 프레임이라고 할 때, 가상 메모리를 위한 "페이지"라는 단위를 만들어하나의 페이지를 하나의 프레임과 1:1 크기로 매핑하는 것을 의미한다.프로세스는 자신이 할당받은 가상 주소 공간 내에서, 가상 메모리를 페이지 단위로 사용하게 된다.가상 주소 공간 관리 기법이다.페이징 자체에 가상 주소 공간 개념이 포함된다. 고정된 메모리 풀 할당 방식과 혼동하지 말자.페이징의 효과물리 메모리의 외부 단편화 문제를 해결한다.프로세스가 사용하는 메모리 계층과 할당되는 물리 메모리 계층을 분리한다.페이지의 크기가 줄어들수..

메모리 할당 문제, 그리고 메모리 단편화

메모리 할당 전략현재 다음과 같이 메모리가 할당되어 있다고 가정하자.만약 여기서, 어떤 프로세스가 세 칸의 메모리에 대한 할당을 요청했을 때, OS는 해당 메모리를 위한 빈 공간을 어떻게 지정할 수 있을까?우리는 이 상황에서 3가지 전략 중 하나를 선택할 수 있다.지금부터 각각 어떠한 전략인지를 알아보자.First-fitBest-fitWorst-fitFirst-fit순서대로 순회하다가, 가장 먼저 만나는 할당가능한 빈 공간을 지정한다.운이 없으면, 전체 메모리를 전부 순회해야 한다.여기서는 가장 먼저 만나는 빈 공간인 4칸을 선택한다.Best-fit모든 메모리 블록 중에서, 요청된 크기를 수용할 수 있는 블록 중 가장 작은 블록을 선택한다.항상 전체 메모리를 전부 순회해야 한다.여기서는 필요한 크기와 정..

Java I/O vs Java NIO - 왜 NIO는 단일 버퍼 모델을 채택했을까?

글의 목적JAVA I/O 와 Java NIO는 목적 자체가 다르고, 상황에 맞게 써야 한다는데, “그럼 대체 뭐가 달라서, 어떤 기준으로 사용해야 하는가?”에 대한 탐구를 수행한 과정을 기록한다.Java NIO 버퍼 입출력 메소드 - flip, clear, compact기본 개념 - ByteBuffer 동작 방식쓰기 모드 (Writing mode)데이터를 버퍼에 쓸 때 사용한다.position: 현재 쓸 위치limit: 쓰기 가능한 최대 범위(일반적으로 버퍼의 capacity)로 설정된다.읽기 모드 (Reading mode)버퍼에 쓰여진 데이터를 읽어올 때 사용한다.position: 현재 읽을 위치limit: 읽기 가능한 최대 범위(일반적으로 write 모드때의 마지막 position)로 설정된다.쓰기→..

도메인 이벤트와 State Machine 시스템 설계 - 강아지 키우기

의인화(Anthropomorphism)란?소프트웨어 객체를 능동적이고 자율적인 존재로 설계하는 원칙.객체를 마치 사람처럼 직접 행동하는 “자아를 가진 존재”로 다루는 것을 의미한다.- Rebecca Wirfs-Brock - 도메인 이벤트, 상태 머신, 이벤트 소싱, CQRS, 그리고 DDD(도메인 주도 설계)는 서로 유기적으로 결합되어 응집도 높은 설계를 만든다. 본 글에서는 강아지 키우기 예제를 통해 이러한 개념들을 이해해보고, 실제 구현 시 고려해야 할 디테일과 도전 과제들을 이야기하도록 하겠다.예제 - 강아지 키우기우리가 설계해야 할 소프트웨어 모델은, 단순 CRUD 를 넘어 좀 더 능동적으로 스스로 행동하는 객체를 만들어야 할 수 있다. 지금부터 “강아지” 라는 객체를 만들어, 소프트웨어로서 “강..

도메인 서비스 - DDD의 적용, JPA 엔티티와의 비교

도메인 서비스란?서로 다른 애그리거트간, 협력을 중재하는 객체이다.보통 싱글톤으로, Pure Fabrication 형태를 띄며 정의된다.도메인 서비스의 개념 자체는 매우 단순하다.우리가 쉽게 만들어 쓰는, 애플리케이션 서비스와 별 차이가 없어 보인다도메인 서비스, 그럼 스프링 빈으로 사용해도 되나?가능하다.스프링의 빈(Bean) 관리 메커니즘을 활용하여 싱글톤 객체로 등록해두면 편리하게 재사용할 수 있다.다만 애플리케이션 레이어(서비스 레이어)와 명확히 구분할 필요가 있다.단순히 스프링 빈으로 등록했다고 해서 인프라 계층 로직을 무조건 포함해야 하는 것은 아니다.그럼 도메인 서비스가 스프링 컨테이너에 의해 생성되는데, 인프라 로직에 종속된거 아닌가?실제 인프라 로직은, 선언한 빈을 통해 바이트 코드로 구..

DDD 트릴레마 - 도메인 모델 완전성 vs 도메인 모델 순수성

다음 글은 블라디미르 코리코프의 DDD 트릴레마를 번역하고, 부족한 내용을 보충하여 작성한 글입니다.기초 지식 - 기능 요구사항 vs 비기능 요구사항기능 요구사항비즈니스 로직비기능 요구사항인프라 특성인프라 수준의 구현으로 해결해야 하는 요구사항성능, 품질, etc.DDD를 왜 쓰는가? → 소프트웨어 핵심에서 복잡성을 해결하는 것 DDD에는 흥미로운 트릴레마가 하나 존재한다.지금부터 예시를 통해 알아보도록 하자.예시: 사용자 관리 시스템사용자 도메인사용자 도메인의 컨트롤러이메일 검증 기능 구현 - 이메일 중복 체크지금부터 새로운 비즈니스 로직을 추가해보겠다. 이메일은 유일해야 하며, 사용자 이메일을 변경하기 전에 시스템은 새 이메일이 이미 사용 중인지 확인해야 한다고 해보자.도메인 모델의 순수성 챙기기위 ..