GH GambleHub

Multipart-экспорт және үлкен жүктемелер

1) «Үлкен» экспорт қажет болғанда және не маңызды

Сценарийлер: қаржылық есептер, пайдаланушылардың белсенділігін түсіру, аудит/реттегіштер, BI-түсірулер, серіктестік каталогтар, резервтік көшірмелер. Негізгі талаптар:
  • Деректердің үйлесімділігі (snapshot/уақыт нүктесі).
  • Көлемі бойынша өтімділік (қатар жазу/оқу, ағынды сериалдау).
  • Жаңартылуы (resumable) және ішінара жеткізу.
  • Тұтастығы (checksum) және верификациялануы (манифест).
  • Қауіпсіздік/PII (бүркемелеу, шифрлау, кіруді бақылау).
  • Құнды басқару (компрессия, тайм-ауттар, CDN, TTL).

2) Деректер пішімдері: плюстер/минустар

CSV - ықшам, тез жазу/оқу; кемшіліктері: экрандау, түрлері жоғалады. Кестелік есептер үшін жақсы.
JSON Lines (JSONL) - объектіге жол бойынша, стриминг және ішінара іріктеу үшін қолайлы; кемшіліктері: көлемі.
Parquet/Euro - бағаналы/схемалық форматтар, қысу және predicate pushdown; талдау және үлкен деректер үшін тамаша.
Mixed: JSONL үшін API жүктеу → Паркетке оффлайн конверсия.

Компрессия: 'gzip '/' zstd' (жақсы). Өте үлкен көлемдер үшін - сплит-мұрағаттар (бір бөлікке 128-512 МБ ~ бойынша).

3) Үйлесімділік: «суретті» қалай алуға болады

БД: транзакциялық оқшаулау REPEATABLE READ/SNAPSHOT; ағындар үшін - репликалаудың логикалық слоттары немесе 'watermark' белгісі (макс. updated _ at '/нұсқа).
Event sourcing: журналды offset бойынша экспорттау.
Кесінділер: «толық» экспорт + «дельта» («watermark» сәттен бастап өзгерістерді келесі жүктеу).

4) Бөліктерге бөлу (multipart/chunking)

4. 1 «multipart» түрлері

Upload (бізге): multipart/form-data (ұсақ файлдар), S3 Multipart Upload (MPU )/GCS Resumable (ірі).
Download (бізден): HTTP Range ('bytes = start-end'), 'multipart/byteranges' (бір жауаптағы бірнеше ауқым), «zip of parts», нысан еселігіндегі каталогтар.

4. 2 Бөлшектеу стратегиялары

Көлемі бойынша (мысалы, бір бөлікке 256 МБ).
Кілт/күн бойынша ('tenant _ id', 'YYYY/MM/DD' бойынша шардарлау).
Кесте/мән бойынша (түрлеріне жеке файлдар).

Теңгерім: 64-512 МБ бөліктері параллельді жақсы жүктеледі және жады қызып кетпейді.

5) API-экспорт архитектурасы (асинхронды модель)

Қадамдар:

1. 'POST/exports' → кезектегі тапсырма (метадеректер: пішім, сүзгілер, шифрлау, өмір сүру мерзімі).

2. Воркерлер snapshot жасайды, деректерді ағындайды және бөліктерді нысанды қоймаға жазады.

3. Бөлшектер тізбесі, өлшемдері, checksum, схема нұсқасы бар манифест (JSON) жасайды.

4. 'GET/exports/{ id}' күйін және/pre-signed URL бөліктеріне сілтемесін қайтарады.

