GH GambleHub

다중 부품 수출 및 대규모 업로드

1) "큰" 수출이 필요할 때 및 중요한 것

시나리오: 재무 보고서, 사용자 활동 업로드, 감사/규제 기관, BI 업로드, 파트너 디렉토리, 백업. 주요 요구 사항:
  • 데이터 일관성 (스냅 샷/시점).
  • 볼륨 통과 (병렬 쓰기/읽기, 스트리밍 직렬화).
  • 재생 가능 및 부분 전달.
  • 무결성 (체크섬) 및 검증 가능성 (매니페스트).
  • 보안/PII (마스킹, 암호화, 액세스 제어).
  • 비용 관리 (압축, 타임 아웃, CNC, TTL).

2) 데이터 형식: 장점/단점

(PHP 3 = 3.0.6, PHP 4) 단점: 차폐, 유형 손실. 테이블 보고서에 좋습니다.
JSON 라인 (JSONL) - 객체당 라인별로 스트리밍 및 부분 샘플링에 편리합니다. 단점: 볼륨.
Parquet/Avro-열/회로 형식, 압축 및 푸시 다운 예측; 분석 및 빅 데이터에 이상적입니다.
혼합: API 다운로드 용 JSONL → Parquet으로의 오프라인 변환.

압축: 'gzip '/' zstd' (더 나은). 매우 많은 양의 경우-분할 아카이브 (부품 당 ~ 128-512MB).

3) 일관성: "스냅 샷" 을 얻는 방법

DB: 관련 읽기/SNAPSHOT 거래 격리; 스레드, 논리 복제 슬롯 또는 워터 마크 (최대 '업데이트 _ at '/버전).

이벤트 소싱: 오프셋 로그로 내보내기

슬라이스: "전체" 내보내기 + "델타" ('워터 마크' 이후 변경 사항 업로드).

4) 멀티 파트/청킹

4. "멀티 파트" 의 1 가지 유형

업로드 (우리에게): 멀티 파트/폼 데이터 (작은 파일), S3 멀티 파트 업로드 (MPU )/GCS Resumable (큰).
다운로드 (우리로부터): 개체 스택의 디렉토리 ('바이트 = 시작 엔드'), '멀티 파트/바이터' (한 응답의 여러 범위), "부품의 지퍼", 디렉토리.

4. 2 분할 전략

크기 별 (예: 부품 당 256MB).
키/날짜별로 ('테넌트 _ id', 'YYYY/MM/DD' 로 표시).
테이블/엔터티 별 (유형 당 개별 파일).

균형: 64-512MB의 일부는 병렬로 잘 다운로드되며 메모리를 과열시키지 않습니다.

5) API 아키텍처 내보내기 (비동기 모델)

단계:

1. 'POST/내보내기' → 대기열 작업 (메타 데이터: 형식, 필터, 암호화, 수명).

2. 작업자는 스냅 샷을 작성하고 데이터를 스트리밍하며 부품을 작성하여 스토리지를

3. 부품, 크기, 체크섬, 스키마 버전 목록으로 매니페스트 (JSON) 를 생성합니다.

4. 'GET/내보내기/{ id}' 는 상태를 반환하고 사전 서명 된 PK의 일부에 링크합니다.

5. 'GET/export/{ id }/manifest입니다. json '-검증/재 장전을위한 진실 기계.

매니페스트 예:
json
{
"export_id": "exp_2025_10_31_001",
"created_at": "2025-10-31T14:23:00Z",
"schema": "orders_v3",
"format": "parquet+zstd",
"parts": [
{"name":"part-00000. parquet. zst","size":268435456,"sha256":"...","url":"...","range":"bytes=0-268435455"},
{"name":"part-00001. parquet. zst","size":241172480,"sha256":"...","url":"..."}
],
"total_bytes": 509607936,
"encryption": {"type":"AES-256-GCM","key_id":"kms/keys/exp"},
"watermark": {"type":"updated_at","value":"2025-10-31T00:00:00Z"}
}

6) 재활용 가능

