기본 콘텐츠로 건너뛰기

라벨이 FastAPI인 게시물 표시

[FastAPI] socket.io with fastapi_socketio (feat:python-socketio, saw: 톱 2종)

안녕하세요 클스 입니다. 팀에 하나의 제품을 개발할 때 인력이 약 15명 이상 있을 경우 react, vue, flutter등  선택의 폭이 넓어집니다. 그런데 애매하게 5~8명이 back-end, front-end, db, infra  전부 하면서 web, android, ios 앱을 개발하기엔 쉽지 않습니다. 우리는 무엇을 선택하면 좋을까요?  현재 우리팀은 FastAPI, vuejs 를 기본으로 사용하고 있는데.. vuejs가 아직 react의 방대함 그리고 커뮤니티를 따라가지는 못하는  듯합니다. 확실히 react 보다는 사용하기는 제 경우는 쉬웠습니다. 사설이 길었네요~ 여하튼 이번에는 웹에서 실시간으로 사용자에게 알림(시스템 변경, 작업 완료...)을  실시간으로 전달하기위해 많이 사용하는 websocket과 socketio가 있는데 둘의 확실한 선택 기준은 서비스 환경에서 통신에 문제가 있는가 없는가에 따라 다릅니다. socketio는 통신이 막히면 가능한 방식을 찾아서 연결해서 사용자에게 메시지를 전달합니다. HTTP long polling 방식으로 전달을 합니다. 문제는 주기적으로  long polling를 합니다. 그리고 socketio client를 사용하면 서버가 재시작되면 자동으로 다시 연결해줍니다.  개발자 입장에서는 확실히 좋은 기능입니다.  그외 방기능, 브로드캐스팅, 속삭임등등 일반 채팅방을 쉽게 구현할 수 있습니다. 또한 일반적으로 kafka, redis 와 다양한 mq 서버들과 연동이 가능합니다. 1. 목표 간단한 채팅방이 가능한 채팅 기능을 만들어 본다 fastapi에서 socketio를 많이 사용을 안 하는지? 업데이트가 잘 안되고 있어서 github등의 예제로는 404 Not Found, 403 등의 오류가 나서 접속이 안되었다 => 이것 때문에 쓴 글이기도 하다 2. 사용 socket.io 기반으로 python-socketio를 fast...

[FastAPI] pydantic 에서 pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` 해결[SOLVED]

pydantic migration v1.x to v2.x 오류 해결 안녕하세요. 클스 입니다. FastAPI를 이용해서 kakao 로그인을 구현하고자 했습니다. poetry add 'pydantic[ 'email' ]' 설치를 했습니다. 그랬더니 v1.x --> v2.2로 업그레이드 되면서 기존에 동작하던 configs.py 에서 아래와 같은 오류가 발생했습니다. pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` 해결[SOLVED] [원인] from pydantic import BaseSettings 이 v2.x가 되면서 pydantic-settings로 이동되었다는겁니다. [해결] $ poetry self update  [선택사항] $ poetry add 'pydantic[email]'    $ poetry add 'pydantic-settings' 설치 합니다. $ poetry update  [선택사항] configs.py 소스에서 아래와 같이 수정하면 됩니다. from asyncio import streams # from pydantic import BaseSettings, Field # DELETE from pydantic_settings import BaseSettings # NEW from pydantic import Field class DefaultSettings ( BaseSettings ): APP_ENV: str APP_NAME: str APP_DESCRIPTION: str APP_VERSION: str APP_BUILD_NO: int 그리고 pydantic에서 local.env 파일을 설정할때 문자, 숫자에 대한 강력한 validation을 합니다. [local.env 기존]에는 문자든 숫자든 상관없이 알아서 해줬...

[FastAPI] uvicorn, hypercorn에서 worker 여러개 띄우기 (feat. 배드민턴 셔틀콕 추천)

안녕하세요. 클스 입니다. 오늘은 FastAPI에 여러개 worker를 실행하는 것을 해보려고 합니다. 많은 요청을 처리하기 위해서 worker를 해주면 좋습니다. worker의 계산은   2 x number_of_cores +1 이 적절하다고 합니다. 좀더 정확하게 산출해보려면 아래와 같이 계산하면 됩니다. number_of_workers = number_of_cores x num_of_threads_per_core + 1 MacOS의 터미널에서 $ sysctl -n hw.packages ==> MacOS에 장착된 cpu socket 수 $ sysctl hw.physicalcpu hw.logicalcpu ==> cpu의 core 수, 총 thread 수    num_of_threads_per_core(core당 thread 수) = hw.logicalcpu / hw.physicalcpu $ sysctl -n hw.ncpu 혹은 ==> core 수 $ sysctl -n machdep.cpu.thread_count ==> core 수 uvicorn과 hypercorn으로 실행하는데 --reload 옵션이 있으면 --workers는 무시되고 1개만 뜹니다. 그리고 reload process가 1개 실행 됩니다. 참고로 FastAPI 공식 문서 에서는 worker를 띄울때는 uvicorn 보다는 gunicorn을 사용하는게 좋다고 합니다. 그래서 저는 hypercorn을 많이 사용합니다. # uvicorn ```sh $ APP_ENV=dev uvicorn app:app --host "0.0.0.0" --port "8001" --reload $ APP_ENV=dev uvicorn app:app --host "0.0.0.0" --port "8001" --workers 4 ``` # hypercorn ```sh $ APP_ENV=dev hypercorn app:app --...