책정리 43

URL 단축기 설계

8장 URL 단축기 설계 URL 단축기 요구사항 매일 1억개의 단축 URL을 만들어낸다. 단축 URL의 길이는 짧으면 짧을 수록 좋다. 단축 URL에는 숫자(0-9), 영문자만 사용가능하다 만든 URL 정보를 삭제하거나 갱신할 수 없다. 높은 가용성과 규모 확장성, 장애 감내가 요구된다. 개략적 추정 매일 1억개라고 치면 1초당 1160개의 연산을 한다. 읽기 연산과 쓰기 연산의 비율이 10:1의 비율이라고 할 때 초당 11,600회 발생한다. 10년간 운영한다고 가정하면 1억 * 365 * 10 = 3650억개의 레코드를 보관해야하고, url 평균 길이가 100이라면 3650억 * 100 = 36.5tb를 저장해야한다. HTTP Redirect code 301 permanently moved : 브라우..

자바스크립트의 배열은 알고보니 객체였다?

이전 글에서 자바스크립트는 원시값(primitive values)를 제외하고는 모두 내부적으로 객체처럼 동작한다는 언급을 했었는데요. 자바스크립트에서 배열은 원시값에 해당하지 않습니다. 그렇다면 자바스크립트에서 배열은 어떻게 동작할까요? 객체처럼 동작하는 자바스크립트의 배열 자바스크립트에서는 배열을 만들면, Object를 상속하는 Array 클래스를 사용하여 객체를 만듭니다. 예시 코드를 살펴보겠습니다. let arr = []; arr.push(1); arr.push(2); arr.push("Prince"); arr.push("Aditya"); let keys = Object.keys(arr).join(" "); let values = Object.values(arr).join(" "); console...

분산 시스템을 위한 유일 ID 생성기 설계

7장 분산 시스템을 위한 유일 ID 생성기 설계 만약 분산 시스템을 위해 여러 데이터베이스 서버를 사용한다면, 관계형 데이터베이스의 auto_increment 속성을 사용할 수 없다. 유일 ID 생생기 요구사항 - ID 유일한 숫자값 - 계속 커지는 값이어야 한다. - 초당 10000개의 ID를 만들 수 있어야 합니다. 유일 ID 생성기를 만드는 방법 다중 마스터 복제 데이터베이스의 auto increment 기능을 활용하지만, 1만큼 증가시키는 것이 아니라 k만큼 증가시킨다. 데이터베이스가 총 2대일 때, 데이터베이스1에서는 아이디를 1, 3, 5로 정하고 데이터베이스 2에서는 2, 4, 6과 같이 아이디를 정하는 방법이다. 이 경우 ID 유일성은 보장되겠지만, 시간 흐름에 맞추어 커지도록 보장할 수 ..

키-값 저장소 설계

6장 키-값 저장소 설계 키-값 저장소란 비 관계형 데이터베이스를 말한다. 값은 키를 통해서 접근할 수 있고, 예를 들어 레디스, 아마존 다이나모가 있다. 단일 서버 키-값 저장소 1. 메모리에 해시 테이블로 저장하기 가장 직관적인 방법으로, 키-값 쌍을 모두 메모리에 해시 테이블로 저장하는 방법이다. 빠른 속도를 보장하지만, 모든 데이터를 메모리 안에 두는 것이 가능할까? ㄴ 데이터 압축, 자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장하는 개선 방법 ㄴ 그래도 한 대 서버로 부족한 때가 온다. 2. 분산 키-값 저장소 (분산 해시 테이블) ㄴ 대규모 데이터를 저장하기 위해서 안정 해시를 사용해 서버들에 부하 분산 CAP 정리 - 데이터 일관성(Consistency): 분산 시스템에 접속하는..

자바스크립트 클래스 사용 방식 및 특징

이전 글에서 살펴보았듯이, 자바스크립트는 프로토타입을 사용하여 객체 지향 프로그래밍을 할 수 있다. ES6에서 도입된 클래스는 자바나 C 언어의 클래스 문법과 유사하게 객체 생성할 수 있도록 한다. 자바스크립트의 클래스는 실제로는 함수처럼 동작하며, 기존의 프로토타입 생성 방식과 다르지 않다. 따라서 클래스를 문법적 양념(syntactic sugar)일 뿐이라고 말하기도 한다. 클래스가 도입된 이유 function Student(name,age){ this.name = name this.age = age } const student1 = new Student('king',20) // {'name': 'king', 'age': 20} const student2 = Student('king', 20); //..

해시 링을 사용한 안정 해시 설계

