Programming-[Backend] (417) 썸네일형 리스트형 Stream 방식의 이해: RTSP, RTMP, HLS, WCS(Web Call Server), CCTV 접속 방식 1. Stream의 다양한 프로토콜 정리는 참조 페이지에 잘 나와있다! https://jee00609.github.io/live%20stream/Live-Stream/ 데이터 인터넷에서 실시간 Stream 영상을 보는 것은 일반적인 간단한 데이터를 주고 받는 것이 아니라 실시간으로 전송되는 바이너리 데이터를 기반으로 이루어진다. 그리고 이 바이너리 데이터는 보통 '영상' 부분과 '오디오' 부분이 분리되어서 전송된다. 그러면 이걸 받는 쪽에서 합쳐서(Muxing) 타임라인에 맞게 영상-오디오를 동기화해서 재생하는 방식이다. 프로토콜 HTTP 같은 규약을 통해서 이루어지는 것이 아니라 RTSP(Real-Time Streaming Protocol), RTMP(Real-Time Messaging Protocol.. reverse relationship: _set 호출 시 get_ 메서드에서 N+1 발생 문제 reverse relationship을 가진 속성값을 _set을 통해서 호출할 때, get_ 메서드에서 N+1 문제가 발생했다. 해결 예를 들면 아래 예시 코드에서, student_set을 통해 Related Manager로 set을 불러올 때 .all()을 사용하면 안되고 .first()등으로 특정 로우를 한정해야한다. 그렇지 않으면 여러 개의 School -> 여러 개의 Student가 호출되면서 N+1 문제가 필연적으로 발생한다. class SchoolListSerializer(serializers.ModelSerializer): latest_student_name = serializers.SerializerMethodField() def get_latest_student_name(self, .. API Throughput, health check fail: async 요청이 한 번에 많이 들어올 때 문제 및 원인 특정 컨테이너의 health check가 주기적으로 fail이 발생했다. 다행히 운영환경은 아니고 테스트 환경이였는데, 로그를 추적해보니 클라이언트 쪽에서 비동기 요청을 한 번에 10개 가량 요청하여(10개 이상/ 1초) 서버에 요청 처리가 쌓인 상태에서 /health 로 헬스 체크가 들어오면 헬스 체크에 실패하는 상황이였다. 문제는 헬스 체크 실패 시 해당 컨테이너를 재시작하는 설정이 적용되어 있어서 컨테이너가 죽다보니 클라이언트에서도 문제가 있다고 알려주었다. 그리고 monitoring 툴인 Pixie로 HTTP 지연을 관찰했을 때 순간적으로 지연이 엄청 늘어나는 것을 볼 수 있었다. 해결 및 원리 1. gunicorn worker, thread 개수 늘리기 파이썬은 인터프리터로 싱글 .. Decorator 개념과 적용, @wraps Decorator decorator는 함수를 파라미터로 받아서 그 함수를 실행하면서 다른 기능들을 실행할 수 있도록 해주는 패턴이다. 여기서 다른 기능들이란 인자로 받는 함수의 실행 전, 후로 로그인, try-catch문 등 반복적으로 수행되는 작업을 의미한다. 참조1의 예시가 가장 이해하기 좋고 일반적인 예제인것 같다. decorator_exam 메서드에서 인자로 받아오는 함수 func를 내부 함수 decorator_func에서 다른 기능들과 함께 실행한 후 리턴하도록 만들어준다. 그러면 @decorator_exam을 위에 써준 함수들을 실행했을 때, 해당 기능이 작동한다. def decorator_exam(func): def decorator_func(): print('함수 시작') func() pr.. [TIL] Python O(n)은 몇 초 정도일까 (Casting, converting) 100만개 원소를 가진 list를 set으로 변환하면 실제 시간은 얼마나 걸릴까? set 변환은 O(n)의 시간복잡도를 갖는다.import time l = [] for i in range(1000000): l.append(i) start_time = time.time() s = set(l) end_time = time.time() print(f"execution time = {end_time - start_time:.4f} seconds")상황에 따라 다르겠지만, 평균적으로 0.03초 정도 걸렸다. 로컬, macOS m1, python 3.10 기준이다. [TIL][link] DB Connection Pooling, context manager DB Connection Pool은 여러 클라이언트의 DB 접속 요청을 위해 미리 세션을 만들어놓고 배분하는 것을 뜻한다. 이렇게 미리 만들어 놓지 않으면 DB는 접속 요청이 올 때마다 세션을 생성하는 작업을 반복해야해서 성능에 좋지 않다. 참조 링크 글에서는 connection pool을 설정하지 않거나 설정하고 DB에 연결 요청을 했을 때 소요 시간을 비교한다. SQLAlchemy를 사용하였으며, 아래 코드에서 poolclass=QueuePool 부분이 ConnectionPool 설정을 해주는 부분이다. from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import QueueP.. [탐험] 테스트하기 좋은 코드, private과 given이 너무 많을 때 대략적으로 공부하고 깨달은 부분이라 정확하지 않을 수 있다. 개발 업무를 해나가면서 계속해서 개선할 내용이니, 일단 참고만 하자 문제상황 테스트 코드를 작성하는데 public 메서드 1개에 여러 개의 private 메서드가 포함되었다. 많은 참조 자료에서 private 메서드를 테스트하는 것은 바람직한 방향이 아니라고 한다. ( 참조 3. 자바에서 private 메서드를 import할 때 Reflection을 사용하게 되는데, Reflection은 컴파일 에러를 유발하지 못하므로 메서드 이름 변경 등에 취약하다. 그리고 애초에 private은 외부 참조가 안되도록 만들어놓고 결합도를 낮추어 놓은 측면이 있는데, 이를 무시하게 되는 것이 된다.) 그러나 각 메서드를 private으로 처리한 것은 정말 해당.. [TIL] 파이썬 단일 메서드 실행 디버깅 - shell_plus 앱의 환경 설정 조건에 구애받지 않고 단일 메서드를 테스트하고 싶다면 아래 명령어로 파이썬 인터프리터를 실행하면 된다. python manage.py shell_plus mac의 경우 python 대신 python3 입력 이후 콘솔창에서 변수를 생성하고, 함수를 import 후 해당 위치의 함수에 break point를 잡고 실행하면 디버깅이 가능하다. 예를 들어서, projects/utils.py 위치에 아래와 같은 메서드가 있다면 def test(name: str) -> str: ... 해당 메서드에 break point를 설정한 뒤 콘솔에서 아래 명령어들을 실행하면 된다. name = "테스트 이름" # 인자값을 변수로 생성 from projects.utils import test # py 파일 i.. 이전 1 ··· 11 12 13 14 15 16 17 ··· 53 다음