Python gRPC (2) - 기본 구조와 python 구현
·
탐구 생활/gRPC&Python
지난글에서 RPC (gRPC) 를 선택한 이유를 알아봤습니다. 이제는 python 에서 어떻게 gRPC 를 사용할 수 있는지 공유하겠습니다..proto 파일RPC는 엄격한 규칙을 따르기 때문에 IDL(Interface Definication Language)이 제공됩니다. 특히 구글에서 만들고 배포하는 gRPC는 관련 문서와 tool이 잘 구비되어 있어서 구현하기 용이합니다. gRPC를 구현하기 위해 가장 먼저 해야할 것은 서버와 메시지 규약을 정하는것입니다. 이러한 규약은 .proto 파일에 정의됩니다.Service 와 MessagegRPC는 Service를 통해서 호출될 함수를 정의하고, Message 를 통해서 호출 파라미터, 응답 값을 정의합니다.아래 예제는 protobuf bestpractice..
Python gRPC (1) - 왜 gRPC 를 선택했나
·
탐구 생활/gRPC&Python
MSA를 구현할때 각 서비스별로 분리된 데이터베이스를 관리합니다. 이 상황에서 화면으로 전달될 데이터가 하나의 서비스에 국한될 가능성은 거의 없을 것입니다. 이때 BFF 와 같이 각 서비스와 통신하여 데이터를 모아주는 역할을 하는 서비스가 존재하게 됩니다.이때 데이터를 동기화하는 다양한 패턴이 있지만, 실시간으로 데이터를 동기화해야하는 경우에는 gRPC 가 적합하다 판단했습니다. 이 글에서는 왜 그렇게 생각했는지 정리했습니다.MSA 에서 데이터 동기화 패턴Chris Richardson의 Microservice Pattern에 따르면 이라는 용어가 적합하지 않을 수 있습니다. 이 글에서 말하는 데이터 동기화 패턴이란 마이크로 서비스 환경에서 사용자의 요구에 따라 일관성있는 데이터를 전달하기 위한 패턴으로..
FastAPI log (4) - 개선하기
·
탐구 생활/FastAPI Log
이 시리즈는 AWS EKS & FastAPI 환경에서 로그를 적용하는 과정을 다루고 있습니다. 전체 시리즈는 다음과 같습니다.- FastAPI log (1) - AWS EKS Fargate 환경에서 log 를 외부시스템에 보내기- FastAPI log (2) -AWS EKS Fargate, 왜 Fluent Bit 인가?- FastAPI log (3) - 설계, 구현- FastAPI log (4) - 개선하기이전 글에서 FsatAPI 의 request, stacktrace를 logging 하는 Middleware 를 만들었습니다. 하지만 이러한 구현 접근에는 결정적인 오류와 개선사항이 있습니다.오류결정적인 오류는 Middleware 에서 Exception 을 catch 하고 있다는 점입니다. FastAPI..
SQLAlchemy read-only session
·
탐구 생활/개발 탐구
SQLAlchemy Readonly 에 대한 질문SQLAlchemy 도 Spring의 Transaction 처럼 read-only 를 만드는 기능이 있는지 물어보는 질문이 있었습니다. 이 글의 답변에도 작성했지만, 저도 SpringBoot 를 사용할때는 Transaction 격리수준, 전파수준 등을 엄청 신경썼었는데 FastAPI&SQLAlchemy 를 사용하면서 한번도 이런 고민을 안했습니다. 이게 개별 비즈니스 로직을 간단하게 유지할 수밖에 없는 프레임워크의 장점아닌 장점이라고 생각하면서 SQLAlchemy 에서 read-only transaction 을 만드는 방법을 알아보았습니다. Does SQLAlchemy automatically create a transaction for read-only..
FastAPI ErrorHandling 과 CORS (3) - 문제 해결
·
탐구 생활/FastAPI CORS
FastAPI 에서 ErrorHandling 하는 과정에서 CORS 문제가 발생하는 이슈와 그 원인을 그리고 그에 따른 사람들의 대응을 알아봤습니다. 그리고 저는 문제의 원인이 Starlette에 있다고 생각했고, 나름대로 연구하여 Starlette codebase 에 코드 3줄을 추가하여 이러한 문제를 해소할 수 있는 방법을 찾았습니다. 당장이라도 Starlette 에 PR 을 올리고 싶었지만, 의외로 다른 사람들의 더 나은 대안을 가지고 있거나 FastAPI 나 Starlette 에서 이미 관련 이슈를 해소할 계획일 있을지도 모르기 때문에 우선 discussion 을 이용하기로 했습니다.FastAPI Discussion[discussion link]이 문제가 FastAPI 에 문서화 될 계획이 있다면..
티스토리 스킨 hELLO 에 기여해보기
·
탐구 생활/개발 탐구
이전에 FatAPI 의 문서 번역에 기여한것에 이어서 FastAPI 의 공식문서에 내용을 변경하는 등 기여를 하고 있는중이다. 오픈소스 초보자의 FastAPI 기여하기회사에서 FastAPI 로 전환을 하기에 FastAPI Document 를 보면서 공부중이었다. 한국어로 번역된 문서도 있는반면 영어 그대로인 문서들도 있었다. 왜일까? 하고 찾아보던중 FastAPI Github 에서 번역활동probehub.tistory.com   FastAPI 에서 기여하는 흐름은 이런식이다.[Fork 를 한다] -> [적절한 이름의 Branch 를 만든다] -> [변경하고자하는 사항을 변경하고 PR을 올린다] -> [리뷰를 받는다] -> [머지 혹은 리젝된다] 하지만 이번에 티스토리 hELLO 에 기여했던 흐름은 전혀 ..
FastAPI & Postgres 로 multi-tenancy 구현하기
·
탐구 생활/개발 탐구
stackoverflow 를 돌아다니다가 "FastAPI multi-tenant 를 구현하는데 경쟁조건이 발생한다" 는 내용의 질문을 발견했습니다. 회사에서 FastAPI 에서 PostgreSQL 의 schema 단위로 tenant 를 구분하여 DB 에 연결하는 기능을 구현했는데, 생각보다 여기서 어려움을 겪는 사람이 있는것 같아서 내용을 정리해봤습니다.문제 분석우선 저는 질문자가 구현한 middleware 를 살펴봤습니다. 큰 흐름은 다음과 같습니다.ContextVar 를 이용한다.Request 가 있을때마다 SessionLocal 에서 session 을 얻어온다.얻어온 session 에서 switch schema 를 실행하고 request.state 에 db 라는 이름으로 넘겨준다.일단 주어진 코드로..
FastAPI ErrorHandling 과 CORS (2) - 대안 파악
·
탐구 생활/FastAPI CORS
Starlette 와 FastAPI 의 ISSUE(link,link) 에서는 다음의 해결법이 논의 되었습니다.논의된 해결법1. FastAPI 앱을 CORSMiddleware로 감싸기from: thomasleveilfrom starlette.applications import Starlettefrom starlette.authentication import AuthenticationBackend, AuthenticationErrorfrom starlette.exceptions import HTTPExceptionfrom starlette.middleware.authentication import AuthenticationMiddlewarefrom starlette.middleware.cors import ..