안정 해시 설계 해시 키 재배치 문제 서버가 추가되거나 기존 서버가 삭제되면 해시값 인덱스가 달라져서 재배치 해야한다. 대부분의 키가 재분배 되면 대규모 캐시 미스가 발생할 것 이다. 안정 해시란 평균적으로 k/n개의 키만 재배치하는 해시 기술이다. 해시 링 해시 공간을 구부려 접어서 해시 링을 만들고, 서버 IP나 이름을 이 위치에 대응시킬 수 있다. 해시 키도 링 위의 어느 지점에 배치한다. 시계 방향으로 링을 탐색해서 만나는 첫 번째 서버에 대응된다. 위 사진에서의 해시 링에서 서버 10.5.5.2, 10.9.5.1, 10.1.2.3을 각각 빨강, 파랑, 초록색으로 해시 링 공간에 대응하였다. 그리면 Venus에 해당하는 해시는 링을 탐색해서 만나는 첫 번째 서버인 파란색에 대응할 것이다. Mars..

처리율 제한 장치의 설계

4장 처리율 제한 장치의 설계 처리율 제한 장치 (rate limiter) 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하기 위한 장치 API 요청 횟수가 제한 장치에 정의된 임계치를 넘어서면 추가로 도달한 모든 호출은 처리가 block 된다. 예시) 사용자는 초당 2회 이상 새 글을 올릴 수 없다. 같은 IP 주소로는 하루에 10개 이상의 계정을 생성할 수 없다. 장점 Dos(Denial of Service) 공격에 의한 자원 고갈을 방지할 수 있다. 비용을 절감할 수 있다. 우선순위가 높은 API에 더 많은 자원을 할당할 수 있다. 서버 과부하를 막는다. 봇에서 오는 트래픽이나 사용자의 잘못된 이용 패턴으로 유발된 트래픽을 걸러낼 수 이다. 1단계) 문제 이해 및 설계 범위 확정 문제를 이해..

자바스크립트 this 동적 바인딩 총정리

자바스크립트는 객체지향 프로그래밍 언어이기 때문에, 자신이 속한 프로퍼티나 메서드를 참조할 수 있는 this 식별자를 사용할 수 있어야 한다. // 객체 리터럴 생성 const circle = { radius: 10, getDimeter() { return 2 * this.radius; } } console.log(circle.getDiameter); // 20 // 생성자 생성, new로 객체 생성 시 인스턴스 this를 암묵적으로 반환한다. function Circle(radius) { // this : 생성자 함수가 생성할 인스턴스 this.radius = radius; } Circle.prototype.getDiameter = function () { return 2 * this.radius; }..

자바스크립트는 프로토타입 기반 언어이다

자바스크립트는 객체지향 프로그래밍 언어, 프로타입 기반 언어이다. 자바스크립트는 명령형, 함수형, 프로토타입 기반, 객체지향 프로그래밍을 모두 지원하는 멀티 패러다임 프로그래밍 언어이다. 자바스크립트가 객체 지향 언어가 아니라고 오해하기 쉬운데, 자바스크립트는 원시 값을 제외한 함수, 배열, 정규 표현식 등은 모두 내부적으로 객체처럼 동작한다. 자바스크립트 ES6에서 클래스가 도입되었으나, 다른 일반적인 프로그래밍 언어와 다르게 내부적으로 프로토타입 기반으로 동작한다. 모든 객체는 [[Prototype]]이라는 내부 슬롯을 갖는다. 접근자 프로퍼티 __proto__를 통해 간접적으로 접근 가능하다. 상속과 인스턴스 생성 const circle1 = new Circle(); const circle2 = n..

객체 프로퍼티 접근, 변경 시 내부 동작 방식 (Javascript)

들어가며 우리는 자바스크립트에서 코드를 작성할 때 많은 객체를 생성하고 접근하고 변경한다. const person = { name: 'Lee' } person.name = 'Kim'; person.age = 20; 다음은 person이라는 객체를 만들고 name, age라는 프로퍼티를 정의하는 코드이다. 이 때, 자바스크립트는 const 객체를 선언하기 때문에 메모리 공간에 객체 참조 공간을 할당하고, 값을 저장할 것이다. (변수에 대해서 궁금하다면 클릭) 그렇다면 자바스크립트에서는 프로퍼티에 대한 정보를 어떻게 관리할까? 내부 슬롯과 내부 메서드 모든 객체는 내부 슬롯과 내부 메서드를 가진다. (관련 문서) 이는 자바스크립트 엔진의 내부 로직이다. 하나를 예로 들자면 모든 객체는 [[Prototype]..