
요구사항기능적 요구사항사용자가 입력하는 단어는 검색어의 첫 부분으로 한정5개의 자동완성 검색어가 표시질의는 영어로만 지원Spelling 체크 X시스템의 계산 결과는 순위 모델에 의해 정렬비기능적 요구사항시스템 응답속도는 100밀리초 이내규모 확장성: 초당 24000 건의 질의(QPS) 발생시스템 구조자료 구조나이브한 아키텍처는 아래와 같음query frequencyramen23radiation2간단하게 질의문을 저장하는 query 필드와 빈도를 저장하는 frequency 필드를 저장하는 DB 테이블을 만들어서 SELECT * from frequency_table WHERE query LIKE 'ra%' ORDER BY frequeny DESC LIMIT 5 이렇게 질의할 수도 있겠지만 데이터가 많아지면 ..

DDDDDD는 비즈니스 도메인을 중심으로 소프트웨어를 모델링하는 설계 방법엔티티, 밸류 객체, 애그리거트, 도메인 서비스 등으로 구조화하여비즈니스 복잡성을 효과적으로 다루고 유지보수를 쉽게 만듦1. 도메인(Domain)비즈니스의 문제 영역 (ex: 금융, 쇼핑몰, 물류 등)2. 서브도메인(Subdomain)도메인을 구성하는 하위 영역 (ex: 결제, 주문, 배송 등)3. 유비쿼터스 언어(Ubiquitous Language)도메인 전문가와 개발자가 같은 단어를 같은 의미로 사용하는 공통 언어예: "주문 승인", "상품 할인", "잔액 부족"4. 엔티티(Entity)고유 ID로 식별되는 객체 (ex: 사용자, 주문, 상품 등)5. 밸류 오브젝트(Value Object)고유 ID 없이 값 자체로 의미가 있는 ..

알림 시스템 설계하기 요구 조건알림 지원 형태: 푸시 알림, SMS 메시지, 이메일soft real-time 시스템; 가능한 빨리 전달되어야 하나 약간의 지연은 OKiOS 단말, 안드로이드 단말, 랩톱/데스크탑 지원사용자가 알람을 받지 않도록 설정 가능성능: 약 천만 건의 모바일 푸시 알림 보낼 수 있어야 함시스템 구성알림 메커니즘 동작 방식알림 제공자: 알림 요청을 만들어 사용자 단말에 알림을 실제로 보내는 제3자 알림 서비스에 전송함. 제3자 알림 서비스에는 APNs(iOS), FCM(Android), Twilio(SMS) 등이 있음. 알림 요청을 만들려면 다음과 같은 데이터가 필요.단말 토큰: 알람 요청 보내는데 필요한 고유 식별자payload: 알림 내용을 담은 JSON 딕셔너리시스템 구조도각 서..
현대 웹 서비스: 다양한 소스의 콘텐츠를 조합, 여러 웹 서비스에 접근해야 함→ 즉 외부 서비스나 데이터베이스 결과를 기다리는 스레드를 블록함으로 연산 자원을 낭비하는 일은 피해야함동시성을 구현하는 자바 지원의 진화Runnable, thread → ExecutorService (스레드 실행과 태스크 submit을 분리) → Callable, Future (Runnable, Thread의 변형을 반환) → RecursiveTask (분할/정복 알고리즘의 포크/조인 구현을 지원) → 스트림/람다 지원에 기반한 병렬 프로세싱 → CompletableFuture 지원(분산 비동기 프로그래밍 지원) → Flow 인터페이스 (발행-구독 프로토콜)가능한한 동시에 실행할 수 있는 독립적인 태스크를 가능하게 만들면서 멀..

Netty - async and event-driven기존 blocking model 은 아래와 같음 매 Thread 마다 socket connection 을 가지게 하고, blocking I/O 모델일 경우 다음과 같은 drawback 이 발생할 수 있다 많은 thread 가 I/O 이벤트 결과가 나타날 때까지 기다려야 함각 연결마다 thread 가 배정되는 형태이기 때문에, connection 이 늘어난다면 thread 도 늘어나게 될 것이고 그에 따른 context-switching 비용도 늘어날 것이다그래서 Java NIO 가 도입되었음setsockopt() : socket의 read/write call 이 즉시 리턴됨non-blocking socket 을 등록할 수 있음: event notifi..

