본문 바로가기

전체 글

(24)
CPU 스케줄러 보호되어 있는 글입니다.
Context Switching 보호되어 있는 글입니다.
PCB 자료구조 보호되어 있는 글입니다.
@EventListener는 뭐에 쓰는 물건인고? 간단 설명: 도메인 간 의존성을 약화하기 위해 Event 객체를 전달하는 방식으로 구조를 짤 때, ApplicationListener, ApplicationEvent를 상속하지 않고도 이벤트를 수신하고 처리하는 handler 메서드를 만들 수 있다 도메인 간 의존성이 강하고, 한 클래스, 코드 영역에 역할 책임이 혼재되어 있다면 유지 보수가 어려울 것이다 (솔직히 아직 그정도로 복잡한 코드를 짤 일은 없었긴 하지만...그냥 그렇다고 하나보다 하는 중. 나중엔 실감할테니 공부해 두자) 그래서 도메인 간 의존성을 줄이기 위해, Event를 사용해서 정보를 전달하고 책임을 나누는 것이다 하단에 링크를 걸어 둔 블로그에 설명이 정말 잘 되어 있다. 주문을 담당하는 코드에 결제 로직이 혼재 되어 있는건 의존성이 ..
Fiber는 뭐고 thread와의 차이점이 뭘까 (feat: Java의 Project Loom) 간단한 설명: 초경량 스레드인데, 스레드와 달리 협력적인 멀티태스킹을 한다 OS의 스레드가 뭔지는 알고 있으니 설명은 넘어가고 문제점부터 바로 집어 보자면 무겁고 자원의 관점에서 비싸다(프로세스보다 경량화된게 스레드인데, 이걸로도 부족한가 보다 개발자들은) 스레드마다 각 고유의 스택 영역을 차지하고 있어 너무 많은 스레드를 생성하게 되면 메모리 부족 에러가 발생할 수 있다. 그리고 IO 연산이 잦다면 CPU가 놀고 있는 idle현상이 빈번해져 비효율적이다 (network, disc IO 등) IO 뿐 아니라 임계영역에 대한 접근이나, latch같은 concurrent utils에 의해서도 block이 발생할 수 있다. 멀티스레딩의 대안으로 Reactive API가 나오긴 했지만, 스레드를 넘나들며 요청이..
Apache Kafka의 성능: append-only and zero copy 아파치 카프카는 어떻게 대량의 데이터를 효율적으로 전송할까 카프카의 내부 아키텍처 동작 방식을 살펴보면 2가지 포인트가 존재한다 1. sequentail I/O 카프카는 append-only 방식으로 파일의 맨 끝에다 immutable한 새 record를 추가한다 카프카는 append만 가능한 순차적인 자료구조인 log를 기본 아키텍처로 사용하고 있다. 디스크에 random access 방식으로 data retrieve하는 것이 아닌, sequential 하게 데이터를 저장하여, conumser가 해당 record의 immutable한 offset 번호를 따라 데이터를 읽고 주기적으로 commit하여 어디까지 읽었는지 기록한다 2. zero-copy 만약 zero copy를 사용하지 않는다면 , 2번의 ..
장애? docker 컨테이너에서 block I/O가 너무 심하다 AWS ec2 인스턴스로 t3a.small에 docker container를 2개 띄웠다. elasticsearch와 kibana를 elasticsearch와 kibana를 구동 시키니 둘이 합해서 거의 80%에 달하는 메모리를 점유하고 있었다. 여기에 spring boot 이미지를 컨테이너까지 구동시키니 터미널에서 ec2 접속이 먹통이 되어서 부랴부랴 ec2 인스턴스를 종료시킬 수 밖에 없었다. 어제 장애 현상 발견하고 오늘 확인을 해 보니 아무래도 컨테이너가 점유중인 메모리의 한계에 다다라 그런 것이라 생각했다. 애초에 2gib 뿐인 인스턴스이기도 하고... 그래서 elasticsearch와 kibana만 ec2에 띄우고, spring boot는 로컬 노트북에서 컨테이너로 동작시키기로 했다. spri..
docker run command 시 컨테이너의 환경 변수에 값 전달하기 docker run 커맨드 시, 파라미터의 순서가 정말 중요하다. 환경 변수를 설정하는 -e 파라미터가 실행할 도커 이미지 앞에 와야 하는듯 하다. + 컨테이너와 연결할 상대 컨테이너의 host 주소를 줄 때, container 실행 시 정의한 이름을 사용한다 ex) docker run --name kafka-to-elasticsearch --net elastic -p 9092:9092 -p 443:443 -p 6667:6667 -e "ELASTICSEARCH_HOSTS=es01-test" kafka-twitch 참고 링크 https://stackoverflow.com/questions/50035024/passing-environment-variables-with-docker-to-spring-boot-..