본문 바로가기

Database , Middleware8

Redis와 Event Loop 그리고 Netty, Virtual Thread Redis가 빠른 이유는 인메모리 기반으로 동작하기 때문이며, 여기에 더해 단일 스레드 + Event Loop 구조를 사용하기 때문이다.그렇다면 단일 스레드 기반의 Event Loop 구조는 왜 빠른 걸까?이번 글에서는 Redis의 Event Loop 구조를 중심으로, Netty의 Event Loop, Event Loop의 핵심 특징인 Non-blocking I/O, 그리고 논블로킹처럼 보이지만 다른 개념인 Java Virtual Thread까지 함께 정리해보려고 한다.Redis가 단일 스레드를 선택한 이유Redis는 설계 단계부터 초고속, 저지연 처리를 목표로 삼았고, 이를 위해 단일 스레드라는 매우 단순하지만 강력한 전략을 선택했다.1. 락(lock)이 필요 없다 (경쟁 비용 제거)멀티스레드 환경에서.. 2025. 11. 17.
[Kafka] Kafka 파티션, 컨슈머, 그룹 (파티션 리밸런싱, 컨슈머 리밸런싱) 이전글(https://bangbaeking.tistory.com/161)에서 카프카와 카프카 클러스터에 대해 정리해 보았다.카프카의 병렬 처리 구조의 핵심인 파티션(Partition), 컨슈머(Consumer), 그리고 컨슈머 그룹(Group)에 대해 더 깊이 알아보려고 한다.파티션이란?우리는 Kafka에서 토픽을 생성하고, 해당 토픽에 메시지를 전달한다.토픽은 데이터를 저장하는 논리적 단위이고, 토픽은 여러개의 파티션으로 나뉠수 있다.즉, 하나의 토픽은 여러 파티션으로 분할되어 데이터를 저장하고, 여러 파티션을 통해 메시지를 동시에 소비함으로써 병렬성을 높일 수 있다.그렇다면 토픽으로 들어온 메시지는 어떤 기준에 따라 여러 파티션으로 분배될까?파티션에 메시지가 어떻게 분배될까?Kafka는 Produce.. 2025. 4. 7.
[Kafka] Kafka의 기본 개념 및 구성 요소(Kafka 클러스터) 최근 프로젝트에서(https://bangbaeking.tistory.com/160) Kafka를 사용했지만, 면접에서 "Kafka 클러스터가 뭔가요?" 라는 질문에 정확히 답변하지 못했다. (브로커를 여러개 설정해서 어쩌구 고가용성 저쩌구) 그래서 카프카 클러스터가 뭔지 정리해보려고 한다. 결론부터 정리하면 Kafka 클러스터는 여러 개의 브로커로 구성된 분산 시스템으로, 데이터의 고가용성과 확장성을 보장하는 Kafka의 핵심 구조이다. 카프카란?Apache Kafka는 대용량 데이터의 실시간 스트리밍을 처리하기 위한 분산 메시지 큐 시스템이다.대규모 데이터 파이프라인, 실시간 데이터 분석, 로그 수집, 이벤트 기반 아키텍처 등에 활용된다.Kafka의 주요 특징은 다음과 같다.높은 처리량(High Thr.. 2025. 3. 9.
[Database] MongoDB와 RDB의 차이점 (Master-Slave와 Sharding) 프로젝트를 진행하며 채팅 내역을 MongoDB에 저장하기로 결정했다. 이는 MongoDB가 NoSQL 데이터베이스로서, 채팅 내역과 같은 비정형 데이터를 저장하는 데 더 적합하고, 조회 속도 또한 빠르기 때문이다. MongoDB가 이러한 장점을 가지는 이유를 RDB와 비교하며 정리해보려고 한다. RDB(Relational Database)란?RDB는 관계형 데이터베이스(Relational Database)의 약자로, MySQL, Oracle, PostgreSQL 등 대표적이다. 데이터를 행(Row)과 열(Column)로 구성된 테이블 형태로 저장하며, 스키마(Schema)라는 데이터 구조를 미리 정의하는 것이 특징이다.RDB의 장점명확한 스키마 구조데이터를 테이블 형태로 관리하며, 사전에 정의된 스키마를.. 2025. 2. 16.
[Database] DB Index에 대해 자세히 알아보자 (복합 인덱스, 커버링 인덱스) 인덱스(Index)란데이터베이스에서 인덱스(Index) 는 데이터를 더 빠르고 효율적으로 검색할 수 있도록 돕는 데이터 구조이다.인덱스는 특정 열이나 열들의 값에 대한 빠른 조회를 가능하게 하여 쿼리 성능을 향상시킨다. 풀 스캔(Full Table Scan)위와 같은 테이블이 있을때 이름이 홍길동인 학생을 찾는다고 생각해보자. SELECT * FROM 학생 WHERE 나이 = 20; 이 쿼리를 실행한 후, 테이블을 확인하면서 나이가 20인 행을 찾아야 한다.첫 번째 행에서 나이가 '20'인 학생을 찾았다면, 그 즉시 검색을 멈출까? 아니다.테이블의 끝까지 나이가 '20'이 더 있는지 계속해서 확인해야 한다.이러한 과정을 '풀 스캔(Full Table Scan)'이라고 한다.위의 예시에서는 테이블에 행이 .. 2025. 1. 4.
[MySQL] SQL 최적화와 인덱스 개선으로 API 응답 속도 향상 최근 프로젝트를 진행하면서 600만 건 이상의 아파트 거래 데이터를 다루는 API의 성능을 개선하는 작업을 진행했다.해당 API는 특정 위치(동)에 따른 아파트 거래 내역을 조회하는 기능을 제공하는데, 평균 응답 시간이 약 9초로 매우 느려 성능에 문제가 있었다.SQL 쿼리 최적화와 인덱스를 적용해서 응답 속도를 10ms 이하로 크게 향상시킬 수 있었다.문제: 느린 SQL 쿼리 성능기존에 사용되던 SQL 쿼리는 두 개의 지역 코드(sgg_cd, umd_cd)를 CONCAT 함수로 결합하여 비교하는 방식이었다. 이 방식은 데이터를 처리하는 데 시간이 매우 오래 걸렸고, 특히 인덱스를 효율적으로 활용하지 못해 성능이 떨어졌다. SELECT no, sgg_cd, umd_cd, umd_nm, jibun, .. 2024. 12. 18.
[Redis] Redis를 이용한 실시간 조회수 관리 프로젝트를 진행하면서 실시간 인기 아파트 정보를 제공하는 기능을 구현 했습니다. 이 과정에서 두 가지 주요 방식에 대해 고민하게 되었습니다. 첫 번째는 조회수 칼럼을 기존 아파트 테이블에 추가하는 방식과, 조회수 데이터를 별도의 테이블로 분리하여 관리하는 방식이었습니다.두 번째는 조회수의 처리 방식에 대한 고민이었습니다. 조회수가 일정 수치 이상 상승한 경우 바로 DB에 저장하는 방식과, 하루에 한 번 레디스에 저장된 조회수를 DB에 일괄 업데이트하는 방식 중에서 어떤 방법이 더 효율적일지에 대해 고민을 하게 되었습니다. Redis 선택 이유성능 최적화: 조회수와 같은 실시간 데이터를 DB에 직접 저장하는 대신 Redis를 사용하여 빠르게 읽고 쓸 수 있도록 함으로써 DB 부하를 줄이고 성능을 향상시켰습.. 2024. 12. 14.
[Redis] Redis 와 RDB, AOF 대해 알아보자 가상 면접 사례로 배우는 대규모 시스템 설계 기초 를 읽고 스터디를 진행하면서 프로젝트를 진행하다Redis에 대해 더 정리를 하게 되었습니다.RedisRedis는 메모리 기반의 키-값 저장소이다.우리가 알고 있는 일반적인 데이터베이스와 다르게 인메모리 데이터베이스로 속도가 매우 빠르고다양한 데이터 구조를 지원한다.주요 특징속도: 인메모리 데이터베이스로 속도가 매우 빠르다. (디스크 I/O가 없다)데이터 구조: 다양한 데이터 구조를 지원한다.영속성: 메모리에 데이터가 저장되지만 디스크에 데이터를 주기적으로 저장을 해서 데이터의 손실을 방지한다.Java에서 HashMap과 뭐가 다른걸까?둘다 key-value 형식이며 메모리에 저장한다. 디스크보다 빨리 접근 할 수 있다. redis의 장점이자 둘의 차이점은.. 2024. 10. 22.