개발 공부 기록하기 108

대규모 시스템 설계 기초 - 5. 안정 해시 설계

수평적 규모 확장성을 달성하기 위해서는 요청 또는 데이터를 서버에 균등하게 나누는 것이 중요하다. 안정 해시 설계는 이 목표를 달성하기 위해 보편적으로 사용하는 기술이다. 해시 키 rehash 문제 자 여러분~ 한 번 생각해봅시다! cache 서버에 이런 저런 key-value를 넣어두려고 하는데 cache서버가 1, 2, 3, 4 총 4대 있어요! 방금 들어온 Apple 값은 어디 서버에 넣어야 할까요?!!! 우리의 목표 들어오는 req를 N개의 서버에 나눌 것인데, 1) 가능한 균일하게 2) N의 값에 변경이 있더라도 문제 없이 배분하고 싶다. 가능하면 modular 보다 좋은 방법으로...! 해시 : 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 mapping 하는 것 안정해시 : 해시 ..

대규모 시스템 설계 기초 - 4. 처리율 제한 장치의 설계

처리율 제한 장치(rate limiter) : 클라이언트 또는 서비스가 보내는 트래픽의 처리율(rate)을 제어하기 위한 장치 API 요청 횟수가 제한 장치에 정의된 임계치를 넘어서면 추가로 도달한 모든 호출은 처리가 중단된다. 몇 가지 예시 사용자는 초당 2회 이상 새 글을 올릴 수 없다. 같은 IP 주소로는 하루에 10개 이상의 계정을 생성할 수 없다. 같은 디바이스로는 주당 5회 이상 리워드를 요청할 수 없다. 예시 요구사항 설정된 처리율을 초과하는 요청은 정확하게 제한한다. 낮은 응답시간 : 이 처리율 제한 장치는 HTTP 응답시간에 나쁜 영향을 주어서는 곤란하다. 가능한 한 적은 메모리를 사용해야 한다. 분산형 처리율 제한 - 하나의 처리율 제한 장치를 여러 서버나 프로세스에서 공유할 수 있어야..

Junit5 Extension 알아보기 (org.junit.jupiter.api.extension)

Extension 모든 extension을 위한 마커 인터페이스이다. Extension은 @ExtendWith 를 통해 선언적으로 등록될 수도 있고, @RegisterExtension 을 사용해 프로그램에 따라 적용될 수도 있가. ServiceLoader 매커니즘을 이용해 자동 등록될 수도 있다. ServiceLoader 또는 @ExtendWith 를 이용해 등록되는 Extension 구현체는 default constructor를 무조건 가지고 있어야 한다. @ExtendWith 를 이용해 등록될 때 default constructor는 반드시 public이 아니어도 된다. ServiceLoader를 통해 등록될 때 default constructor는 반드시 public 이어야 한다. @Register..

JVM APM - 핀포인트 최신 버전(2.2.0) 다운로드

1. 일단 EC2 를 만들었다. sudo apt-get update mkdir -p /home/ubuntu/app/pinpoint # /home/ubuntu/app/pinpoint mkdir -p /home/ubuntu/app/pinpoint/hbase/data mkdir -p /home/ubuntu/app/pinpoint/zookeeper 2. 일단 HBase를 설치한다 https://cyberx.tistory.com/164 Apache에서 만든 하둡 기반의 분산 관리형 DB HBase 개념 정리 HBASE 란? 1.1 HBase 소개 Hadoop의 HDFS위에 만들어진 분산 컬럼 기반의 데이터베이스 입니다. 구조화된 대용량의 데이터에 빠른 임의접근을 제공하는 구글의 빅 테이블과 비슷한 데이터 모델을 ..

[Kotlin + Spring Boot + Querydsl] gradle multi project 구성하기

