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 және қысқа мерзімді сілтемелерді қолдаңыз. Қауіпсіздікті, лимиттерді және бақылаушылықты ойластырыңыз - гигабайттық экспорт командалар мен пайдаланушылар үшін түнгі қорқыныш болмайды.