목표트랜잭션의 ACID 속성에 대해 설명할 수 있다.트랜잭션의 Commit/Abort 기능이 애플리케이션에 주는 이점을 설명할 수 있다.동시성 문제의 종류를 이해하고 이를 방지할 수 있는 격리 수준의 종류에 대해 설명할 수 있다. Transaction트랜잭션: 애플리케이션에서 여러 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법, 한 연산으로 실행 됨 전체가 성공(커밋) 하거나 실패(어보트) 함트랜잭션을 사용함으로써 잠재적인 오류 시나리오와 동시성 문제를 무시할 수 있음(all or nothing, 부분적 결과를 허용하지 않음)트랜잭션의 핵심 기능은 오류가 생기면 어보트되고 안전하게 재시도 할 수 있다는 점.ACID?너무 흔하게 들어보는 개념이지만. .DB 마다 ACID 구현이 제각각이다 ..원자성(..

분산 키-값 저장소분산 시스템 설계 시 고려해야 할 점들CAP 정리데이터 일관성 (Consistency) : 분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속했느냐에 상관없이 언제나 같은 데이터를 봐야 함가용성 (Availability) : 분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생하더라도 항상 응답을 받을 수 있어야 함파티션 감내 (Partition tolerance): 파티션은 두 노드 사이에 장애가 발생하였음을 의미, 파티션 감내는 네트워크에 파티션이 생기더라도 시스템은 계속 동작함을 의미이 3가지 요소를 동시에 만족시키는 분산 시스템을 설계하는 것은 불가능하다. 네트워크 장애는 피할 수 없는 것으로 여겨지므로, 파티션 감내는 반드시 감내할 수 있도록 설계되어야 함. 보통..

이번 장에서는 어떻게 데이터를 고르게 분산할 수 있는지에 대해 알아본다.일반적으로, 데이터를 N 개의 서버에 나누어서 저장하게 될 때 해시 함수를 이용해서 데이터를 분배해서 저장하는 방법을 생각하게 된다. (해시 테이블과 유사)그러나 이 방법은 다음과 같은 취약점이 있다.특정 서버에 장애가 발생할 경우, 장애가 발생한 서버에 저장된 데이터가 모두 재배치 되어야 한다캐시 서버일 경우, 장애가 발생한 서버에 저장된 키였을 경우 그 키에 대한 데이터가 없는 다른 서버에 접속하게 되어 대규모 cache miss 가 날 수 있다Hotspot key 문제가 발생할 수 있다 → 데이터를 균등하게 배치하지 못해 특정한 샤드에 대한 접근이 많을 경우이다.안정 해시(consistent hash) 는 해시 테이블 크기가 조..

애플리케이션에 적합한 데이터 모델을 선택하는 방법 ..과 그 모델에 따른 질의 언어에 대해 알아보자 ..관계형 모델과 문서 모델관계형 모델과 문서 모델은 어떻게 다를까?관계형 모델은 보통 우리가 아닌 RDB로, 관계 로 구성되고 각 관계는 튜플 의 모음임BUT RDB에는 다음과 같은 drawback 이 있음동적이고 변하는 스키마에 대응하기 어려움관계형 모델에서 지원하지 않는 특수 질의 동작대규모 데이터셋 or 높은 쓰기량 달성을 해야 할 경우또한 RDB 에서, 데이터를 테이블에 저장하려면 app 코드 ↔ DB 모델 객체 간 전환 계층이 필요 (임피던스 불일치)linkedin 예제를 보면, 같은 table 데이터를 JSON 형식으로 저장할 수 있음 SON 형식으로 데이터를 저장 (= 문서 형식으로 데이터를..

데이터베이스의 저장 및 검색 처리 방식에 대해 다룬다. 색인 자료 구조해시 색인 이 방식은 키를 데이터 파일의 바이트 오프셋에 매핑해 인메모리 해시 맵을 유지하는 방식비트캐스크(bitcask) 에서 사용 — 해시 맵을 전부 메모리에 유지하기 때문에 RAM에 모든 키가 저장,메모리에 모든 키를 보관할 수 있을 만큼 키 수가 작지만 각 키의 값이 자주 갱신되는 상황(=키당 쓰기 수가 많은 경우) 에 유리데이터가 저장되는 로그 파일을 무한정 append 하면 디스크 공간이 부족해 질 것 →컴팩션(compaction) 을 수행하여 각 로그에서 중복된 key 를 버리고 각 키의 최신 값만 유지함컴팩션 수행 시, 크기를 줄이기 위해 동시에 여러 다른 세그먼트 파일을 병합하게 됨세그먼트 파일들의 컴팩션과 병합은 백그..