본문 바로가기

분류 전체보기688

AWS VPC를 사용한다면 알아야 할 네트워크 기초 지식 개요AWS를 사용하거나 다른 인프라 구조를 많이 살펴보다 보면 VPC(Virtual Private Cloud) 구조를 자주 접하게 됩니다. 이러한 VPC 구조를 이해하기 위해서는 네트워크 기초 지식이 꽤 많이 필요한데요, 이번 게시글에서는 AWS를 사용할 때 VPC의 개념과 관련 용어들에 대해 자세히 한번 살펴보도록 하겠습니다. 이번 게시글을 완독하고 나면 아래 이미지와 같은 구조를 이해할 수 있습니다.  Amazon VPC(Virtual Private Cloud)란 무엇일까?Amazon VPC는 사용자가 정의하는 AWS 계정 전용의 가상 네트워크입니다. 사용자는 VPC 내에서 IP 주소 범위 선택, 서브넷 생성, 라우팅 테이블 및 네트워크 게이트웨이 구성 등 가상 네트워크 환경을 직접 구성할.. 2024. 4. 24.
select .. for update 대상 유무에 따른 잠금 상태 개요 InnoDB 엔진은 기본적으로 DDL 쿼리를 제외한 모든 데이터 조작 작업에서 테이블 락을 사용하지 않고 레코드 기반의 잠금 방식을 사용합니다. 더 자세히는 레코드 자체보다는 인덱스에 잠금을 설정하여 이루어지며, 테이블에 명시적인 인덱스가 없는 경우에도 내부적으로 생성된 클러스터 인덱스를 통해 잠금이 이루어집니다. 그리고 Repetable-Read 격리 수준에서 InnoDB는 record lock과 gap lock을 결합한 Next-key lock을 활용하여 Phantom Read를 방지합니다. 조건에 부합하는 특정 행을 찾기 위해 인덱스를 스캔하는 과정에서, InnoDB는 해당 인덱스 레코드뿐만 아니라 그 이전 공간에도 잠금을 설정합니다. 따라서 첫 번째 발견된 레코드와 쿼리가 정의한 범위 내의 .. 2024. 4. 11.
Datadog 서버 모니터링 살펴보기 이미지를 클릭하면 큰 화면에서 더욱 자세하게 확인할 수 있습니다. Logs 먼저 가장 기본적인 로그 확인입니다. 좌측 메뉴에서 Logs를 선택하면 Datadog과 연동된 모든 서비스의 로그를 한눈에 볼 수 있습니다. 여기서 원하는 특정 서비스를 선택하여 그 서비스의 로그만을 상세하게 조회할 수도 있습니다. 로그 항목을 클릭하면 해당 로그에 대한 더 자세한 정보를 확인할 수 있습니다. 이때 Trace와 Metrics 기능이 매우 유용한데, 로그가 생성되기까지의 경로와 로그 발생 시점의 CPU 사용량, 메모리 사용량, 디스크 I/O 등의 중요한 메트릭을 상세하게 파악할 수 있습니다(Trace와 Metrics 화면은 아래에서 나올 화면과 동일하기에 아래에서 살펴보겠습니다). APM APM(Application.. 2024. 4. 1.
아키텍처 관점에서 늘어나는 트래픽 대응하기 개요아키텍처의 관점에서 늘어나는 트래픽을 어떻게 대응하면 좋을지에 대해 흐름에 따라 작성했습니다. 피드백은 언제든 환영이며 댓글 남겨주시면 감사하겠습니다. 한대의 인스턴스먼저 가장 간단한 구성입니다. 모든 트래픽이 한 대의 서버를 통해 관리되고 있습니다. 그리고 EC2의 IP가 유동적으로 변경되는 것을 방지하기 위해 Elastic IP를 연결시켜 놓았습니다.그러나 시간이 지나면서 사용자 수가 증가하고, 이에 따라 서버로의 트래픽도 늘어나기 시작했습니다. 이로 인해 EC2 인스턴스의 CPU 사용률이 증가하여 단일 EC2 인스턴스로는 증가하는 트래픽을 처리하는데 한계가 생기기 시작했습니다. 이 시점에서 고려할 수 있는 가장 기본적인 해결 방안은 EC2의 인스턴스 사양을 업그레이드하는 Scale-.. 2024. 3. 24.
내가 쓰는 IntelliJ 유용한 기능들 1. Global Data Sources 인텔리제이를 사용할 때, 각 프로젝트마다 데이터베이스(DB) 연결을 설정해 인텔리제이 내에서 직접 관리할 수 있습니다. 만약 모든 프로젝트에 걸쳐 공통적으로 사용하고 싶은 DB 연결이 있다면, 해당 연결을 Make Global로 설정함으로써 다른 프로젝트를 열어도 해당 DB 연결 설정을 유지할 수 있습니다. 2. Shelve 작업 중인 브렌치에서 다른 브랜치로 전환할 필요가 있을 때, 일반적으로는 git stash를 사용해 변경 사항을 임시로 저장한 후 이동합니다. 하지만 인텔리제이를 사용한다면 이와 유사한 기능인 Shelve를 통해 커밋하지 않은 코드를 임시로 저장할 수 있습니다. 이 기능을 통해 현재의 변경 사항을 인텔리제이 내부에 보관하고, 필요할 때 언제든.. 2024. 3. 20.
ThreadPoolExecutor 동작에 관한 오해 개요 Java에서 스레드풀을 효과적으로 관리할 수 있게 해주는 ThreadPoolExecutor, 그리고 이를 더욱 쉽게 사용할 수 있도록 Spring에서 제공하는 ThreadPoolTaskExecutor의 동작 방식에 관해 제가 그동안 잘못 이해하고 있었던 두 가지의 오해를 정리하고자 글을 작성하게 되었습니다. 내용은 다음과 같습니다. 별도의 설정을 하지 않으면 서버 실행 시에 지정한 스레드 풀 크기만큼 스레드가 자동으로 생성되지 않는다. corePoolSize와 maxPoolSize는 서로 상관없다. 큐의 크기를 지정해주지 않으면 maxPoolSize은 사실상 의미 없는 설정이다. corePoolSize크기 이상의 요청이 들어온다고 해서 maxPoolSize만큼 스레드를 생성하지 않는다. https:.. 2024. 3. 11.
[Kafka] 컨슈머 오프셋 수동으로 커밋하기 개요 메시지 손실을 방지하기 위해 메시지 처리가 문제없이 완료되었을 경우에만 commit을 수행하도록, 컨슈머의 offset commit을 수동으로 설정하는 경우가 여러 존재합니다. 하지만 단순히 auto.offset.commit만 false로 지정하는 경우에는 원하는 방향으로 동작하지 않을 수도 있습니다. 이번 게시글에서는 자동 커밋의 동작 과정과 주의점, 그리고 커밋을 수동으로 제어하기 위한 auto.offset.commit 설정과 ack-mode 설정에 대해 알아보겠습니다. auto.offset.commit Kafka의 컨슈머는 읽은 메시지의 위치를 추적하기 위해 offset을 commit 하는 역할을 담당합니다. 이 offset은 Kafka의 내부 토픽인 __consumer_offsets에 저장되.. 2024. 3. 6.
외부 API를 연동할 때 고려하면 좋은 점들 개요 최근 프로젝트에서 외부 API를 연동하는 일이 굉장히 많았었는데, 작업하면서 얻은 다양한 경험과 지식을 공유하고자 작성하게 되었습니다. 피드백은 언제든 환영이며 댓글 남겨주시면 감사하겠습니다. 1. I/O와 트랜잭션을 분리해라 트랜잭션은 데이터베이스와 통신하기 위해 커넥션을 필요로 한다. 하지만 이 커넥션을 생성하는 데는 꽤 많은 비용이 들며, 대부분 이를 절약하기 위해 웹 애플리케이션 서버(WAS)는 실행 시 미리 일정 수의 커넥션 객체를 만들어 풀에 저장한다. 그리고 클라이언트의 요청이 발생하면 이 풀에서 이미 생성되어 있는 커넥션 객체를 사용하는 방식을 이용한다. 그러나 커넥션 풀의 크기는 제한되어 있기 때문에, 동시에 수많은 요청들이 커넥션 풀의 개수 이상으로 오게 된다면, 커넥션을 획득하지.. 2024. 2. 24.
[Kafka] 프로듀서 멱등성 보장하기 개요 멱등성은 동일한 작업을 여러 번 수행하더라도 동일한 결과가 나타나는 특성을 의미합니다. 따라서 멱등성을 지닌 프로듀서는 같은 데이터를 여러 번 전송하더라도 해당 데이터가 카프카 클러스터에 단 한 번만 저장되도록 보장합니다. 그렇다면 프로듀서에 어떻게 멱등성을 적용하고, 이를 통해 데이터의 중복 저장 없이 정확히 한 번만 저장되도록 보장할 수 있을까요? 이번 글에서는 프로듀서에 멱등성을 보장하도록 적용하는 방법에 대해 상세하게 알아보도록 하겠습니다. 메시지 전송 방식 Producer와 Broker의 설정 및 구성에 따라 Kafka에서는 메시지 전달 보장 수준을 아래와 같이 세 가지 방식으로 구분합니다. 최대 한 번 (At most once): 메시지가 한 번만 전송되며, 재전송은 발생하지 않는다. 그.. 2024. 2. 1.