Multipart-eksportlar va katta yuklar
1) «Katta» eksportga ehtiyoj bo’lganda va nima muhim
Ssenariylar: moliyaviy hisobotlar, foydalanuvchilarning faolligini tushirish, audit/regulyatorlar, BI-tushirishlar, sheriklik kataloglari, zaxira nusxalari. Asosiy talablar:- Maʼlumotlarning muvofiqligi (snapshot/vaqt nuqtasi).
- Hajm bo’yicha o’tish qobiliyati (parallel yozuv/o’qish, oqimli serializatsiya).
- Qayta tiklanish (resumable) va qisman yetkazib berish.
- Yaxlitlik (checksum) va ishonchlilik (manifest).
- Xavfsizlik/PII (niqoblash, shifrlash, kirishni nazorat qilish).
- Qiymatni boshqarish (siqish, taym-autlar, CDN, TTL).
2) Ma’lumotlar formatlari: ijobiy/salbiy tomonlari
CSV - ixcham, tez yozish/o’qish; kamchiliklar: ekranlash, turlari yo’qoladi. Jadval hisobotlari uchun yaxshi.
JSON Lines (JSONL) - har bir obyekt satri bo’yicha, oqim va qisman tanlash uchun qulay; kamchiliklar: hajm.
Parquet/Euro - ustunli/sxemali formatlar, siqish va predicate pushdown; tahlillar va katta ma’lumotlar uchun idealdir.
Mixed: API yuklash uchun JSONL → Parquetga oflayn konvertatsiya.
Kompresssiya:’gzip ’/’ zstd’(yaxshiroq). Juda katta hajmlar uchun - split-arxivlar (bir qismga 128-512 MB ~).
3) Muvofiqlik: «rasm» ni qanday olish kerak
DB: REPEATABLE READ/SNAPSHOT tranzaksion izolyatsiyasi; oqimlar uchun - mantiqiy replikatsiya slotlari yoki’watermark’belgisi (maksimal’updated _ at ’/versiya).
Event sourcing: jurnal offset boʻyicha eksport qilish.
Kesmalar: «to’liq» eksport + «delta» (’watermark’dan keyingi o’zgarishlarni tushirish).
4) Bo’laklarga bo’lish (multipart/chunking)
4. 1 «Multipart» turlari
Upload (bizga): multipart/form-data (kichik fayllar), S3 Multipart Upload (MPU )/GCS Resumable (katta fayllar).
Download (bizdan): HTTP Range (’bytes = start-end’),’multipart/byteranges’(bitta javobda bir nechta diapazon), «zip of parts», obʼekt storidagi kataloglar.
4. 2 Bo’lish strategiyalari
Hajmi bo’yicha (masalan, bir qismga 256 MB).
Kalit/sana bo’yicha (’tenant _ id’,’YYYY/MM/DD’bo’yicha shardalash).
Jadval/mohiyat boʻyicha (turlarga alohida fayllar).
Balans: 64-512 MB qismlari parallel ravishda yaxshi yuklab olinadi va xotirani haddan tashqari qizdirmaydi.
5) eksportning API arxitekturasi (asinxron model)
Qadamlar:1.’POST/exports’→ navbatdagi vazifa (meta ma’lumotlar: format, filtrlar, shifrlash, umr ko’rish muddati).
2. Vorkerlar snapshot quradilar, ma’lumotlarni oqib chiqaradilar va ob’ekt omboriga qismlar yozadilar.
3. Qismlar ro’yxati, o’lchamlari, checksum, sxema versiyasi bilan manifest (JSON) yaratiladi.
4.’GET/exports/{ id}’status va havolani/pre-signed URL qismlariga qaytaradi.
5. `GET /exports/{id}/manifest. json’- haqiqat mashinasi.
Manifest misoli: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) Qayta tiklanadigan yuklamalar (resumable)
HTTP Range: Mijoz’Range: bytes = 241172480-’faylini toʻldiradi.
Bir nechta bandlar:’Range: bytes = 0-999,2000-2999’→ javob’Content-Type: multipart/byteranges’.
Mijoz strategiyasi: qismlarga parallel «vorkerlar», har birining verifikatsiyasi’sha256’, eksponensial backoff bilan retralar.
CDN: Range’ni qoʻllab-quvvatlash, katta javoblarni oʻchirish.
7) Bizga katta yuklar (resumable upload)
S3 Multipart Upload: mijozlar qismlarni yuklaydi (5-5000), server’CompleteMultipartUpload’ni yigʻadi.
GCS Resumable: bitta seans, siljishlar - mijoz’Content-Range’bilan davom etishi mumkin.
TUS (protokol) - HTTP ustidagi mustaqil qayta tiklanadigan appload.
B2B patterni: qismlar uchun pre-signed URLni to’g’ridan-to’g’ri storga, meta-ma’lumotlarni esa bizning APIga beramiz.
8) Siqish, shifrlash, yaxlitlik
Kompresssiya:’zstd’afzal (yaxshiroq ratio/tezlik). Har bir qismni alohida siqib chiqaring (yangilash/kesh qilish qulayroq).
Shifrlash:- Simda: TLS 1. 2+.
- Tinch holatda: server-side KMS (SSE-KMS) yoki client-side (AES-256-GCM) kalit o’ralgan (key wrapping).
- Hech qachon «xom» kalitni manifestga qo’ymang.
- Checksum: minimal SHA-256 bir qismga + butun toʻplam uchun umumiy. ack oldidan mijozni tekshiring.
9) Perimetr bilan integratsiya: NGINX/CDN
NGINX (Range + katta taymautlar + buferlashni oʻchirish):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;
}
}
Javob sarlavhalari:
- `Content-Disposition: attachment; filename="export_2025-10-31_part-00000. parquet. zst"`
- To’g "ri yuklash uchun’ETag ’/’ If-Range’.
- ’Cache-Control’ (masalan,’private, max-age = 3600’) shaxsiy yuklamalar uchun.
10) Xavfsizlik va komplayens
Autentifikatsiya/avtorizatsiya: eksportni faqat egasiga/rollarga berish; qisqa TTL bilan vaqtinchalik havolalar (pre-signed).
PII: niqoblash/taxalluslashtirish; manifestda - faqat texnik maydonlar.
GDPR/lokal regulyatorlar: TTL bo’yicha eksportni olib tashlash, yuklab olish auditi, asossiz kross-mintaqaviy berishni taqiqlash.
Rate limiting & quotas: bir vaqtning o’zida eksportlar sonini va kuniga/oyga umumiy hajmini cheklash (per-tenant).
Anti-skraping: havolalar berish uchun SAR/bot-filtrlar, diapazonlarni cheklash (maksimal parallel qismlar).
11) Kuzatish va foydalanish
Metriklar:- `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`
- Eksport, filtrlar, watermark, yuklab olish roʻyxatini kim yaratdi (IP/UA/vaqt).
- Qismlarning xeshalari va mijoz tomonidan solishtirish (tasdiqlash).
- Snapshot → serialize → upload part → finalize.
12) Unumdorlik va qiymat
Parallellik: bir vaqtning o’zida bir nechta qismlarni (N vorker) yarating, lekin I/O.ni cheklang.
Xotira: oqimli serializatsiya (iteratorlar, DB kursorlari, 4-16 MB changlar).
Dedup: tez-tez takrorlanadigan eksport uchun aqlli cache of parts filter/xesh.
CDN: «umumiy» ommaviy toʻplamlar uchun foydalidir; shaxsiy - ehtiyotkorlik bilan (xavfsizlik/PII).
13) Interfeys namunalari
13. 1 Eksport yaratish (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"}
}
Javob:
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 bilan qism berish
http
GET /exports/exp_.../part-00003. parquet. zst
Range: bytes=1048576-
13. 3 Vorkerning soxta hujjati
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) Delta-eksport patternlari
To’liq eksport bir marta N (kun/hafta) + delta har soatda’updated _ at> watermark’bo’yicha.
Iste’molchi tomonida: «version »/« seq» verifikatsiyasini qo’llash.
Oxirgi watermarkni isteʼmolchi va manifestda saqlang.
15) Anti-patternlar
So’rovda eksport yaratish (sinxron) - taymaut va OOM.
Boʻlmasdan bitta ulkan fayl - qaytadan/parallel yuklash mumkin emas.
Checksum va manifestning yo’qligi - yaxlitligini isbotlab bo’lmaydi.
Shaxsiy ma’lumotlarga doimiy ommaviy havolalar berish.
SSE/CDN buferlash yoki oʻchirilgan Range - «yuklash» ni buzadi.
Iflos maʼlumotlarni eksport qilish (snapshot/izolyatsiyasiz).
16) Joriy etish chek-varaqasi
- Format va siqish: CSV/JSONL/Parquet +’zstd/gzip’.
- Muvofiqlik: tranzaksion snapshot yoki watermark/offset.
- Bo’linish: 64-512 MB qismlar, parallel ishlab chiqarish va yuklab olish.
- Manifest: qismlar ro’yxati, o’lchamlari, SHA-256, sxema versiyasi, watermark.
- Qayta tiklash: HTTP Range, qoʻllab-quvvatlash’multipart/byteranges’, mijozlar retraalari.
- Xavfsizlik: pre-signed URLs, TTL, shifrlash (KMS/AEAD), PII niqoblash.
- Limitlar/kvotalar: per-tenant, sutkalik hajmlar, faol joblar soni.
- Kuzatish darajasi: job/qismlar metrikasi, yuklab olish auditi, checksum-fail alertlari.
- Narxi: ommaviy to’plamlar uchun CDN, TTL va avto-tozalash.
- Runbooks/Game Days: tarmoqning uzilishi, oyna yetarli emas, MA haddan tashqari qizib ketgan, KMS nosozligi.
17) Game Days (pleybuklar)
Yozib olish paytida tarmoq uzilib qoldi: mijoz’Range’bilan davom etishi kerak.
Bitta qismni yuklash muvaffaqiyatsiz tugadi: butun eksportni qayta yaratmasdan retray qismi.
Vorkerning yiqilishi: job oxirgi tasdiqlanmagan changdan tiklanadi.
KMS mavjud emas: xavfsiz tanazzul (ishlab chiqarish pauzasi, shifrlanmagan holda chiqarilmasin).
Ma’lumotlarning o’sishi × 2: ishlab chiqarish vaqtini tekshirish, parallellikni qayta taqsimlash, DBni o’ldirmaslik.
18) Yakunlar
Ishonchli katta yuklar - bu asinxron arxitektura + bo’linish + qayta tiklanish + tekshiriladigan yaxlitlik. Snapshot qiling, parallel qismlarni yozing, checksum manifestini nashr qiling, HTTP Range va qisqa havolalarni qoʻllab-quvvatlang. Xavfsizlik, limitlar va kuzatuv darajasini o’ylab ko’ring - gigabayt eksportlar jamoalar va foydalanuvchilar uchun dahshatli dahshat bo’lmaydi.