STP 범위: 클라이언트는 파일의 "꼬리" 를로드합니다: '범위: 바이트 = 241172480-'.
여러 범위: '범위: 바이트 = 0-999,2000-2999' → '콘텐츠 유형: 멀티 파트/바이 테랑' 응답.
고객 전략: 부품의 병렬 "작업자", 각각의 'sha256' 검증, 기하 급수적 인 백오프가있는 retrai.
CNC: 범위 지원, 대규모 응답 버퍼링 비활성화.

7) 우리에게 큰 다운로드 (재개 가능한 업로드)

S3 멀티 파트 업로드: 클라이언트가 부품을 다운로드 (5-5000) 하고 서버가 'CompleteMultipartUpsing' 을 수집합니다.
GCS Resumable (한 세션, 오프셋) 클라이언트는 'Content-Range' 를 계속할 수 있습니다.
TUS (프로토콜) 는 HTTP 위에 독립적 인 재생 가능한 앱로드입니다.

Pattern B2B: 부품의 적재에 대한 사전 서명 된 탭을 저장소로 직접 보내고 메타 데이터를 API로 보냅니다.

8) 압축, 암호화, 무결성

압축: 'zstd' 선호 (더 나은 비율/속도). 각 파트를 개별적으로 압축합니다 (캐시를 갱신하는 것이 더 편리합니다).

암호화:
  • 와이어에서: TLS 1. 2+.
  • 휴식 시간: 키 랩핑이있는 서버 측 KMS (SSE-KMS) 또는 클라이언트 측 (AES-256-GCM).
  • "원시" 키를 선언문에 넣지 마십시오.
  • 체크 포인트: 전체 세트에 공통적 인 부품 당 최소 Š-256. 오른쪽으로 이동 중입니다.

9) 주변 측정기 통합: NGINX/CDNName

NGINX (범위 + 긴 타임 아웃 + 비활성화 버퍼링):
nginx server {
listen 443 ssl http2;
server_name downloads. example. com;

location /exports/ {
proxy_buffering off;
proxy_request_buffering off;
proxy_read_timeout 3600s;
add_header Accept-Ranges bytes;
proxy_pass http://export-backend;
}
}
응답 헤더:
  • '콘텐츠 처분: 첨부 파일; 파일 이름 = "내보내기 _ 2025-10-31 _ part-00000. 쪽모이 세공 마비. zst "'
  • 올바른로드를 위해 'ETag '/' If-Range'
  • 개인 업로드를위한 'Cache-Control' (예: 'private, max-age = 3600').

10) 안전 및 준수

인증/인증: 소유자/역할에만 내보내기 발행; 짧은 TTL로 사전 서명했습니다.
PII: 마스킹/앨리어싱; 매니페스트에서 - 기술 분야 만.
GDPR/로컬 규제 기관: TTL에 의한 수출 삭제, 다운로드 감사, 이유없이 지역 간 발행 금지.
요율 제한 및 할당량: 동시 수출 수와 하루/월 총 수량 (임차인 당) 을 제한합니다.
스크래핑 방지: 링크 발행을위한 CAP/봇 필터, 범위 제한 (최대 병렬 부분).

11) 관찰 및 운영

메트릭:
  • (PHP 3 = 3.0.6, PHP 4)
  • 'export _ bytes _ total', 'export _ part _ guidence _ ms {p50, p95, p99}'
  • (PHP 3 = 3.0.6, PHP 4)
  • @ info: whatsthis
통나무/감사:
  • 내보내기, 필터, 워터 마크, 다운로드 목록 (IP/UA/time) 을 만든 사람.
  • 부품 해시 및 고객 측 조정 (확인).
추적:
  • 스냅 샷 → 직렬화 → 부품 업로드 → 마무리.

12) 성능 및 비용

병렬 처리: 여러 부품을 동시에 생성하지만 (N 작업자) I/O를 제한합니다.
메모리: 스트리밍 직렬화 (반복자, 데이터베이스 커서, 4-16MB 덩어리).
결제: 자주 반복되는 내보내기, 필터/해시별로 부품의 스마트 캐시.
CNC: "일반" 공개 세트에 유리합니다. 개인적인주의 (안전/PII).

13) 인터페이스의 예