안녕하세요! 공부하는 개발자 입니다! 이번 포스트에서는 Kotlin, Spring Boot, Querdsl을 이용하여 gradle multi porject를 구성하는 방법에 대해 알아보겠습니다. 본 포스트를 작성하게 된 계기는 최근 이직한 회사의 프로젝트 구성이 git repository N개와 git submodule을 사용한 형태였기 때문인데요, 따라서 gradle multi module의 본격적인 구성 방법을 살펴보기에 앞서, 한 시스템 내에서 사용되는 모듈을 관리할 수 있는 또 다른 방법인 git repository N 개 + git submodule 에 대해서 간단히 설명드려 보겠습니다 🙂 Git repository N개 + Git submodule 방식 사실 생각해보면 꼭 gradle mult..

[코틀린 docs] 코틀린의 타입

코틀린의 공식 문서, Basic Types(https://kotlinlang.org/docs/reference/basic-types.html)를 간단히 정리하며 한 번더 생각해볼만한 것을 정리한 기록입니다. 코틀린 primitive type과 NULL 코틀린에서 중요하게 생각하는 철학 중 하나는 NULL이 될 수도 있는 타입과 NULL이 절대 들어가지 않을 타입을 명확히 구분하겠다는 것이다. 또한, 내부적으로 primitive type이 존재하고, 실제 연산을 할 때도 primitive type으로 처리하지만 타입은 모두 객체 타입으로 간주된다. 이게 무슨 말인가 하면 int number = 3; 이라는 자바 코드가 존재한다고 해보자. 이때 int는 Integer 라는 객체와 명확히 구분되며, primi..

[코틀린] companion object이란?

오늘은 companion object에 대해 알아볼 예정이다. 역시나 Java 로 코드를 살펴보고 Kotlin으로 바꿔보도록 하자 Java에서의 상수 public class Person { public static final int MAX_AGE = 500; } public static void main() { System.out.println(Person.MAX_AGE); } 간단한 코드이다. Person 클래스 내부에 MAX_AGE 라는 상수가 public 접근 제한자로 존재하고, 이는 외부에서 Person.MAX_AGE로 접근할 수 있다. 만약 Person 클래스 내부에서만 접근하게 하고 싶다면 public을 private으로 바꿀 수 있다. 클래스와 인스턴스 관점에서 바라보자면, static 필드..

[코틀린 탐구생활] when, 그리고 클린 코드

when 사실 when expression을 처음 보았을때 들었던 생각은 switch case문과 무척 유사하다는 점이었다. Java에서는 else 사용을 지양해야 한다는 일반적인 clean code 원칙에 따라 switch case 사용도 지양하고 있었는데, Kotlin의 when은 Java의 switch case보다 훨씬 단순하고 강력했다. 비교를 해보자. Kotlin 숫자가 들어오면 숫자를 3으로 나눈 나머지에 따라 적절한 로직을 수행하고 원하지 않는 형태 이면 exception을 뱉어야 한다고 하자. 이를 Early Return 스타일로 표현하면 다음과 같다. (println에 로직이 들어간다고 생각할 수 있다) private fun validateNumber(num: Int) { if (num ..

[코틀린] data class란?

Kotlin data class에 대해서 알아보려고 한다. Java의 data class Car 이라는 객체를 예시로 Step By Step 접근을 해보자 Plain Java Object로 Car를 작성하면 다음과 같다. public class Car { private String name; private int price; } 여기서 Car 인스턴스 필드에 접근하기 위한 getter / setter 를 추가하면 아래와 같다. public class Car { private String name; private int price; public String getName() { return name; } public int price() { return price; } public void setName(..

[코틀린] ?. 연산자, ?: 연산자

코틀린에는 ?. 연산자가 존재한다. 일반적으로 객체지향적인 언어에서 . 연산자는 객체 인스턴스의 필드나 메소드에 접근하는 역할을 수행한다. 코틀린에서는 객체가 null 일 수도 있는 경우를 코드 상 명확히 하기 위해 . 대신 ?. 를 사용해야 한다. Java와 Kotlin으로 몇 가지 예시를 살펴보자 Java 에서의 . 연산자 다음과 같은 코드가 있다고 해보자. public void main() { System.out.println(getCarOrNull().getName()); } public Car getCarOrNull() { if (...) { return null; } return new Car(); } getCarOrNull 코드를 호출하면 조건에 따라 null이 올 수도 Car 인스턴스가 반..