[CS] RabbitMQ vs Kafka

RabbitMQ vs KafkaMSA 환경에서는 서비스 간 결합도를 낮추고 비동기 통신을 구현하기 위해 메시지 브로커를 사용할 수 있다. 대표적인 기술로 RabbitMQ와 Apache Kafka가 있다. 두 기술 모두 Producer가 메시지를 발행하고 Consumer가 이를 비동기로 처리하도록 만들 수 있기 때문에 비슷해 보이지 만, 출발점과 핵심 설계 철학이 다르다.간단하게 정리하면 다음과 같다.RabbitMQ는 메시지를 전달하고 처리하는 Message Broker에서 출발했고, Kafka는 이벤트를 저장하고 다시 읽을 수 있는 Distributed Log에서 출발했다. 최근에는 RabbitMQ에 Stream이 추가되고 Kafka에도 Queue Semantic이 추가되면서 기능적으로 겹치는 부분이 많..

[동시성] 동시 요청에서 ACTIVE 데이터는 어떻게 하나만 보장할까?

AI 위험 분석에 사용할 프롬프트를 DB에서 버전별로 관리하는 기능을 구현했다.프롬프트를 새로 등록하면 기존 ACTIVE 프롬프트를 RETIRED 상태로 변경하고, 새로운 버전을 ACTIVE 상태로 저장하는 방식이다. 예를 들어 v1이 활성화된 상태에서 새로운 프롬프트를 등록하면 다음과 같이 변경된다.등록 전v1 ACTIVE등록 후v1 RETIREDv2 ACTIVE 이 구조에서 지켜야 할 중요한 조건이 하나 있었다.동일한 prompt_key에는 ACTIVE 상태의 프롬프트가 항상 하나만 존재해야 한다.단일 요청에서는 문제가 없었지만, 동일한 프롬프트에 대한 등록 요청이 동시에 들어오면 이 조건이 깨질 가능성이 있었다.1. 동시 요청에서 Race Condition 재현하기기존 프롬프트 등록 로직은 크게 다..

[CS] CPU 스케줄링과 TCP/UDP 차이

1. CPU 스케줄링1. CPU 스케줄링이란?CPU 스케줄링은 여러 프로세스가 CPU를 사용하려고 할 때 어떤 프로세스에게 CPU를 할당할지 운영체제가 결정하는 과정이다. 하나의 CPU 코어는 한 순간에 하나의 작업을 실행할 수 있다. 따라서 여러 프로세스가 동시에 실행 가능한 상태라면 운영체제는 CPU를 효율적으로 사용하기 위해 어떤 프로세스를 먼저 실행할지 결정해야한다.멀티코어 환경에서는 여러 프로세스가 실제로 동시에 실행될 수 있지만 각 CPU 코어에 어떤 작업을 할당할지는 여전히 스케줄링이 필요하다.2. CPU 스케줄링이 필요한 이유CPU를 사용하려는 프로세스는 여러 개일 수 있지만 CPU라는 자원은 한정되어 있다.만약 하나의 프로세스가 CPU를 오랫동안 독점한다면 다른 프로세스는 실행되지 못하고..

[CS] GC와 Spring MVC 요청 처리 과정

1. Java Garbage Collection1. Garbage Collection이란?Java에서 객체는 주로 Heap 영역에 생성된다.User user = new User(); new User()로 생성된 객체는 Heap 영역에 저장되고 변수 user는 해당 객체를 참조한다.프로그램이 실행되다 보면 더 이상 사용하지 않는 객체가 발생한다.User user = new User();user = null; 기존에 생성된 User 객체를 참조하는 곳이 없다면 해당 객체는 더 이상 사용할 수 없는 객체가 된다. Garbage Collection(GC) 은 이처럼 더 이상 참조되지 않아 사용할 수 없는 객체를 찾아 Heap 메모리에서 제거하여 메모리를 자동으로 관리하는 기능. 자바에서는 GC가 작업을 수행하기..