13. 1 수출 만들기 (REST)

http
POST /exports
Content-Type: application/json
Authorization: Bearer <token>

{
"format": "parquet+zstd",
"filters": {"date_from":"2025-10-01","date_to":"2025-10-31","tenant":"acme"},
"split_size_mb": 256,
"encryption": {"mode":"server-side-kms","key_id":"kms/keys/exp"}
}
답변:
json
{
"id":"exp_2025_10_31_001",
"status":"queued",
"estimated_parts": 12,
"manifest_url": "/exports/exp_2025_10_31_001/manifest. json"
}

13. 범위에 대한 2 가지 발행 부분

http
GET /exports/exp_.../part-00003. parquet. zst
Range: bytes=1048576-

13. 3 Vorker 의사 코드

pseudo snapshot = db. begin_snapshot()
for shard in plan_shards(snapshot):
part_stream = encode_stream(shard. rows, format="parquet", compress="zstd")
url = object_store. upload_stream(part_stream, part_name, encryption=KMS)
manifest. add(part_name, size, sha256, url)
write_manifest(manifest)

14) 델타 수출 패턴

N (주간/주) + 델타에서 '업데이트 된 _ at> 워터 마크' 로 매시간 전체 수출됩니다.
소비자 측에서는 '버전 '/' seq' 을 확인하여 델타를 적용하십시오.
마지막 워터 마크를 소비자와 매니페스트에 보관하십시오.

15) 반 패턴

요청시 내보내기 생성 (동기) -타임 아웃 및 OOM.
분할이없는 거대한 파일 중 하나는 다운로드를 재개/병렬 할 수 없다는 것입니다.
체크섬 및 매니페스트 부족-무결성을 증명할 수 없습니다.
개인 데이터에 대한 영구적 인 공개 링크 문제.
버퍼링 SSE/CDN이나 비활성화 된 범위-" 재 장전 "을 차단합니다.
더러운 데이터를 내보냅니다 (스냅 샷/격리 없음).

16) 구현 점검표

  • 형식 및 압축: CS/JSONL/Parquet + 'zstd/ggip'.
  • 일관성: 거래 스냅 샷 또는 워터 마크/오프셋.
  • 파티셔닝: 64-512MB 부품, 병렬 생성 및 다운로드.
  • 매니페스트: 부품 목록, 치수, Ś-256, 스키마 버전, 워터 마크.
  • 갱신: TP 범위, '멀티 파트/바이 테랑' 지원, 클라이언트 배신.
  • 보안: 사전 서명 된 TP, TTL, 암호화 (KMS/AEAD), PII 마스킹.
  • 한도/할당량: 임차인 당, 일일 량, 활성 작업 수.
  • 관찰 가능성: 작업/부품 지표, 다운로드 감사, 체크섬 실패 경고.
  • 비용: 상점에서 공개 세트, TTL 및 자동 정리를위한 CDN입니다.
  • 런북/게임 데이: 네트워크 중단, 저장 불가능, 데이터베이스 과열, KMS 오류.

17) 게임 데이 (플레이 북)

다운로드 중 네트워크 중단: 클라이언트는 '범위' 를 계속해야합

한 부분은 적재하지 못했습니다. 전체 수출을 재현하지 않고 부품 재 트레이.
근로자의 추락: 마지막 확인되지 않은 청크로 작업이 재개됩니다.

KMS 사용할 수 없음: 보안 저하 (생성 일시 정지, 암호화되지 않은 상태 해제)

데이터 성장 × 2: 생성 시간을 확인하고 병렬 처리를 재분배하며 데이터베이스를 죽이지 마십시오.

18) 총계

안정적인 대형 오프로드는 비동기 아키텍처 + 분할 + 갱신 + 검증 가능한 무결성입니다. 스냅 샷을 찍고, 부품을 병렬로 작성하고, 체크섬과 함께 매니페스트를 게시하고, HyperRange 및 단기 링크를 지원합니다. 보안, 한계 및 관찰 가능성을 생각하면 기가 바이트 수출은 팀과 사용자에게 악몽이 될 수 없습니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

Telegram
@Gamble_GC
통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.