본문 바로가기

전체 글246

[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 11장 뉴스 피드 시스템 설계 뉴스 피드 홈페이지 중앙에 지속적으로 업데이트되는 스토리들 사용자 상태 정보 업데이트, 사진, 비디오, 링크, 앱 활동 등등 1단계 : 문제 이해 및 설계 범위 확정 모바일 앱을 위한 시스템인지, 웹을 위한 시스템인지 둘 다 지원해야 함 중요한 기능으론 어떤 것이 있는지 사용자는 뉴스 피드에 새로운 스토리를 올릴 수 있어야 함 친구들이 올리는 스토리를 볼 수도 있어야 함 뉴스 피드에는 어떤 순서로 스토리가 표시되어야 하는지? 단순히 시간 흐름 역순으로 표시된다고 가정 한 명의 사용자는 최대 몇 명의 친구를 가질 수 있는지? 예시 : 5000명 트래픽 규모? 매일 천만 명이 방문한다고 가정 피드에 이미지나 비디오 스토리도 올라올 수 있는지? 스토리에는 이미지나 비디오 등의 미디어 파일 포함 가능 2단계 :.. 2023. 3. 19.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 10장 알림 시스템 설계 알림 시스템은 어느 서비스나 항상 고민하게 되는 부분이라 생각한다. 실제로 서비스를 구현할 때, 다양한 고민들을 하게 되는데, 설계에 대한 초점에서 바라본 건 새로웠다. 알림 시스템 고객에게 중요할 만한 정보를 비동기적으로 전송 모바일 푸시 알림, SMS 메시지, 이메일 세 가지로 분류 1단계 : 문제 이해 및 설계 범위 확정 시스템이 지원하는 알림 종류 푸시 알림, SMS 메시지, 이메일 실시간 시스템 여부 연성 실시간 시스템이라고 가정 (시스템 부하 시 약간의 지연 무방) 지원해야 하는 종류의 단말 iOS, 안드로이드, 랩톱/데스크톱 알림을 만들 수 있는 주체 클라이언트 애플리케이션 or 서버 측의 스케줄링 알림을 받지 않도록 설정도 가능해야 함 하루에 보낼 수 있어야 하는 양 천만 건의 모바일 푸시.. 2023. 3. 18.
[아파치 카프카 애플리케이션 프로그래밍 with 자바] 1장 들어가며 아파치 카프카 개발 공부를 하며 필수로 MQ, MB 정도는 하나 공부해야 겠다는 생각을 꾸준히 해왔다. 공부할만한 실력이 되는게 베이스가 될 시기와, 실제로 사용해야 될 시기가 딱 맞아 떨어져 바로 공부하기로 마음 먹었다. 카프카란? 카프카 내부에 데이터가 저장되는 파티션 동작은 FIFO 방식의 큐 자료구조와 유사하다. 큐에 데이터를 보내는 것이 ‘프로듀셔' 이고 데이터를 가져가는 것이 ‘컨슈머'. 카프카를 통해 전달할 수 있는 데이터 포맷은 거의 제한이 없다. 직렬화, 역직렬화를 통해 ByteArray 로 통신하므로 자바에서 선언한 모든 객체를 지원한다. (카프카 클라이언트에서는 기본적으로 ByteArray, ByteBuffer, Double, Long, String 타입에 대응한 직렬화.. 2023. 3. 13.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 9장 웹 크롤러 설계 웹 크롤러란 검색 엔진에서 널리 쓰는 기술로, 웹에 새로 올라오거나 갱신된 콘텐츠를 찾아내는 것이 주된 목적이다. 웹 크롤러는 몇 개 웹페이지에서 시작하여 그 링크를 따라 나가면서 새로운 콘텐츠를 수집한다. 검색 엔진 인덱싱 : 크롤러의 가장 보편적인 용례. 크롤러는 웹 페이지를 모아 검색 엔진을 위한 로컬 인덱스를 만든다. 일례로 Googlebot은 구글 검색 엔진이 사용하는 웹 크롤러다. 웹 아카이빙 : 나중에 사용할 목적으로 장기보관하기 위해 웹에서 정보를 모으는 절차이다. 웹 마이닝 : 웹 마이닝을 통해 인터넷에서 유용한 지식을 도출해 낼 수 있다. 웹 모니터링 : 크롤러를 사용하면 인터넷에서 저작권이나 상표권이 침해되는 사례를 모니터링 할 수 있다. 이례로 디지마크사는 웹크롤러를 사용해 해적판 .. 2023. 3. 12.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] Chapter 8 URL 단축기 설계 1단계 : 문제 이해 및 설계 범위 확정 URL 단축기가 어떻게 동작해야 하는지? 긴 주소가 입력으로 주어졌을 때 단축 URL을 결과로 제공해야 함 단축 URL에 접속하면 원래 URL로 갈 수도 있어야 함 트래픽 규모는? 매일 1억(100million) 개의 단축 URL 단축 URL의 길이는? 짧으면 짧을수록 좋음 단축 URL에 포함될 문자에 제한은? 숫자(0부터 9까지)와 영문자(a부터 z, A부터 Z까지)만 사용 가능 단축된 URL을 시스템에서 지우거나 갱신할 수 있는지? 시스템을 단순화하기 위해 삭제나 갱신은 할 수 없다고 가정 2단계 : 개략적 설계안 제시 및 동의 구하기 API 엔드포인트 클라이언트는 서버가 제공하는 API 엔드포인트를 위해 서버와 통신 URL 단축기는 기본적으로 두 개의 엔드포.. 2023. 3. 7.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] Chapter 7. 분산 시스템을 위한 유일한 ID 생성기 분산 시스템에서 유일성이 보장되는 ID를 만드는 방법은 여러가지이다. 다중 마스터 복제 (multi-master replication) UUID (Universally Unique Identifier) 티켓 서버 (Ticket Server) 트위터 스노플레이크 (Twitter Snowflake) 접근법 다중 마스터 복제 이 접근법은 데이터베이스의 auto_increment 기능을 활용하는 것이다. 다만 다음 ID의 값을 구할 때 1이 아니라 k만큼 증가시킨다. 여기서 k는 현재 사용중인 데이터베이스의 서버의 수다. 데이터베이스 수를 늘리면 초당 생산 가능 ID수도 늘릴 수 있기 때문에 규모 확장성 문제를 어느정도 해결 가능하다. 여러 데이터센터에 걸쳐 규모를 늘리기 어렵다. ID의 유일성은 보장되지만 그.. 2023. 3. 2.
20대에는 가성비를 갖다 버리자 삶의 여유가 있던 적이 언제인지 모르겠다. 코딩을 제대로 시작하고 나서 삶의 여유가 없어졌다. 극한의 효율을 추구하는 성격으로 바뀌었고, 시간을 허투루 쓰는 만남을 줄였다. 취준 시기야 그렇다쳐도, 회사에 들어가면 좀 여유가 생길 줄 알았지만, 택도 없는 생각이었다.. ㅎㅎ 한계에 가까워졌단 생각이 들었고, 오늘 휴일인 김에 여유를 부릴 겸, 매번 가던 회사 대신 분위기 좋은 카페에 왔다. 어김 없이 스터디 준비, 사이드 프로젝트 태스크 개발을 해야하지만 허허.. 그래도 조용하니, 좋구만. 적당한 소음과 로파이 음악. 힐링된다. 서론 나는 생각하고 글 쓰는 것을 좋아한다. 자기만의 생각을 그대로 공개하는 것은 별로 좋지 않다고들 하지만, 한번 사는 인생 내 맘대로 하고 싶다. 그래서 가르치는 것도 좋아한.. 2023. 3. 1.
[Spring data JPA] N+1 문제 해결 이렇게 이루어진 ERD 모델이 있다. (예시) 조건에 맞춰 불러오고자 하는 Data는 세 테이블의 정보를 모두 필요로 한다. 이때 Fetch join을 고려해볼 수 있다. Permission 입장에서 user와 document를 두번 다 fetch join 할 수 있지만, 이능 데이터 베이스 성능 상 엄청난 문제가 있다. 데이터가 많을 경우, 연관된 엔티티의 수를 제한하는 방법으로 쿼리를 나눠서 발생시키는 것도 좋은 방법일 것이다. 해당 엔티티들은 모두 FetchType.LAZY 로 설정되어 있다. 기존 쿼리 : val documents = documentQueryService.findDocumentsByIdFetchJoinPermissions(projectId) return Response.UserPe.. 2023. 2. 28.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 6장 키-값 저장소 설계 키-값 저장소 설계 키-값 저장소는 키-값 데이터베이스라고도 불리는 비 관계형 데이터베이스이다. 이 저장소에 저장되는 값은 고유 식별자를 키로 가져야한다. 키와 값 사이의 이런 연결관계를 “키-값” 쌍이라고 지칭한다. 키-값 쌍에서의 키는 유일해야 하며 해당 키에 매달린 값은 키를 통해서만 접근할 수 있다. 키는 일반 텍스트일 수도 있고 해시값일수도 있다. 성능상의 이유로 키는 짧을수록 좋다. 키-값 쌍에서의 값은 문자열일 수 도 있고 리스트일 수도 있고 객체일 수도 있다. 키-값 저장소는 보통 값으로 무엇이 오든 상관하지 않는다. 키-값 저장소로 널리 알려진 것으로는 아마존 다이나모, memcached, 레디스 같은 것들이 있다. 문제 이해 및 설계 범위 확정 완벽한 설계는 없다. 읽기, 쓰기 그리고 .. 2023. 2. 28.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 5장. 안정 해시 설계 해시 키 재배치(rehash)문제 N개의 캐시 서버가 있을 때 이 서버들에 부하를 균등하게 나누는 보편적인 방법은 아래의 해시함수를 사용하는 것. serverIndex = hash(key) % N (N은 서버의 개수) 이 방법은 서버 풀의 크기가 고정되어 있을 때 그리고 데이터 분포가 균등할 때는 잘 동작함. 하지만 서버가 추가되거나 기존 서버가 삭제되면 문제가 생긴다. 1번 서버의 동작 중단 시 서버 풀은 크기가 3으로 변함. 그 결과 키에 대한 해시 값은 변하지 않지만 나머지 연산을 적용하여 계산한 서버 인덱스 값은 달라질 것으로 예측 가능하다. 따라서 1번 서버가 죽으면 대부분 캐시 클라이언트가 데이터가 없는 엉뚱한 서버에 접속하게 된다. 그 결과 대규모 캐시 미스가 발생 가능. 안정해시는 이용하여.. 2023. 2. 28.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 4장 처리율 제한 장치의 설계 정의 처리율 제한 장치 (Rate Limiter) 클라이언트 또는 서비스가 보내는 트리팩의 처리율을 제어하기 위한 장치 정의된 임계치(Threshold)를 넘어서면 추가로 도달한 모든 호출은 처리가 중단 예시 사용자는 초당 2회 이상의 새 글을 올릴 수 없다. 같은 IP 주소로는 하루에 10개 이상의 계정을 생성할 수 없다. 처리율 제한 장치는 왜 사용하는가? DoS(Denial of Service) 공격에 의한 자원 고갈(Resource Starvation)을 방지할 수 있다. 비용을 절감할 수 있다. 처리를 제한해 서버를 많이 두지 않고, 우선순위가 높은 API에 더 많은 자원을 할당할 수 있다. 특히 요청 당 비용이 드는 Third party API를 사용하고 있는 경우, 횟수 제한을 통해 과도한 .. 2023. 2. 24.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 3장 시스템 설계 면접 공략법 면접이라 함은 면접관에게 면접자의 Red Flag 를 내비치지 않는 것이 정석이다. 그러므로 보통 질문에 대한 정답만을 간결하게 답변하고 끝내는 경향이 있는데, 이러한 방법은 적어도 시스템 설계 면접에서는 통하지 않는다. 면접관과 면접자의 상호작용이 가장 중요하다. 오히려 면접자가 면접관의 답변을 이끌어내는 것이 포인트다. 훌륭한 엔지니어는 타협적 결정을 중요시하고 정답이 아닌 상황에 맞는 결론을 도출해낸다. 효과적인 면접을 위한 4단계 접근법 문제 이해 및 설계 범위 확정 곧바로 답부터 들이밀지 말고 속도를 늦춰라 깊이 생각하고 질문해서 요구사항과 가정들을 분명히 하라 올바른 질문을 하라 개략적인 설계안 제시 및 동의 구하기 설계안에 대한 청사진을 제시하며 의견을 구하라 핵심 컴포넌트를 포함하는 다이어.. 2023. 2. 23.
[Spring Data JPA] JPA Enum 필드에 관한 문제 참나. 오늘 5시간 날렸다. Pagination 쿼리를 날리는 API에서 계속 500 에러가 나서 계속 붙잡고 있었다. 빨래 땜에 집에 왔지만 불굴의 의지로 해결해보리라 다짐하고 1시간만에 문제를 발견했다 증말. 문제점 결론부터 말하면 서버 DB에 잘못된 데이터가 들어가서였다. 문제는 JPA Enum 필드가 @Enumerated(EnumType.STRING) ㅣ이 아니라, Ordinal로 들어가 발생한 문제다. 지정한 Enum 상수는 총 4개 이며, ordinal의 범위는 0~3 이다. 4 이상의 숫자는 있어서는 안될 데이터다. 그래서 계속 이런 에러가 발생했다. java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4 쿼리.. 2023. 2. 21.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 2장 개략적인 규모 추정 시스템 설계 면접에서 가장 요구를 많이 받는 것은 시스템 용량이나 성능 요구사항을 개략적으로 추정하라는 요구가 많다. 보편적으로 통용 되는 성능 수치상에서 사고 실험을 행해 추정치를 계산하는 개략적인 규모 추정은 규모 확장성을 표현하는 기본기에 능숙해야 효과적으로 추정을 해낼 수 있다. 2의 제곱수 가장 많이 쓰이는 단위 근사치로 1천, 1백만, 10억 이름으로 킬로 바이트, 메가 바이트, 기가 바이트 축약형 표시로 1KB, 1MB, 1GB로 표시 가능 모든 프로그래머가 알아야 하는 응답 지연 값 구글의 제프 딘은 2010년 통상적인 컴퓨터에서 구현된 연산들의 응답지연 값을 공개했다. 이 수치들은 컴퓨터 연산들의 처리 속도의 지표가 되었다. 제시된 수치를 분석할 수 있는 능력을 기르자 가용성에 관한 수치.. 2023. 2. 19.
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 1장 사용자 수의 따른 규모 확장성 작년 10월 원티드에서 진행한 백엔드 온보딩 챌린지에서 멘토님이 속하신 스터디에서 이 책을 다루셨던 것이 기억난다. 실제로 멘토링 후 백엔드 개발자가 읽어야 할 책들을 여러 개 추천해 주셨는데, 그 중 하나가 이 책이다. 그 책들을 꾸준히 완독해 나가는 중이고, 확실히 백엔드 개발 공부는 책을 통해서 간접 경험을 쌓거나 직접 적용하기에 용이하다고 생각이 들었다. 회사에 이 도서를 요청했고, 오늘 첫 페이지를 펼쳤다. 단일 서버 가장 기초적인 서버 구성 단위 데이터 베이스 서버도 보통 1개를 둔다. RDBMS 많이 사용 비정형 데이터이거나, 직렬화 역직렬화 하거나, 많은 양의 데이터를 저장할 경우 비-관계형 데이터베이스가 바람직함. 모든 트래픽을 하나의 서버가 감당한다. 수직적 규모 확장 & 수평적 규모 .. 2023. 2. 14.
반응형