HA 아키텍처
·
System Architecture
고가용성이란HA(High Availability) 아키텍처는 말 그대로 고가용성 아키텍처를 의미합니다. 여기서 가용성이란 시스템이 정상적으로 사용가능한 정도를 의미하는 말입니다. 즉, 전체 시간 중 시스템이 다운되지 않고 정상적으로 사용가능한 시간의 비율입니다.현대 서비스에서 가용성은 직접적인 매출과도 관련된 중요한 속성입니다. 예를 들어 시간 당 1억씩 버는 쇼핑몰의 경우 1시간 동안 장애가 발생하면 1억의 손실이 발생하게 됩니다. 또한 할인 이벤트와 같이 서비스에서 중요한 순간에 장애가 발생하면 매출뿐만이 아니라 사용자의 경험에 안 좋은 영향을 주어 기회비용까지 잃게 됩니다. 즉, 브랜드 신뢰도와도 연관된 성질입니다. 이런 가용성을 백분율로 표시해놓은 수치가 있습니다. 아래 표는 위키피디아에서 가져왔..
메시징 패턴: Pub-Sub, Queues, and Event Streams
·
System Architecture
들어가며이전에 작성한 글에서 최종적 일관성에 대해서 알아봤습니다. 분산 시스템에서는 각 시스템간의 디커플링을 지원하기 위해 이벤트 기반으로 동작합니다. 각각의 서비스에서 이벤트를 발행하고 다른 서비스에서 해당 이벤트를 받아서 처리하죠. 그렇다면 여기서 이 이벤트는 어떻게 다른 서비스로 전달이 되는 걸까요?분산 시스템을 공부해보셨다면 메시지 큐라는 단어를 들어보셨을 겁니다. 이런 메시지 큐와 같은 메시징 시스템을 통해 이벤트(메시지)를 주고 받을 수 있는 것 입니다.메시징 시스템은 세 가지 주요 패턴을 가지고 있습니다.메시지 큐: 1:1 통신이며 메시지를 1번만 소비합니다.Pub/Sub(발행/구독): 1:N 통신이며 하나의 메시지를 여러 구독자가 소비합니다.Event Stream(이벤트 스트림): 순서가 ..
엔지니어링의 트레이드오프: 실제 환경에서의 최종적 일관성 (Eventual Consistency)
·
System Architecture
들어가기실시간성을 지원하는 서비스에서는 모든 데이터가 항상 완벽하게 일치되지 않는 상황이 있습니다. 예를 들어 SNS에서 누군가가 게시글을 업로드 했을 때, 친구 목록에는 바로 뜨지 않지만 몇 초 후에 보이는 경우가 있습니다. 이것을 최종적 일관성이라고 합니다.이 글에서는 최종적 일관성이 무엇인지, 최종적 일관성을 바탕으로 시스템을 어떻게 설계할 수 있을지에 대해 설명하려고 합니다.최종적 일관성이란분산 시스템에서 최종적 일관성이란 시스템의 각 부분이 특정 시점에서는 서로 다른 데이터 상태를 가지고 있을 수 있단 것을 의미합니다. 하지만 추가적인 업데이트가 발생하지 않는다면 시스템은 모든 구성 요소가 최종적으로는 동일한 상태가 될 것을 보장합니다.즉, 최종적 일관성을 기반으로 설계된 시스템은 노드 간의 순..
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로 순환됩니다)이 과정을 정..