Dockerfile 최적화: Node.js 애플리케이션의 이미지 크기 줄이기
Docker를 활용해 Node.js 애플리케이션을 컨테이너화할 때, 효율적인 Dockerfile을 작성하는 것은 필수이다. 비효율적으로 작성된 Dockerfile은 불필요하게 큰 이미지 크기와 느린 빌드 시간을 초래할 수 있어, 프로젝트 전반에 걸쳐 영향을 미칠 수 있다. 이번 글에서는 Dockerfile을 최적화하여 Node.js 애플리케이션의 이미지 크기를 줄이고 빌드 속도를 높이는 방법을 공유해보려고 한다.
들어가기 앞서
배포를 진행할 때마다 디스크 용량 부족으로 인해 빌드가 실패하는 문제가 발생했다. 디스크 용량을 단순히 늘리는 것도 하나의 해결책이 될 수 있지만, 장기적으로는 최적화를 통해 이 문제를 ...
멀티 코어 환경에서 싱글 코어 환경으로 배포 시 발생한 문제들
들어가기 앞서
배럴아이를 멀티 코어 환경에서 개발한 후, 싱글 코어 사양의 클라우드 환경으로 배포할 때, 이전에 발생하지 않았거나 드물게 발생했던 여러 기능 장애들이 예기치 않게 많이 발생했다. 원인을 찾기 어려웠던 몇 가지 주요 사례와 그 해결 방법을 공유하려고 한다.
멀티 코어 환경에서 싱글 코어 환경으로 배포 시 발생한 문제들
1. 메시지 덮어쓰기 문제로 인한 블록 분기
여러 인접 노드를 통해 동시에 메시지를 수신할 때, 노드는 먼저 받은 블록을 연결하여 노드 간 블록 분기가 발생하였다.
해결 방법: 비트코인과 유사한 긴 체인을 따르는 방법을 도입하여 문제를 해결했다.
2. 동기화 중단 문제
신규...
Github Actions 캐시 전략을 통한 빌드 시간 단축
들어가기 앞서
Github Actions을 통해 배럴아이스캔의 CI/CD 파이프라인을 구축했었다(GitHub Actions 배포 자동화). 그 이후, 눈에 띄는(?) 배포 시간 덕분에 좋은 경험을 공유하려고 한다. 배포 시간을 길게 하는 요소로는 Node.js와 Docker를 사용하는 환경에서 매번 모든 의존성을 새로 설치하고 빌드하는 과정이 있었는데, 이러한 문제를 해결하기 위해 GitHub Actions에서 제공하는 캐시 기능을 활용하여 빌드 시간을 단축하는 방법을 시도해 보았다.
구성
배럴아이스캔 프로젝트에서는 다음과 같은 작업들을 거쳐야 최종 화면을 볼 수 있었다.
E2E 시나리오 테스트
도...
GitHub Actions 배포 자동화 (with 맞이한 에러들)
들어가기 앞서
배럴아이스캔은 도커를 사용해 배포하고 있다. 개발이 완료되면 도커 명령어를 통해 빌드와 배포를 하는데, 배포가 끝나면 5분 가량이 지나버린다. 가끔은 이런 환경이 ‘어? 나 명령어 다 기억하네’ 하고 지나가지만, 바로 해결하지 않으면 안 되는 (봇이 우리 자원을 가져간다거나) 급박한 상황에서는 이게 참 곤욕이다. 그래서 남들이 다하는 CI/CD 자동화를 통해 푸시해놓고 다른 일도 볼 수 있는 시간을 만들어보려고 한다.
구성
배럴아이스캔 파이프라인 구성해야 될 것
배럴아이스캔은 세 가지 요소를 거쳐야 개발 완료된 배럴아이스캔 화면을 볼 수 있다.
E2E 시나리오 테스트
도커를 통한 빌드...
메모리 관리
프로세스와 메모리
메모리 관리
메모리 호출: 언제 새로운 프로세스를 메모리에 둘 것인가?
메모리 배치: 다음에 실행될 프로세스를 메모리 내의 어느 곳에 둘 것인가?
메모리 교체: 메모리가 꽉 찬 상태에서 새로운 프로세스를 메모리에 적재해야 한다면 어떤 프로세스를 제거할 것인가?
그 외: 고정/동적 분할, 고정/유동 적재영역 등
단일 프로그래밍 환경
하나의 프로세스만 메모리를 전용으로 사용하는 것
프로세스는 하나의 연속된 블록으로 메모리에 할당 (연속 메모리 할당)
단일 프로그래밍의 문제점
메모리의 용량을 초과하는 프로세스는 실행 못함
메모리 낭비 심함: 지속적으로 사용되지...
트랜잭션
데이터 동시 접근의 문제
동일 데이터에 다수 사용자의 접근 허용 시 일관성이 훼손
트랜잭션
트랜잭션 개념
데이터베이스를 조작하기 위한 하나의 논리적 단위를 이루는 일련의 연산의 집합
데이터베이스를 사용하여 처리하는 작업을 하나의 묶음으로 인식하여 묶음 단위로 실행되도록 정의한 개념
트랜잭션의 특징
다수의 연산으로 구성된 트랜잭션이 사용자에게 단일작업처럼 다뤄지도록 ACID 특징을 준수
ACID 특성
원자성(atomicity): 하나의 트랜잭션에 포함된 모든 연산은 완전히 수행되거나 전혀 수행되지 않음
일관성(consistency): 특정 트랜잭션이 수행되기 전과...
해싱과 특수 인덱스
정적 해싱
해시
해시: 탐색키에 산술적인 연산을 통해 버킷의 주소를 계산하는 해시 함수를 사용하여 데이터 배분 및 접근하는 기법
버킷: 한 개 이상의 레코드를 저장할 수 있는 저장공간의 단위
단점: 버킷에 레코드가 몰릴 수 있음
정적 해싱의 특싱
버킷의 개수가 고정된 해싱 기법 (사용전 이미 고정)
키 값이 ki인 레코드 삽입: h(ki)를 통하여 ki에 대응하는 버킷 주소를 생성하고 레코드를 해당 버킷에 저장
키 값이 ki인 레코드 검색: h(ki)을 통하여 버킷 주소를 생성하고 버킷에 저장된 레코드 접근
충돌과 동거자
충돌: 서로 다른 두 레코드가 동일한 버킷에 대응
...
24 post articles, 3 pages.