5. `GET /exports/{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) Жаңартылатын түсіру (resumable)

HTTP Range: клиент 'Range: bytes = 241172480-' файлының артқы жағын жүктейді.
Бірнеше ауқым: 'Range: bytes = 0-999,2000-2999' → жауап 'Content-Type: multipart/byteranges'.
Клиенттік стратегия: бөліктерге параллель «воркерлер», әрқайсысының верификациясы 'sha256', экспоненциалды backoff ретрайлері.
CDN: Range қолдауы, үлкен жауаптарды буферлеу ажыратылған.

7) Бізге үлкен жүктеулер (resumable upload)

S3 Multipart Upload: клиенттер бөліктерін жүктейді (5-5000), сервер жинайды 'CompleteMultipartUpload'.
GCS Resumable: бір сеанс, ығысу - клиент 'Content-Range' жалғастыра алады.
TUS (хаттама) - HTTP үстінен тәуелсіз жаңартылатын аплоад.

B2B үлгісі: бөліктер аплоады үшін pre-signed URL-ді тікелей есікке, ал метадеректер - біздің API-ге береміз.

8) Компрессия, шифрлау, тұтастық

Компрессия: 'zstd' артық (жақсы ratio/жылдамдық). Әрбір бөлікті жеке қысыңыз (жаңарту/кэштеу ыңғайлы).

Шифрлау:
  • Сымда: TLS 1. 2+.
  • Тыныштықта: кілттің орамы (key wrapping) бар server-side KMS (SSE-KMS) немесе client-side (AES-256-GCM).
  • «Шикі» кілтті ешқашан манифестке қоймаңыз.
  • Checksum: ең аз дегенде бір бөлікке SHA-256 + бүкіл жиынтық үшін ортақ. ack алдында клиентке тексеріңіз.

9) Периметрмен интеграциялау: NGINX/CDN

NGINX (Range + үлкен таймауттар + буферлеуді өшіру):
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;
}
}
Жауап тақырыптары:
  • `Content-Disposition: attachment; filename="export_2025-10-31_part-00000. parquet. zst"`
  • 'ETag '/' If-Range' дұрыс қосымша жүктеу үшін.
  • Дербес түсіру үшін 'Cache-Control' (мысалы, 'private, max-age = 3600').

10) Қауіпсіздік және комплаенс

Аутентификация/авторизация: экспортты тек иесіне/рөлдерге беру; қысқа TTL бар уақытша сілтемелер (pre-signed).
PII: бүркемелеу/бүркеншік атау; манифестте - тек техникалық өрістер.
GDPR/жергілікті реттегіштер: TTL бойынша экспорттарды жою, жүктеу аудиті, негізсіз кросс-өңірлік беруге тыйым салу.
Rate limiting & quotas: бір мезгілдегі экспорт санын және тәулік/айдағы жалпы көлемді шектеу (per-tenant).
Анти-скрапинг: сілтемелер беруге арналған САР/бот-сүзгілер, диапазондарды шектеу (параллель бөліктердің максималды).

11) Бақылау және пайдалану

Өлшемдері:
  • `export_jobs_total{status}` (queued/running/succeeded/failed/expired)
  • `export_bytes_total`, `export_part_duration_ms{p50,p95,p99}`
  • `download_range_requests_total`, `resumes_total`, `checksum_fail_total`
  • `storage_cost_estimate` и `egress_bytes_cdn`
Логи/аудит:
  • Экспорт, сүзгілер, watermark, жүктеу тізімін кім жасады (IP/UA/уақыт).
  • Бөліктердің хештері және клиент жағында салыстырып тексеру (растау).
Трейдинг:
  • snapshot → serialize → upload part → finalize кезеңдеріне арналған.

12) Өнімділік және құн

Параллельділік: бір мезгілде бірнеше бөліктер (воркер N) шығарыңыз, бірақ I/O шектеңіз.
Жады: серияландыру ағыны (итераторлар, БД курсорлары, 4-16 МБ-дан күбілер).
Дедуп: жиі қайталанатын экспорттар үшін ақылды cache of parts сүзгілер/хеш бойынша.
CDN: «жалпы» көпшілік жиынтықтар үшін тиімді; дербес үшін - абайлаңыз (қауіпсіздік/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 Range бөлігін беру

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

13. 3 Воркердің жалған құжаты

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 (күн/апта) + дельта әр сағат сайын 'updated _ at> watermark' бойынша.
Тұтынушы жағында: «version »/« seq» деп ретімен дельталарды қолдану.
Соңғы watermark бағдарламасын тұтынушы мен манифестте сақтаңыз.

15) Қарсы үлгілер

Сұраудағы экспортты генерациялау (синхронды) - таймауттар және OOM.
Бөлшектеусіз бір үлкен файл - жаңарту/параллель қотару мүмкін емес.
Checksum мен манифесттің болмауы - тұтастығын дәлелдеуге болмайды.
Дербес деректерге тұрақты ашық сілтемелер беру.
SSE/CDN буферлеу немесе ажыратылған Range - «жүктеу» бұзады.
«Лас» деректерді экспорттау (snapshot/оқшаулаусыз).

16) Енгізу чек-парағы

  • Формат және компрессия: CSV/JSONL/Parquet + 'zstd/gzip'.
  • Келісім: транзакциялық snapshot немесе watermark/offset.
  • Бөлшектеу: 64-512 МБ бөліктері, параллель генерация және жүктеу.
  • Манифест: бөліктер тізімі, өлшемдері, SHA-256, схема нұсқасы, watermark.
  • Жаңарту: HTTP Range, қолдау 'multipart/byteranges', клиенттік ретрайлер.
  • Қауіпсіздік: pre-signed URLs, TTL, шифрлау (KMS/AEAD), PII бүркемелеу.
  • Лимиттер/квоталар: per-tenant, тәуліктік көлемдер, белсенді джоб саны.
  • Байқау: джоб/бөліктердің метрикасы, жүктеу аудиті, checksum-fail бойынша алерта.
  • Құны: көпшілік жиынтықтары үшін CDN, TTL және авто-тазалау.
  • Runbooks/Game Days: желі үзілістері, ұяшықтың қол жетімсіздігі, БД қызуы, KMS жаңылысы.

17) Game Days (ойнатқыштар)

Жүктеу кезінде желі үзілген: клиент 'Range' бағдарламасымен жалғасуы керек.
Бір бөлікті жүктеу сәтсіз аяқталды: барлық экспортты қайта жасаусыз бөлік ретрайлері.
Воркердің құлауы: джоба соңғы расталмаған күбіден жаңартылады.
KMS қол жеткізгісіз: қауіпсіз деградация (генерацияны тоқтату, шифрланбау).
Деректердің өсуі × 2: генерация уақытын тексеру, параллелизмді қайта бөлу, БД-ны өлтірмеу.

18) Қорытынды

Сенімді үлкен түсіру - бұл асинхронды сәулет + бөлшектеу + жаңару + тексерілетін тұтастық. Snapshot жасаңыз, бөліктерді параллель жазыңыз, checksum манифестін жариялаңыз, HTTP Range және қысқа мерзімді сілтемелерді қолдаңыз. Қауіпсіздікті, лимиттерді және бақылаушылықты ойластырыңыз - гигабайттық экспорт командалар мен пайдаланушылар үшін түнгі қорқыныш болмайды.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Telegram
@Gamble_GC
Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.