본문 바로가기

전체 글847

레디스 클러스터 모드 MGET 동작 방식(feat. Lettuce) 개요토요일마다 우아한 대규모 시스템 설계 스터디2에 참여하고 있다. 스터디 때 마다 각자 책을 읽고 질문거리를 들고와서 함께 토론하는 형식이다. 2장 주변 친구 주제의 55페이지를 보면 "위치 정보 캐시에 일괄(batch) 요청을 보내어 모든 친구의 위치를 한번에 가져온다."라는 문장이 있다. 레디스 클러스터 모드인 경우 데이터 저장 시 해시 슬롯 알고리즘을 통해 데이터가 저장될 노드를 결정한다. 한마디로 여러개의 레디스 노드에 분산되어 저장된다는 것이다. 이런 경우 MGET으로 한번에 데이터를 가져올 수 없다. 따라서 55페이지에 나와있는 것 처럼 배치 요청을 통해 가져올 수 없는 것이 아닌가? 라는 의문이 들었다. 이에 관해서는 다음과 같은 방법을 사용해볼 수 있겠다.레디스 클러스터 모드가 아닌 스.. 2024. 6. 13.
인프런 2시간만에 끝내는 코루틴 8강 ~ 10강 정리 8강. suspending functionsuspend 함수는 suspend가 붙은 다른 함수를 호출할 수 있다. 그리고 suspend 함수는 코루틴이 중지되었다가 재개될 수 있는 지점을 의미한다. 중요한건 중지가 될수도 있고 안될수도 있다는 것이다. fun main(): Unit = runBlocking { launch { a() b() } launch { c() }}suspend fun a() { printWithThread("A")}suspend fun b() { printWithThread("B")}suspend fun c() { printWithThread("C")}// 결과Thread: main, AThread: mai.. 2024. 6. 12.
인프런 2시간만에 끝내는 코루틴 1강 ~ 7강 정리 1장. 루틴과 코루틴의 차이runBlocking: 일반 루틴과 코루틴을 연결하는 함수이다. runBlocking을 통해 새로운 코루틴을 만들 수 있다.launch: 반환값이 없는 코루틴을 만든다.suspend fun: 다른 suspend fun을 호출할 수 있다.yield: 현재 코루틴을 중단하고 다른 코루틴이 실행될 수 있도록 스레드를 양보한다. (제어권을 넘겨준다)fun main(): Unit = runBlocking { println("START") # 1 launch { # 2 newRoutine() } yield() # 3 println("END") # 6}suspend fun newRoutine() { val.. 2024. 6. 12.
200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 정리 개요본 포스팅은 "200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법" 인프런 강의의 내용을 정리한 글입니다. PrepareCREATE TABLE test1( seq INT PRIMARY KEY AUTO_INCREMENT,    one_field BIGINT,    two_field BIGINT,    hash_email VARCHAR(500),    INDEX idx_hash_email(hash_email),    INDEX idx_col1_col2(one_field, two_field));Multiple Column IndexMultiple Column Index란 복합 인덱스를 의미한다. 복합 인덱스에서 가장 중요한 것은 명시된 컬럼의 순서에 따라 정렬이 된다는 점이다... 2024. 6. 9.
카카오 JDK 21의 신기능 Virtual Thread 알아보기 정리 개요본 포스팅은 카카오 테크밋에서 안정수님이 발표하신 "JDK 21의 신기능 Virtual Thread 알아보기" 영상을 본 후 글로 정리한 것입니다.Virtual Thread란 무엇인가Virtual Thread는 JDK 21에 새롭게 추가된 기능이다. 기존 플랫폼 스레드와는 달리 경량 스레드로써 OS스레드를 그대로 사용하지 않고 JVM 내부 스케줄링을 통해 수십만~수백만개의 스레드를 동시에 사용할 수 있게 해준다.전통적인 Java의 ThreadJava의 Thread는 OS Thread를 Wrapping한 것이다. (Platform Thread)Java 어플리케이션에서 Thread를 사용하면 실제로는 OS Thread를 사용한 것이다.OS Thread는 생성 갯수가 제한적이고 생성, 유지하는 비용이 비싸.. 2024. 5. 16.
틴더(Tinder) 시스템 디자인 Problem Statement틴더와 같은 위치 기반 데이팅 어플리케이션을 디자인해본다. 틴더는 오른쪽 스와이프를 통해 좋아요를 보내거나 왼쪽 스와이프를 통해 싫어요를 보낼 수 있고 매칭된 유저와 채팅할 수 있는 기능들을 제공한다.Gathering RequirementsIn Scope이 어플리케이션은 아래의 요구사항을 충족시켜야 한다.유저는 간략한 프로필과 사진을 업로드하여 자신의 프로필을 생성할 수 있다.유저는 지리적으로 근접해있는 지역의 유저를 추천받을 수 있다.유저는 추천받은 유저에게 오른쪽으로 스와이프하여 좋아요를 보내거나 왼쪽으로 스와이프하여 싫어요를 보낼 수 있다.유저는 타 유저와 매칭된 경우 알림을 받을 수 있다.유저가 다른 지역으로 이동해도 해당 지역과 근접한 지역의 유저를 추천받을 수 있.. 2024. 5. 16.