SQL 중심 백엔드 알파

빠른 PostgreSQL API.
적은 메모리 사용량.

PostgreSQL 함수를 HTTP로 제공하고 WebSocket으로 변경 알림을 전달하는 Nginx용 Rust 모듈입니다.

GitHub

pgxio가 부가 작업을 줄이는 방법

Nginx 이벤트 루프

HTTP, WebSocket, 비차단 데이터베이스 I/O가 Nginx 이벤트 루프를 공유합니다.

데이터베이스 연결 재사용

준비된 문장과 파이프라이닝으로 반복 작업과 데이터베이스 왕복 횟수를 줄입니다.

JSON 재직렬화 없음

PostgreSQL의 JSONB 응답 텍스트를 그대로 전달합니다. 출력 검증을 끄면 응답 JSON 파싱도 생략합니다.

복사 없는 요청 전달 실험적

패치된 libpq 빌드는 조건에 맞는 요청에서 본문을 Rust와 libpq로 복사하는 작업을 없앱니다. 자동 버퍼 대여는 평문 데이터베이스 연결을 사용하는 조건에 맞는 큰 요청에 적용됩니다. 표준 빌드는 계속 복사합니다.

위 벤치마크는 복사되는 버퍼를 사용했습니다. 응답과 TLS에는 여전히 복사가 필요합니다.

작동 방식

pgxio.conf설정 발췌
# HTTP endpoints
pgxio_endpoint list_tasks
  web.list_tasks read_only;

pgxio_endpoint create_task
  web.create_task;

# WebSocket subscription authorization
pgxio_stream tasks
  web.authorize_tasks;
  1. 01

    SQL 함수 작성

    SQL 함수는 JSON을 받고 반환합니다. 쿼리, 비즈니스 규칙, 권한 검사를 처리합니다.

  2. 02

    엔드포인트 명시적 공개

    API가 제공할 함수를 선언하세요. pgxio는 JWT를 확인하고 각 함수를 트랜잭션 안에서 호출합니다.

  3. 03

    변경 사항 구독

    권한이 확인된 WebSocket 구독이 변경을 알립니다. 클라이언트는 HTTP로 현재 스냅샷을 다시 가져옵니다.

브라우저 / 클라이언트HTTP + WebSocket
Nginx 내부의 pgxioRust + 비차단 libpq
PostgreSQL함수 + 알림

구독은 영구적인 이벤트 로그가 아닌 변경 신호를 전달합니다. 재연결 시 클라이언트는 다시 구독하고 최신 스냅샷을 가져옵니다.

로컬 실행

기존 pgxio 소스 체크아웃에서 이 명령을 실행하세요. Docker Compose와 Python 3.9 이상이 필요합니다.

포함된 개발 환경은 localhost에 바인딩됩니다. pgxio는 알파 소프트웨어이며 이 설정은 로컬 탐색용입니다.

터미널 · pgxio 소스 체크아웃에서
bin/pgxio init
bin/pgxio up
TOKEN=$(bin/pgxio token alice)

curl http://localhost:8080/v1/create_task \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"title":"Hello from pgxio"}'

curl http://localhost:8080/v1/list_tasks \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{}'