본문 바로가기

전체 글847

Block IO/Non-Block IO 개념 정리 I/O Input/Output의 약자로써 데이터의 입출력을 의미한다. 네트워크(소켓), File, Pipe, Device와 관련된 IO가 존재한다. Socket 네트워크 통신은 소켓을 통해 데이터가 입출력된다. 컴퓨터의 각 프로세스에서 서로 데이터를 주고 받을때는 반드시 소켓을 열고 데이터를 주고 받을 수 있다. 예를 들어 백엔드 서버의 경우 여러 클라이언트들과 각각 소켓을 열고 통신하며 요청을 처리한다고 볼 수 있다. Block I/O IO작업을 요청한 프로세스/스레드는 요청이 완료될 때까지 블락된다. 아래 그림을 통해 대략적으로 설명해보자면, - 스레드가 실행되다가 read라는 시스템 콜을 호출한다. - 만약 호출한 시스템 콜이 Blocking 시스템 콜이라면 호출한 스레드는 블락 상태가 된다. 그리.. 2022. 12. 13.
ASGI에서 HTTP Request 다루는 방법 ASGI with HTTP Reqeust 이전 글(https://www.hides.kr/1111)에서 ASGI 인터페이스의 기초에 대해 설명했다. 이제 HTTP Request의 메시지 구조에 대해 좀 더 자세히 살펴보고 ASGI에서 HTTP Request를 다루기 위해 Starlette 라이브러리에서 제공하는 data structure를 어떻게 사용할 수 있는지에 대해 알아본다. ASGI 어플리케이션에서 발생하는 첫 번째 일은 Request가 들어올 때 초기 정보들을 담은 Scope 딕셔너리가 인스턴스화 된다는 것이다. 아래 예제는 간단한 HTTP Request에 대해 Scope가 어떠한 형태로 구성되는지를 나타낸다. >>> scope = { "type": "http", "http_version": "1.. 2022. 11. 24.
ASGI와 HTTP ASGI Callable interface ASGI는 callable interface들로 구성되어있다. 첫 번째 API요청은 새로운 상태를 가진 컨텍스트를 설정하기 위해 수행되는 동기 함수 호출이다. 두 번째는 비동기 함수 호출인데, 이는 서버와 클라이언트간 통신을 위해 사용된다. 대략적인 기본 구조는 아래와 같다. def asgi_app(scope): async def asgi_instance(receive, send): ... return asgi_instance Scope Scope는 어플리케이션의 상태를 세팅하는 인자로 딕셔너리 형태로 구성되어있다. ASGI는 HTTP뿐만 아니라 다양한 인터페이스에서 사용할 수 있는데, 이 때문에 type이라는 중요한 키가 scope 딕셔너리 내부에 포함되어있다.. 2022. 11. 24.
SQLAlchemy와 AsyncIO를 사용할 때 발생한 문제점 개요 SQLAlchemy 1.4 비동기 세션을 통해 작업을 진행하던 중 아래와 같은 에러가 발생하였다. if self.session.twophase and self._parent is None: AttributeError: 'NoneType' object has no attribute 'twophase' 이에 대해 조사한 내용을 간단하게 정리한다. 환경 PostgreSQL SQLAlchemy 1.4.42 FastAPI 0.87.0 asyncpg 0.26.0 사전 지식 본 코드에서는 아래와 같은 형태로 비동기 세션을 사용하기 위한 환경을 구성하였다. SQLAlchemyMiddleware import uuid4 class SQLAlchemyMiddleware(BaseHTTPMiddleware): def __.. 2022. 11. 17.
동시성을 고려한 쿠폰 재고 시스템 설계 개요 커머스 도메인을 다루는 서비스를 보면 쿠폰을 제공하는 기능이 꼭 하나씩은 존재한다. 선착순으로 진행하는 경우도 있고 그렇지 않은 경우도 있는데, 대다수의 쿠폰은 재고를 가지기 마련이다. 단순하게 생각한다면 DB에 쿠폰의 재고를 저장해두고 유저가 쿠폰을 획득할 때 마다 재고를 하나씩 차감하면 된다고 생각할 수 있는데 여기에는 큰 문제점이 하나 존재한다. 예를 들어 100개의 쿠폰을 발급할 수 있다고 가정해보자. 99개의 쿠폰이 소진되었고 재고가 1개 남은 상태이다. 이때 A라는 유저가 재고를 조회하고 데이터베이스에서는 1개의 재고가 남았다고 알려준다. 그리고 동시에 B유저가 재고 조회를 진행하고 마찬가지로 데이터베이스에서는 1개의 재고가 남았다고 알려준다. 다음으로 A가 쿠폰을 획득함과 동시에 재고를.. 2022. 7. 28.
FastAPI BaseHTTPMiddleware 관련 이슈 개요 FastAPI에서 Custom Middleware를 생성할 때 일반적으로 BaseHTTPMiddleware를 상속받아서 구현하는 형태로 사용한다. https://www.starlette.io/middleware/#basehttpmiddleware Starlette의 Middleware 관련 문서에 들어가보면 자세한 내용이 나와있다. 하지만 해당 미들웨어의 경우 몇가지 이슈가 존재하는데 그에 관해 간단하게 살펴보고 해결책을 제시하고자 한다. 문제점 첫 번째로 중간에 Request가 끊기면 정상적으로 동작하지 못한다. No response에러가 발생하며 예외가 터지게 된다. 두 번째로 BackgroundTasks와 이슈가 발생한다. 첫 번째 이슈의 연장선으로, Request가 들어오고 Backgroun.. 2022. 7. 23.