AWS CloudFormation
·
Side Tech Notes
Coupon Infra 구축쿠폰 발급 서비스를 구현하면서 단순히 동시성을 잘 처리하는 것이 아닌 얼마나 효과적으로 빠르게 처리하는지를 확인해보기 위해 k6를 사용해 성능 테스트를 하려고 했습니다. 이왕에 테스트하는 거 로컬에서 스프링 애플리케이션을 실행시킨 뒤 테스트하는 것보단 실제 서비스와 같이 aws에 인프라를 구축해서 테스트하면 더 재밌을 것 같다고 생각했습니다. 이왕에 구축하는 거 로드 밸런싱이나 auto scaling도 구축해보고 싶었지만 그랬다간 요금 폭탄을 맞을 것 같았습니다. 그렇다고 테스트를 하는 동안에만 켰다가 사용 안 할때는 요금이 나가는 것들을 다시 지우는 과정을 반복하기엔 너무 번거로울 것 같고 혹시 까먹고 안 지우면 그대로 돈을 지불해야 되서 포기했습니다. 좋은 방법이 없을까 찾..
@Transactional과 동시성 제어를 위한 Lock의 관계
·
Side Tech Notes
Coupon Service최근 동시성 처리를 위한 연습을 하기 위해 쿠폰 발급 서비스를 구현하고 있습니다. 동시성 처리를 위한 방법으로 Redis의 분산락을 사용했습니다. 동시성 처리 방법하면 떠오르는 synchronized와 같은 애플리케이션 단의 Lock을 사용하지 않은 이유는 프로젝트를 시작하면서 처음부터 다중 서버 환경을 기준으로 생각했기 때문입니다. 애플리케이션 단의 Lock은 하나의 서버에서만 동시성을 제어하기 때문입니다.현재는 서버만 다중화한 상황을 가정했고 DB에 대한 다중화는 고려하지 않았습니다. 환경 세팅은 AWS의 CloudFormation을 사용했습니다. Erd Diagram 쿠폰 테이블은 타입과 쿠폰의 이름, 쿠폰 발급 가능 갯수와 만료 기한을 컬럼으로 가지고 있습니다.멤버 쿠폰은..
Slack은 어떻게 하루 수십억 개의 메시지를 처리할까
·
System Architecture
SlackSlack은 메신저 및 프로젝트 관리용 협업툴입니다. 원래 Slack은 처음부터 상업용으로 개발한 것이 아니고 타이니 스펙이라는 회사에서 Glitch라는 온라인 MMORPG 게임을 만들던 중 팀 커뮤니케이션을 위해 개발한 사내 도구였습니다. 하지만 Glitch가 실패하고 대신 협업 툴로 개발한 Slack을 발표했습니다. 그리고 막대한 성공을 거뒀습니다. 지금은 하루에만 억단위의 메시지를 전송하는 많은 사용자를 지니고 있습니다.이제 Slack이 이런 메시지들을 안정적으로 처리하기 위해 시도한 내용들을 정리하려고 합니다.초기 아키텍처Slack은 초기부터 서버를 2개로 나누었습니다. 하나는 인증, 권한, API 엔드포인트, 세션 관리 등 대부분의 애플리케이션 로직을 담당하는 Web App, 다른 하나..
LeetCode - 3337. Total Characters in String After Transformations II
·
Algorithm
문제링크 문제 설명소문자로 이루어진 문자열 s, 정수 t (변환 횟수), 그리고 크기가 26인 정수 배열 nums가 주어집니다.이때, 정확히 t번의 변환(Transformation)을 수행하게 됩니다. 각 변환은 아래 규칙에 따라 진행됩니다:문자열 s의 각 문자 s[i]를 다음과 같이 변경합니다:s[i] = 'a'라면 nums[0]개의 연속된 알파벳 문자로 변경됩니다.즉, s[i]는 다음 알파벳 문자부터 시작하여 nums[s[i] - 'a']개의 문자를 나열한 문자열로 대체됩니다.예: s[i] = 'a', nums[0] = 3이라면 'a' → "bcd"로 변환됩니다.예: s[i] = 'y', nums[24] = 3이라면 'y' → "zab"로 변환됩니다. (알파벳은 z 이후 a로 순환됩니다)이 과정을 정..
LeetCode - 3335. Total Characters in String After Transformations I
·
Algorithm
문제링크 문제 설명문자열 s와 정수 t가 주어집니다. 여기서 t는 총 변환 횟수를 나타냅니다.한 번의 변환(Transformation)에서 문자열 s의 모든 문자는 다음 규칙에 따라 변경됩니다:문자가 'z'인 경우 → 'ab'로 확장문자가 'z'가 아닌 경우 → 알파벳 상 다음 문자로 변경예: 'a' → 'b', 'b' → 'c', ..., 'y' → 'z'정확히 t번의 변환을 수행한 뒤의 문자열 길이를 구하세요.결과가 매우 클 수 있으므로, 정답을 10^9+7 로 나눈 값을 반환하세요.제한 사항1 s consists only of lowercase English letters.1 예시Example 1:Input: s = "abcyy", t = 2Output: 7Explanation:First Trans..
마이크로서비스 설계 패턴 핵심 요약
·
System Architecture
마이크로 서비스일반적으로 프로젝트를 진행하게 되면 하나의 서버에 모든 서비스 코드가 들어가게 됩니다. 이런 방식을 모놀리식 아키텍쳐라고 부릅니다. 모놀리식 아키텍쳐는 개발에는 용이하지만 이후에 서비스가 성공하여 규모가 매우 커지게 되면 여러 문제점이 발생할 수 있습니다.유연성 저하 : 간단한 수정 사항에도 전체 애플리케이션을 다시 빌드하고 배포해야 합니다.확장성 한계 : 특정 기능에만 부하가 증가해도 해당 기능만 확장하는 것이 아닌 전체 애플리케이션을 확장해야 합니다.기술 선택의 제약 : 전체 애플리케이션을 하나의 기술 스택으로 구현해야 하기 때문에 기술 도입이나 부분적인 기술 변경에 제약이 있습니다.장애의 영향 범위 확대 : 특정 기능의 장애가 전체 애플리케이션의 장애로 이어질 수 있습니다.이런 문제점..
LeetCode - 790. Domino and Tromino Tiling
·
Algorithm
문제링크 문제 설명너비가 n, 높이가 2인 보드가 주어집니다. 이 보드를 다음 두 종류의 타일로 채우려 합니다:도미노 타일 (2×1)트로미노 타일 (L자 모양의 3칸) – 회전 가능모든 칸은 타일로 정확히 한 번씩 덮여야 하며,두 타일링이 서로 다르다고 간주되는 경우는 다음과 같습니다:서로 상하좌우로 인접한 두 칸이 있을 때, 한 타일링에서는 하나의 타일이 두 칸 모두를 덮고 있지만,다른 타일링에서는 그렇지 않은 경우정수 n이 주어질 때,2 × n 보드를 타일링하는 서로 다른 방법의 수를 구하세요.단, 정답이 매우 클 수 있으므로 10⁹ + 7로 나눈 나머지를 반환하세요.제한 사항1 예시Example 1:Input: n = 3Output: 5Explanation: The five different way..
LeetCode - 1007. Minimum Domino Rotations For Equal Row
·
Algorithm
문제링크 문제 설명도미노 타일들이 일렬로 나열되어 있으며,각 도미노의 윗면과 아랫면 숫자가 tops[i]와 bottoms[i]로 주어집니다. (각 숫자는 1부터 6 사이입니다.)각 도미노는 회전시킬 수 있습니다, 즉, tops[i]와 bottoms[i]의 값을 서로 바꿀 수 있습니다.당신의 목표는 다음 중 하나를 만드는 것입니다:tops 배열의 모든 값이 동일해지도록,또는 bottoms 배열의 모든 값이 동일해지도록.가능하다면, 그렇게 만들기 위해 필요한 최소 회전 횟수를 반환하고, 불가능하다면 -1을 반환하세요.제한 사항2 bottoms.length == tops.length1 예시Example 1:Input: tops = [2,1,2,4,2,2], bottoms = [5,2,6,2,3,2]Output..
당신이 알아야 할 시스템 설계의 핵심 개념 20가지 - 2. 캐싱
·
System Architecture
1. 캐싱이란캐싱이란 자주 사용되는 데이터의 복사본을 캐시 또는 임시 저장 위치에 저장하여 빠르게 접근할 수 있도록 하는 프로세스를 의미합니다.왜 사용할까클라이언트에서 서버에 데이터를 요청하거나 서버에서 DB의 데이터를 읽어오는 등 데이터를 받아올 때는 항상 일정 리소스가 소모됩니다. 그래서 원래의 데이터보다 더 빠르게 접근이 가능한 곳에 복사본을 위치시켜 리소스를 줄이고 응답 시간을 향상 시키기 위해 캐싱을 사용하게 됩니다. 보통 Redis를 활용하여 캐싱을 사용합니다. 2. 캐싱 전략1) 읽기 전략 (Read Strategies)Look Aside데이터를 찾을 때 캐시에 데이터가 있는지 먼저 확인한 후 만약 캐시에 데이터가 없으면 DB에서 조회하는 전략입니다. 읽기 작업이 빈번한 경우에 적합하지만 데..
당신이 알아야 할 시스템 설계의 핵심 개념 20가지 - 1. 로드 밸런싱
·
System Architecture
1. 로드 밸런싱이란로드 밸런싱은 애플리케이션을 지원하는 리소스 풀에 들어오는 네트워크 트래픽(들어오는 요청)을 균등하게 분산하는 것을 의미합니다. 간단히 비유하면 은행에서 고객들(네트워크 트래픽)을 대기 번호표를 뽑게 한 뒤 여러개의 창구(서버)에서 각 고객의 업무를 처리한다고 볼 수 있을 것 같습니다.왜 필요할까?대부분의 간단한 프로젝트에서는 요청이 많이 들어올 일이 거의 없습니다. 그래서 한 대의 서버로도 충분히 트래픽을 감당할 수 있습니다. 하지만 커다란 서비스(토스, 배민, 네이버, 등...)에서는 매우 많은 요청이 들어오기 때문에 한 대의 서버로는 그 트래픽을 감당하기 힘듭니다. 그래서 여러 대의 서버를 구축해 트래픽을 나눠서 서버 1대가 처리하는 트래픽을 줄이기 위해 로드 밸런싱을 사용합니다..