Architecture (20) 썸네일형 리스트형 대규모 채팅 서비스 개발에 대한 회고 이 글에서는 Kafka 기반의 대규모 채팅 서비스를 직접 설계하고 구현하며 마주친 문제와, 이를 어떻게 해결했는지를 기록합니다.인프라 아키텍처부터 코드 레벨의 구조 개선, 서비스의 생명주기 까지 순차적으로 회고합니다. 1. 서비스 구성을 위해 정해야 할 것각 노드간 통신을 어떻게 해야할지?단일 노드 사용 시 성능 한계와 노드 다운에 대한 안정성 문제가 있어, 멀티 노드로 구성하겠습니다. 그럼 멀티 노드간에 사용자에 대한 통신 문제를 아래 '짱구' 와 '철수' 예제로 보겠습니다.(Node는 서버 또는 Pod를 의미하며, client는 현재 연결된 connection을 의미합니다.) 위와 같이 Node를 구성 할 경우 '짱구'와 '철수'는 각기 다른 Node를 통신하기에 메시지 송수신이 불가능합니다. 짱구와.. 선착순 이벤트 아키텍처 구성 선착순 이벤트 인프라 아키텍처를 구성해보겠습니다. 선착순 이벤트는 짧은 시간에 많은 트래픽이 몰리고, 정확한 수량만큼만 제공되어야 합니다.수량이 초과되면 마케팅 비용의 손실이 발생할 수 있고, 많은 트래픽으로 인해 서버가 다운될 수 있어 다음 조건에 맞춰 아키텍처를 구성해야 합니다. 여기서는 백엔드 이벤트 API 서버를 중점으로 설명합니다. 이벤트를 설계하기 위한 조건은 아래와 같습니다.이벤트 수량을 정확히 제한해야 합니다.높은 트래픽에서도 빠른 응답 속도를 유지해야 합니다. 이 글에서는 인프라 아키텍처를 먼저 소개한 뒤, 서비스 구성을 설명하겠습니다. 작업 절차쿠폰 발급 이벤트를 예시로, 처리 절차는 다음과 같습니다.사용자의 쿠폰 발급 요청을 받습니다.중복 없이, 정해진 수량 내에서 쿠폰을 발행합니다... Java 에서의 데이터 입출력(I/O), Byte Stream 자바에서 입출력(I/O)은 생각보다 매우 단순합니다. 네트워크든 파일이든 결국 하나의 입구(InputStream)와 하나의 출구(OutputStream)로 통일됩니다.InputStream과 OutputStream은 바이트 스트림으로이 글에서는 특히 자주 사용되는 Socket과 File입출력을 중심으로 Java의 I/O 구조를 쉽게 살펴보겠습니다. InputStream과 OutputStream 바이트 스트림자바의 I/O 핵심은 InputStream과 OutputStream입니다. 이들은 모든 바이트 스트림의 최상위 추상 클래스이며, 데이터를 읽거나 쓸 수 있는 공통 메서드를 제공합니다.InputStream: 데이터 입력(읽기, 수신)을 위한 스트림OutputStream: 데이터 출력(쓰기, 송신)을 위한 .. CDN 이란? 글로벌 서비스 캐싱 전략 CDN(Content Delivery Network)는 사용자와 서버가 물리적으로 멀리 떨어진 경우 발생하는 응답 속도의 한계를 극복하기 위해 고안된 서비스입니다. 왜 CDN이 필요한가?만약 한국의 사용자가 미국에 위치한 서버에서 동영상 스트리밍 서비스나 고화질 이미지를 요청할 경우, 아무리 서버에서 고성능의 캐싱 전략을 사용하여 즉시 응답하더라도 물리적인 거리로 인해 필연적으로 지연이 발생합니다. 이러한 지연 문제를 해결하기 위해 등장한 서비스가 바로 CDN이며, CDN은 사용자의 요청을 빠르게 처리할 수 있도록 사용자 가까이에 위치한 Edge 서버를 활용합니다. CDN의 동작 방식사용자의 요청은 가장 가까운 Edge 서버로 전달됩니다.Edge 서버가 정적 리소스(js, css, 이미지 등)를 캐싱하고.. Spring Security 없이 OAuth2 클라이언트 직접 구현 OAuth2 인증 절차OAuth2 클라이언트를 Spring Boot 만 사용하여 구현해보겠습니다.Spring Security 없이, 순수 HTTP 통신과 세션 기반으로 인증 흐름을 직접 설계함으로써OAuth2의 내부 동작을 보다 깊이 있게 이해해보는 것이 목적입니다. 매우 간단합니다. 깃허브에서 전체 코드 확인하기:https://github.com/youseonghyeon/oauth2-client GitHub - youseonghyeon/oauth2-client: oauth2-client 구현을 위한 리포지토리oauth2-client 구현을 위한 리포지토리. Contribute to youseonghyeon/oauth2-client development by creating an account on Gi.. OAuth2 인증 Flow OAuth2는 서버에서는 사용자의 ID/PW 없이, 인증 서버를 통해 인증을 수행하는 프로토콜입니다.즉, 사용자가 직접 로그인 정보를 입력하지 않고도 Google, GitHub 등 외부 인증 서비스를 통해 로그인할 수 있게 해줍니다. 사용자와 클라이언트 모두 보안에 대한 부담을 낮춰줄 수 있습니다. 용어 정리OAuth2 에서는 의미가 비슷한 용어가 있어서 글에서 아래 용어는 다음과 같은 의미로 사용하겠습니다.사용자 : 사용자 + 프론트엔드(브라우저) 를 통합한 개념클라이언트 : OAuth2 인증을 연동하는 애플리케이션 서버 (예: my-service)인증 서버 : OAuth2 인증을 제공하는 서버 (예: Google, GitHub)여기서는 흔히 사용되는 구조인 (사용자 - 웹서버 - API서버) 구조로써.. 소프트웨어 복잡성 소프트웨어 복잡성개발을 시작한 지 2년이 넘어가고 개발 팀장이 되면서 소프트웨어 복잡성이라는 벽을 실감하기 시작했습니다. 작은 애플리케이션을 만들 때는 모든 게 단순해 보였지만, 시스템이 커져갈수록 보이지 않던 복잡성이 곳곳에서 드러났습니다.재미있게도 이 복잡성은 단순히 코드 구조나 아키텍처 문제만이 아니였습니다. 조직 구조, 커뮤니케이션, 일정 압박, 우선순위 결정 등 비기술적인 요소들과 복잡하게 얽혀 있다는 것입니다. 한가지 예를 들어보겠습니다. 어떤 서비스가 Web 서비스와 API 서비스를 모두 제공한다고 가정할 때, 사용자의 요청으로 ‘A’라는 기능을 개발하게 되었습니다. 처음엔 Web 서비스에만 우선적으로 기능을 추가하고, API 서비스는 나중에 개발하기로 계획했습니다. 그러나 시간이 흐르면서 .. 코어 수에 따른 프로세스와 쓰레드 개수의 관계와 성능 영향 코어 수와 쓰레드 수의 관계는 멀티스레드 프로그래밍에서 성능 최적화의 핵심 요소입니다. 쓰레드 수가 특정 코어 개수와 맞지 않을 때 성능이 저하되는 이유는 여러 가지가 있으며, 이는 CPU가 수행하는 컨텍스트 스위칭, 메모리 대역폭 문제, 그리고 CPU 코어의 오버헤드와 관련이 있습니다. 이를 구체적인 예시로 살펴보겠습니다. 1. 코어 개수와 쓰레드 개수의 관계CPU는 보유한 코어 수만큼 작업을 동시에(병렬성) 수행할 수 있습니다. 예를 들어, 4개의 코어가 있는 CPU는 이론적으로 최대 4개의 쓰레드를 동시에 실행할 수 있습니다. 이보다 많은 쓰레드가 실행될 경우, 운영 체제는 TCB(Thread Control Block)을 사용해 각 쓰레드의 상태를 저장하고 복구하면서 컨텍스트 스위칭을 수행하게 됩니.. 이전 1 2 3 다음