[Review] AI 분석을 비동기로 처리하기 : Spring Event부터 다중 인스턴스까지

이번 프로젝트에서는 사용자가 생성한 투자 전략과 백테스트 결과를 LLM에 전달하고, 위험 등급과 위험 요인을 분석하는 기능을 구현했다. AI 분석은 일반적인 DB 조회와 달리 LLM API 호출 시간이 필요하다. 따라서 사용자가 분석을 요청할 때 LLM 응답이 끝날 때까지 HTTP 요청을 유지하는 대신, 분석 요청과 실제 AI 처리를 분리하는 비동기 구조를 적용했다.1. 처음 설계한 AI 분석 흐름AI 분석 요청이 들어오면 먼저 PostgreSQL에 분석 데이터를 PENDING 상태로 저장한다.POST /api/v1/ai/analyses │ ▼전략 / 백테스트 검증 │ ▼AiRiskAnalysis 저장status = PENDING │ ..

[CS] DB JOIN과 이진 탐색

1. INNER JOIN과 LEFT OUTER JOIN1. JOIN이란?관계형 데이터베이스에서 두 개 이상의 테이블을 특정 칼럼을 기준으로 연결하여 데이터를 조회하는 방법.예를 들어 회원 정보를 저장하는 users 테이블과 주문 정보를 저장하는 orders 테이블이 있다고 가정하자.usersidname1은콩이2모리3티모ordersiduser_idproduct1011키보드1021마우스1032모니터 orders.user_id는 주문을 생성한 사용자의 users.id를 참조한다고 가정한다.2. INNER JOIN두 테이블에서 JOIN 조건을 만족하는 데이터만 조회한다.SELECT u.id, u.name, o.product FROM users u INNER JOIN orders o ON u.id = o...

[Plus] Let’s Encrypt 인증서를 적용하면 HTTPS는 어떻게 동작할까?

1. HTTPS를 적용하며 생긴 궁금증프로젝트에서 프론트엔드는 Vercel에 배포하고, Spring Boot 백엔드는 AWS EC2에 배포했다. AWS 서버에는 Nginx를 설치하고 Let’s Encrypt에서 인증서를 발급받아 HTTPS를 적용했다. HTTPS의 동작 과정을 공부하다 보니 다음과 같은 궁금증이 생겼다.TLS Handshake 과정에서 클라이언트가 지원하는 TLS 버전과 암호화 알고리즘을 서버에 전달한다는데, 프론트엔드에서는 이런 정보를 설정한 적이 없다. 그렇다면 클라이언트는 이를 어떻게 알고 전달하는 것일까?결론부터 말하면 프론트엔드 코드가 TLS 버전과 암호화 알고리즘을 직접 설정하는 것이 아니다.https:// 주소로 요청하면 브라우저와 Nginx가 애플리케이션 코드 아래의 네트워..

[CS] 가상 메모리와 HTTP vs. HTTPS

1. 가상 메모리1. 가상 메모리란?가상 메모리는 프로세스가 실제 물리 메모리인 RAM의 크기와 관계없이 자신만의 연속된 메모리 공간을 사용하는 것처럼 보이게 하는 메모리 관리 기법. 각 프로세스는 독립적인 가상 주소 공간을 사용하며 CPU가 생성한 가상 주소는 MMU에 의해 실제 RAM의 물리 주소로 변환된다. 가상 메모리는 일반적으로 메모리를 일정한 크기의 페이지로 나누어 관리한다. 이에 대응하여 물리 메모리는 같은 크기의 프레임으로 나뉜다.페이지 : 가상 메모리를 나눈 고정 크기의 블록프레임 : 물리 메모리를 나눈 고정 크기의 블록페이지 테이블 : 가상 페이지와 물리 프레임의 대응 관계를 저장하는 자료구조예를 들어 프로세스가 가상 페이지 3에 접근하면 페이지 테이블을 확인하여 해당 페이지가 실제 R..

많이 읽은 글