본문 바로가기

백엔드26

Good Retry, Bad Retry 장애 스토리 Good Retry, Bad Retry 장애 스토리정말 좋은 글이기에, 아래 블로그에 있는 내용에 대한 리뷰를 써보고자 한다.https://medium.com/yandex/good-retry-bad-retry-an-incident-story-648072d3cee6 Good Retry, Bad Retry: An Incident StorySometimes, a seemingly simple and obvious solution can lead to a series of problems later on. This is especially true when adding retries.medium.com리뷰를 하기에 앞서 초보자들도 이해를 돕기 위해 몇가지 예시는 임의로 추가를 하였고 교정하였음을 알려 드린다. .. 2024. 11. 27.
FastAPI의 Uvicorn + Gunicorn 결합은 반드시 필요한 것인가? 개요 FastAPI는 비동기 프레임워크로 ASGI 서버를 지원하는 Uvicorn 과 함께 기동되어 사용된다. 다른 Flask, Django와 비교하여 성능이 2배정도 빠르다고 알려져있다. 하지만 성능이 빠르다고한들 개발자가 사용방법을 모르고 개발한다면 제대로 된 성능을 끌어올리기에는 어려움이 있을 수 있다. 우리는 정말 제대로 알고 사용하고 있는것인가? 이번 포스팅에서는 Uvicorn이 반드시 Guicorn과 결합이 필요한지에 대하여 알아보고자한다. 배경지식 Gunicorn이란 무엇인가? Gunicorn 은 WSGI 프로토콜을 사용하여 웹 애플리케이션과 상호 작용하는 서버이자 프로세스 관리자이다. Flask 또는 Django 와 같은 WSGI 동기식 웹 프레임워크로 작성된 애플리케이션을 제공한다. Gun.. 2024. 4. 10.
FastAPI 동기/비동기 동작 방식 분해해보기 개요 회사에서 FastAPI 프레임워크로 개발해서 서비스 런칭하는 일이 잦아지면서 백엔드와 FastAPI 사용방법에 대한 지식이 부족하다는 것을 요즘 느끼고있다. 디테일하게 공부하고자하는 마음에 여러가지 실험한 결과에 대해 오랜만에 블로그에 포스팅하고자한다. 이론으로는 알지만 게을러서 실험해보지 못했던 FastAPI 동기/비동기 동작 방식 분해해보기 먼저 작성해보려고한다. 우선 FastAPI 동기/비동기 동작 방식을 알아보기 전에 동기식 웹 방식 vs 비동기식 웹 방식의 기본적인 배경 지식부터 알아보고 가자 동기식 (sync) 웹 방식 전통적인 WSGI (Web Server Gateway Interface) 프레임워크에서 1개의 요청당 1개의 스레드 (Worker)를 생성하여 처리하는 방식이었다. 비동기.. 2024. 4. 5.
Web 3.0에 대해 알아보자 Web 3.0은 무엇인가? Web 3.0은 탈중앙화, 검증 가능성, 보안성을 추구하는 개방적이고 공정한 웹을 지향하는 혁신적인 인터넷 세대이다. 사용자의 데이터를 소유하고, 사용자 간의 상호 운용성이 높은 P2P 네트워킹 모델을 채택하여 중개자를 제거하며, 검증 가능한 사용자 경험과 다양한 분산형 애플리케이션(DApp)을 지원한다. 이를 통해 안전하고 신뢰성 있는 온라인 환경을 제공하며, 스마트 계약과 프로토콜을 활용하여 효율적인 거래를 이루어낸다. 시멘틱 웹 시멘틱 웹(Semantic Web)이라고도 불린다.기존의 웹은 단순한 텍스트와 하이퍼링크로 구성되어 있었기 때문에 기계는 해당 정보의 의미를 이해할 수 없었습니다. 하지만 시멘틱 웹은 정보를 의미론적으로 표현함으로써 기계가 그 의미를 해석하고 자동.. 2023. 8. 2.
메모리 할당 기법 ptmalloc2 vs tcmalloc vs hoard vs jemalloc 비교 개요 우리가 서드파티 데이터베이스를 다루거나 운영체제 등을 설정할때 메모리를 할당하는 여러가지 기법이 있다. 대표적으로 ptmalloc2, tcmalloc, hoard, jemalloc등 있는데 이 기법에 대해 고찰해보자. 현대 메모리 할당 기법은 크게 차이가 나지 않지만 특정 상황에서는 우수한 성능을 발휘할 수 있다는 점을 인지하자 우선 개념부터 알아보자 PTMalloc2 PTMalloc2는 Doug Lea에 의해 개발된 메모리 할당기의 두 번째 버전이다. PTMalloc2는 기존의 PTMalloc보다 더 효율적인 메모리 할당과 관리를 제공하기 위해 개선되었다. 주로 glibc의 메모리 할당기로 사용되며, C/C++ 언어에서 사용되는 대규모의 동적 메모리 할당과 해제를 효율적으로 처리하는 것이 목표이다.. 2023. 7. 26.
동기 (synchronous) vs 비동기 (asynchronous) 동기 (synchronous) 프로그램들이 순차적으로 진행되며, 각 작업은 이전 작업의 완료를 기다리고 실행하는 것을 말한다. 비동기 (asynchronous) 여러 프로그램 작업들이 작업이 실행되는 동안 결과를 기다리지 않고 다음 작업을 수행한 것을 말한다. 예제 1) 아래 처럼 Task 1부터 Task 4까지 각각 대기하지 않고 순차적으로 비동기로 처리할 수 있으며 예제 2) 아래 처럼 Task 1 ~ Task2번까지 실행하고 난 후 대기하지 않고 Task 3 ~ Task 4를 실행할 수도 있다. 비동기 (asynchronous) vs 멀티 스레드 (multi thread) 비동기 프로그래밍 (asynchronous programming)은 여러 작업을 동시에 실행하는 방법론을 말한다. 비동기(asy.. 2023. 7. 11.
Python GIL (Global Interpreter Lock)에 대해 알아보자 저번에 학습한 이론대로라면 Thread 2개를 만들어서 실행하면 아래와 같은 그림으로 동작된다고 생각할 수 밖에 없다. (참조 : https://yscho03.tistory.com/293) 하지만 파이썬은 아래와 같이 동작하지 않는다. 파이썬에는 GIL(Global Interpreter Lock) 이 있기때문에 스레드에서 한 번에 하나의 스레드만 Python 바이트코드를 실행한다. GIL(Global Interpreter Lock) GIL(Global Interpreter Lock)은 CPython 인터프리터(파이썬의 표준 구현체)에서 사용되는 개념이다. GIL은 파이썬 스레드에서 한 번에 하나의 스레드만 Python 바이트코드를 실행하도록 제한하는 메커니즘이다. GIL은 파이썬이 C 언어로 작성된 확장.. 2023. 7. 11.
스레드 풀 (Thread Pool) Thread Per Request 모델 Thread Per Request 모델은 웹 서버에서 요청이 들어올 때마다 새로운 스레드를 생성하여 해당 요청을 처리하는 방식이다. 각 요청은 독립적으로 실행되기 때문에 동시에 여러 요청을 처리할 수 있다. 간단한 구현 각 요청에 대해 새로운 스레드를 생성하기 때문에 구현이 비교적 간단하다. 스레드는 일반적으로 운영체제에서 제공하는 기능을 사용하여 생성 및 관리할 수 있다. 동시성 Thread Per Request 모델은 여러 스레드를 통해 동시에 요청을 처리할 수 있으므로 동시성을 지원한다. 이는 대규모 트래픽을 처리하는 데 유용할 수 있다. 이렇게 계속 요청 들어올때마다 스레드를 생성하게 된다면? 컨텍스트 스위칭 오버헤드 스레드는 자원을 공유하면서 실행되기 때문.. 2023. 7. 11.
멀티 스레드 vs 멀티 프로세스 단일 프로세스 vs 멀티 프로그래밍 vs 멀티 태스킹 단일 프로세스 CPU에 한번에 하나의 프로그램만 실행되는 것을 말한다. 단일 프로세스의 큰 단점은 프로세스→ IO → 프로세스→ IO 이런 순으로 반복이 될때 IO 처리시간시 CPU가 유휴 상태가 되고마는 큰 단점이 있다. 멀티 프로그래밍 위에서 언급한 단일 프로세스를 극복하기 위한 처리 방법으로 나온 것이 멀티 프로그래밍 기법이다. 프로세스가 2개 존재한다고 가정했을때, 각 프로세스들은 CPU 시간을 일정한 시간 단위로 번갈아가며 할당받는다. 이렇게 함으로써, 프로세스들은 동시에 실행되는 것처럼 느껴지지만 실제로는 CPU 시간을 번갈아가며 사용하게 된다. 그러면 예를 들어서 프로세스-1이 시간이 길다면 어떻게 될까? 프로세스-2가 굉장히 많은 시간을.. 2023. 7. 10.
스핀락(Spinlock) vs 뮤텍스(Mutex) vs 세마포어(Semaphore) Overview 데이터의 일관성과 정합성을 유지하기 위하여 동시성 제어를 위해 사용되는 동기화 기법을 알아보고 각각의 차이점을 알아본다. 용어 정리 동기화(Synchronization)란? 여러 개의 스레드 또는 프로세스가 공유된 자원에 접근할 때 발생하는 문제를 해결하기 위해 사용되는 개념이다. 동기화를 통해 스레드 또는 프로세스들 간의 상호 작용을 조절하고, 데이터의 일관성과 정확성을 보장할 수 있다. 임계 영역(Critical Section)이란? 임계 영역은 여러 스레드나 프로세스에서 동시에 접근 가능한 영역을 말한다. 이 임계 영역에 동시에 접근하면 데이터의 일관성을 유지할 수 없거나, 예상치 못한 결과가 발생할 수 있어 임계 영역에 대한 동시 접근을 효율적으로 제어하기 위해 동기화 기법이 사용.. 2023. 7. 7.
OSGi에 대하여 알아보자 OSGi란? OSGi (Open Service Gateway initiative - 개방형 서비스 게이트웨이 이니셔티브) 프레임워크는 모듈형 소프트웨어 프로그램과 라이브러리를 개발 및 배포하기위한 자바 프레임 워크이다. 각 번들은 강하게 결합하고, 동적으로 로딩이 가능한 class, jar 그리고 명시적으로 외부 종속성을 선언하는 환경설정파일의 모음이다. 쉽게 이야기해서 OSGI는 번들 단위로 관리하고 실행할 수 있는 프레임워크를 말한다. OSGi 적용분야 이클립스 IDE OSGi 서비스 플랫폼은 홈게이트웨이 텔레매틱스 단말(예:BMW, SimensVDO), 모바일 단말 산업 자동화, 빌딩 자동화 PDA / 스마트폰 / 태블릿 등의 모바일 단말 그리드 컴퓨팅 백색가전 (예: BSH, 보쉬-지멘스 가전 합.. 2022. 5. 3.
Java OSGi Tutorial Github 소스 MathConsumer : https://github.com/yscho03/MathConsumer MathService : https://github.com/yscho03/MathService Tutorial (튜토리얼) 1. OSGi "MathConsumer" 생성 1-1. MathConsumer 프로젝트 생성 Activator Code package org.tutorial.helloosgi.mathconsumer; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class Activator implements BundleActivator { private static B.. 2022. 5. 3.
Java + Gradle을 사용하여 gRPC 서비스를 만들어보자 gRPC가 무엇인지 알아보기 전에 RPC가 무엇인지 알아보자. RPC란? RPC(Remote Procedure Call - 원격 프로시저 호출)는 다른 위치에서 클라이언트 요청을 통해 원격 프로세스를 실행하는 기술이다. RPC 사용의 여러가지 문제로 인해 개발자는 오늘날 대부분의 최신 분산 컴퓨팅 솔루션에서 RPC 사용을 피하고 REST 아키텍처를 선호하고 있다. RPC 문제점 RPC의 문제점은 무엇이길래 이렇게 사용을 안하게 되었을까? Sam Newman의 Building Microservices: Designing Fine-Grained Systems 는 마이크로서비스에서 RPC를 사용하는 3가지 이유가 여전히 의심스럽다고 언급했다. 주요 기술 결함으로는 다음과 같다. Java RMI와 같은 기술은 .. 2022. 4. 28.
Spring Boot - Hello World 시작해보기 Hello World 시작 1. 패키지 생성 오른쪽 마우스로 New → Package을 클릭하여준다. 생성할 패키지 이름을 입력한다 . (점)으로 구분하면 된다. 2. 컨트롤러 클래스 생성 SapleController.java가 만들어졌으면 다음과 같이 코딩한다. 먼저 class 위에 @RestController 어노테이션으로 지정해주자. @GetMapping 어노테이션은 www.웹 주소/hello 요청을 처리하겠다는 의미이다. package com.sample.dev.api; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestC.. 2022. 4. 13.
Spring Boot 환경설정 환경설정 방법 1. STS 다운로드 https://spring.io/tools 접속하여 STS(Spring Tool Suite)을 다운로드하여 설치한다. 다운받은 jar 파일을 클릭하면 압축이 자동으로 해제된다. 2. OpenJDK 설치 https://jdk.java.net/java-se-ri/8-MR3 접속하여 다운로드한다. 윈도우 같은 경우 Windows 10 i586 Java Development Kit 을 클릭하여 다운로드하면 된다. 3. STS 실행 및 JDK 환경설정 3-1. STS 실행하고 워크스페이스 작업공간을 설정 3-2. Installed JREs 설정 Window → Perferences 를 클릭한다. 3-3. Compiler 설정 compiler를 다운받은 openJDK 버전에 맞게.. 2022. 4. 13.
Django vs Flask vs FastAPI 어떤 걸 사용해야 할까? 프레임워크 동향 아직까지는 github stars, Google Trends를 봐도 Django, Flask가 압도적인 추세이다. Django (장고) Django 프레임워크란? Django는 무료 오픈 소스인 python 웹 프레임워크이다. Adrian Holovaty와 Simon Willison이 2003년에 만들어졌다. Django 주요 목표 중 하나가 복잡한 데이터베이스 기반의 웹 사이트를 개발할 수 있도록 하는 것 적은 코드, 낮은 결합 및 재사용성, 연결 가능성 등 빠른 개발에 도움이 됨 Django 구축 사례 Instagram, Mozilla, Nextdoor 및 clubhouse와 같은 일부 대형 웹사이트에서 사용됨 Django 장점 MVC (모델-뷰-컨트롤러) 아키텍처를 활용한 데이터 베.. 2022. 4. 11.
Rest API란? REST란? REST (Representational State Transfer)는 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍처이다. 로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개되었다. HTTP와 URI 기반으로 자원에 접근할 수 있도록 제공하는 애플리케이션 개발 인터페이스이다. 기본적으로 개발자는 HTTP 메소드와 URI 만으로 인터넷에 자료를 CRUD 할 수 있다. REST 구성요소 메소드 리소스 모든 리소스를 명사로 표현한다. 다음과 같은 예제로 정의할 수 있다. 생성 유저를 생성한다. HTTP POST, http://sample.com/user { "name" : "yscho", "job" : "developer" } 조회 유저를 조회한다. HTTP PO.. 2022. 4. 11.
JVM 성능을 최적화 방법 JVM GC 최적화 JVM과 GC에 대해 지식이 있다는 가정하에 작성하였다. GC와 JVM 기초는 대한 기본 동작 방식 소개는 이전 페이지를 보면 나와있다. 1. 명시적 GC 알고리즘 설정 필요한 GC 알고리즘을 명시적으로 지정해주는 것이 좋다. 예를 들어 Java 8에서 기본 GC는 병렬 GC이고 Java 11에서 기본값은 G1GC이다. 이는 명시적으로 GC를 설정하지 않는 한 Java 8에서 Java 11로 업그레이드할 때 더 좋든 나쁘든 간에 사용자와 의지와는 상관없이 변경됨을 의미한다. -XX:+UseG1GC 2. Heap 크기 설정 -ms 와 -mx 옵션을 이용해서 힙 크기를 설정한다. 이러한 옵션으로 인하여 서버 안의 메모리의 최소, 최대를 조절할 수 있다. 간혹 -ms -mx와 같게 설정하시.. 2022. 4. 8.
JVM 과 Garbage Collection 동작 방식 Garbage Collection GC (Garbage Collection) 이란? 힙 메모리를 살펴보고 사용 중인 개체와 사용하지 않은 객체를 식별하고 사용하지 않는 객체를 삭제하는 프로세스이다. Java에서 메모리 할당 해제 프로세스는 GC (가비지 컬렉션)에 의해 자동으로 처리된다. 기본 동작 방식 Step 1: Marking (마킹) 사용 중인 메모리 조각과 사용하지 않는 메모리 조각을 식별하는 단계 Step 2: Normal Deletion (일반 삭제) 일반 삭제는 참조되지 않은 개체를 제거하여 참조된 개체와 포인터를 여유 공간으로 남김 Step 2a: Deletion with Compacting (삭제 및 압축) 성능을 더욱 향상시키기 위해 참조되지 않은 개체를 삭제하는 것 외에도 참조된 나.. 2022. 4. 7.
K6 성능 테스트 툴 K6이란? k6은 엔지니어링 팀의 성능 테스트를 쉽고 생산적으로 만드는 오픈 소스 부하 테스트 도구이다. k6은 무료이며 개발자 중심적이며 확장 가능하다. 주요특징 테스트 스크립트를 Javascript (ES6) 로 작성. jmeter (jmx) 대비 개발자 친화적이고, 시나리오와 함께 테스트 설정까지 코드로 구현 가능, 재사용을 위한 모듈화 가능 Jmeter 대비 더 작은 리소스로 성능 테스트 구현, 즉, jmeter 보다 동일자원에서 더 많은 트래픽을 생산 가능 window 설치방법 1. PowerShell을 활용하여 Chocolatey 패키지 매니저를 설치 C:\> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointM.. 2022. 3. 31.
인프라 관점의 성능 최적화 성능 최적화 인프라 관점 서버에 과부하가 걸리게되면 소프트웨어로 해결하는데는 어느정도 한계가 있다. 그렇기때문에 그 다음 순으로 물리적인 인프라를 증설하는 방법을 강구해야한다. 그렇다면 어느 시점에 어느 타이밍에 인프라를 증설하는게 맞는 것일까? 하는 물음이 생기게 된다. 정답은 없지만 임계치를 정하고 개념을 알아야 대응이 가능하다. CPU CPU가 100%가 차지하게되어 서버를 증설하려고하면 늦어도 한참 늦는다. 그럴 경우 이미 어플리케이션이나 데이터베이스등은 제대로 동작을 하지 않을 시점으로 장애가 발생한 후이다. 일반적으로 70~80% 까지 임계치를 설정해두고 20% 정도는 항상 여유를 남겨놓아 시간적 여유를 두어 증설할 수 있다. MEM Java와 같은 어플리케이션일 경우 JVM 메모리 제한을 설.. 2022. 3. 30.
모노리틱 아키텍처 vs 마이크로 서비스 아키텍처 모노리틱 아키텍처 (Monolithic Architecture) 정의 간단히 말해서 "하나의 애플리케이션 내에 모든 로직들이 포함되어 있는 웹 서비스 구조" 이다. 예를 들어 쇼핑몰을 구축한다고 가정하면 주문관리, 상품관리 등 백엔드 로직뿐만 아니라 이를 표현하는 프론트 UX 로직까지 모든게 포함되어 있다. 상호 호출을 함수를 이용한 참조에 의한 호출 (Call-by-Reference) 구조를 취한다. 장점 소형 어플리케이션 서비스 개발시 편리하다. 하나의 통짜구조이므로 테스트와 배포가 편리하다. 단점 개발시 크기가 커서 빌드, 배포 시간, 서버의 기동 시간이 오래 걸린다. 개발 단위가 커질수록 협업하기 힘들다. 참조에 의한 호출 (Call-by-Reference) 구조를 취하기 때문에 전체 시스템에 대.. 2022. 3. 30.
Django-DSL 동적 INDEX 생성 환경 Python 3.6 Django 2.1.1 ElasticSearch 3.6.x 요약 Django와 ElasticSearch을 연동해서 사용 중이다. 이번달은 LOG_201901, 다음달은 LOG_201902 ...으로 동적으로 INDEX (RDB 용어로는 테이블)을 생성하여 사용하고 싶다. ORM(Model)의 Meta 정보에 넣었으나 코드를 넣었으나 INDEX가 날짜별로 자동 생성되지 않고 처음 생성된 INDEX(예) LOG_201901) 에만 계속 쌓이는 문제가 있었다. 실행한 model 소스는 아래와 같다. 무엇이 문제일까? from elasticsearch_dsl import DocType, Text, Integer, Date import datetime class Statistics(Doc.. 2019. 2. 3.
Django - 프론트엔드 SPA 연동시 context parameter 설정 환경 Python 3.6 Django 2.1.1 VueJS Single Application 요약 Django 서버쪽에서 뷰 페이지(프론트)를 렌더링을 할때 특정 파라미터를 전달을 하여 사용하고싶은데 Django Template Code는 SPA의 어플리케이션 (Vue, React, Angular)의 템플릿 코드랑 겹쳐서 사용을 하기 애매하다. 예) {{ test = context.test }} 대응 서버쪽에서 context 에서 특정 파라미터를 설정하여 보내면 view.py에서 설정한 HTML 페이지 (정적인 페이지로 프론트에서 SPA 어플리케이션이 렌더링을 하기 전 단계이다. 프론트 페이지 렌더링 하기 전단계) 에서 javascript 전역 변수에 담아 사용하는 방법이다. view.py 코드 def .. 2018. 12. 31.
Django - 웹 서버 기동시 LOG 파일 엑세스 오류 환경 ㆍPython 3.6 ㆍDjango 2.1.1 요약 Django의 settings.py 에서 다음과 같이 일단위로 로그 파일을 생성하게 설정하였으나 어느날 다음과 같은 오류가 발생하였다. # logger LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': "[%(asctime)s][%(levelname)s][%(name)s:%(lineno)s][%(funcName)s] %(message)s", 'datefmt': "%Y-%m-%d %H:%M:%S" }, }, 'handlers': { 'file': { 'class': 'logging.handlers.TimedRotatingF.. 2018. 12. 31.
Django - DEBUG = False 일 경우 정적 파일 경로 설정 방법 환경 Python 3.6 Django 2.1.1 VueJS Single Application 요약 Django의 settings.py 에서 DEBUG = False 일 경우 프론트 페이지에서 static URL로 파일을 엑세스 할 수가 없다. 원인 static URL을 Django의 가이드 문서대로 아래의 코드와 같이 추가해주면 settings.py에 DEBUG = True에서 설정할 경우 static URL로 접근해도 파일 엑세스에 아무 이상이 없다. from django.conf.urls.static import static urlpatterns = [ ... url(r'^$', index_view, {}, name='index'), ] # We use a single global DRF Router.. 2018. 12. 31.
728x90
반응형