Multipart-ixrac və böyük yükləmə
1) «böyük» ixrac lazım olduqda və nə vacibdir
Ssenarilər: maliyyə hesabatları, istifadəçi fəaliyyətinin boşaldılması, audit/tənzimləyicilər, BI-boşaltmalar, tərəfdaşlıq kataloqları, ehtiyat nüsxələr. Əsas tələblər:- Məlumatların uyğunluğu (snapshot/vaxt nöqtəsi).
- Həcminə görə keçid (paralel yazma/oxu, axın serializasiyası).
- Bərpa (resumable) və qismən çatdırılma.
- Bütövlük (checksum) və yoxlanılabilirlik (manifest).
- Təhlükəsizlik/PII (maskalama, şifrələmə, giriş nəzarəti).
- Dəyər idarəetməsi (kompressiya, zaman-aut, CDN, TTL).
2) Məlumat formatları: müsbət/mənfi
CSV - kompakt, tez yazmaq/oxumaq; mənfi cəhətləri: ekran, növləri itirilir. Tablo hesabatları üçün yaxşıdır.
JSON Lines (JSONL) - obyektin hər sətri üzrə, axın və qismən nümunə üçün əlverişlidir; mənfi cəhətləri: həcm.
Parquet/Avro - sütun/sxem formatları, sıxılma və predicate pushdown; analitika və böyük məlumatlar üçün idealdır.
Mixed: API download üçün JSONL → Parquet üçün offline dönüşüm.
Kompressiya: 'gzip '/' zstd' (daha yaxşı). Çox böyük həcmlər üçün - split arxivlər (hər hissəyə 128-512 MB ~).
3) Uyğunluq: «şəkil» almaq üçün necə
BD: REPEATABLE READ/SNAPSHOT əməliyyat izolyasiyası; axınlar üçün - məntiqi replikasiya yuvaları və ya 'watermark' işarəsi (max. 'updated _ at '/versiyası).
Event sourcing: offset jurnal ixrac.
Kəsiklər: «tam» ixrac + «delta» («watermark» anından sonrakı dəyişikliklər).
4) Parçalanma (multipart/chunking)
4. 1 «multipart» növləri
Upload (bizə): multipart/form-data (kiçik fayllar), S3 Multipart Upload (MPU )/GCS Resumable (böyük).
Download (bizdən): HTTP Range ('bytes = start-end'), 'multipart/byteranges' (bir cavabda bir neçə diapazon), «zip of parts», obyekt anbarında kataloqlar.
4. 2 Bölünmə strategiyaları
Ölçüsünə görə (məsələn, hər hissəyə 256 MB).
Açar/tarixə görə ('tenant _ id', 'YYYY/MM/DD').
Cədvəl/mahiyyətə görə (növlərə görə ayrı-ayrı fayllar).
Balans: 64-512 MB hissələri paralel olaraq yaxşı yüklənir və yaddaşı həddindən artıq qızdırmır.
5) API-ixrac arxitekturası (asenxron model)
Addımlar:1. 'POST/exports' → növbədəki tapşırıq (metadata: format, filtrlər, şifrələmə, ömür).
2. Vorkers snapshot qurmaq, məlumat axını və obyekt saxlama hissələri yazmaq.
3. Hissələrin siyahısı, ölçüləri, checksum, sxem versiyası ilə manifest (JSON) yaradır.
4. 'GET/exports/{ id}' status və linki/pre-signed URL hissələrinə qaytarır.
5. `GET /exports/{id}/manifest. json '- doğrulama/yükləmə üçün həqiqət maşını.
Manifest nümunəsi: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) Bərpa olunan boşaltma (resumable)
HTTP Range: Müştəri faylın «quyruğunu» yükləyir: 'Range: bytes = 241172480-'.
Bir neçə diapazon: 'Range: bytes = 0-999,2000-2999' → cavab 'Content-Type: multipart/byteranges'.
Müştəri strategiyası: parça-parça paralel «işçilər», hər biri doğrulama 'sha256', eksponent backoff ilə retrai.
CDN: Range dəstəyi, böyük cavabların buferləşdirilməsi.
7) Bizə böyük yükləmələr (resumable upload)
S3 Multipart Upload: müştərilər hissələri yükləyir (5-5000), server 'CompleteMultipartUpload' toplayır.
GCS Resumable: bir seans, yerdəyişmə - müştəri 'Content-Range' ilə davam edə bilər.
TUS (protokol) - HTTP üzərindən müstəqil bərpa olunan appload.
B2B patterni: Parçalar üçün əvvəlcədən işarələnmiş URL-ləri birbaşa qapıya, metadata isə API-yə veririk.
8) Sıxılma, şifrələmə, bütövlük
Sıxılma: 'zstd' üstünlük (daha yaxşı ratio/sürət). Hər hissəni ayrı-ayrılıqda sıxın (yeniləmək/cache etmək daha rahatdır).
Şifrələmə:- Teldə: TLS 1. 2+.
- Dinc: server-side KMS (SSE-KMS) və ya client-side (AES-256-GCM) açar sarğısı ilə (key wrapping).
- Heç vaxt «xam» açarı manifestə qoymayın.
- Checksum: hissə başına minimum SHA-256 + bütün dəst üçün ümumi. ack əvvəl müştəri yoxlayın.
9) Perimetrlə inteqrasiya: NGINX/CDN
NGINX (Range + Böyük Taymaut + Buferləşdirmə Devre):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;
}
}
Cavab başlıqları:
- `Content-Disposition: attachment; filename="export_2025-10-31_part-00000. parquet. zst"`
- 'ETag '/' If-Range' düzgün yükləmə üçün.
- Şəxsi boşaltmalar üçün 'Cache-Control' (məsələn, 'private, max-age = 3600').
10) Təhlükəsizlik və uyğunluq
Autentifikasiya/avtorizasiya: yalnız sahibinə/rollara ixrac verilməsi; qısa TTL ilə müvəqqəti linklər (pre-signed).
PII: maskalanma/təxəllüs; manifestdə - yalnız texniki sahələr.
GDPR/lokal tənzimləyicilər: TTL ixracının silinməsi, download auditi, heç bir səbəb olmadan xaç-regional emissiyanın qadağan edilməsi.
Rate limiting & quotas: Eyni zamanda ixracların sayını və gündə/ayda ümumi həcmini (per-tenant) məhdudlaşdırın.
Anti-scraping: SAR/bot filtrləri linklərin verilməsi, diapazonların məhdudlaşdırılması (maksimum paralel hissələr).
11) Müşahidə və istismar
Metriklər:- `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`
- Kim ixrac, filtrələr, watermark, download siyahısı (IP/UA/vaxt) yaratdı.
- Hash hissələri və müştəri tərəfində yoxlama (təsdiq).
- snapshot → serialize → upload part → finalize.
12) Performans və dəyəri
Paralellik: eyni anda bir neçə parça (N worker) yaradın, lakin I/O-nu məhdudlaşdırın.
Yaddaş: axın serializasiyası (iteratorlar, BD kursorları, 4-16 MB çantalar).
Dedup: tez-tez təkrar ixrac üçün ağıllı cache of parts filter/hash.
CDN: «ümumi» ictimai dəstlər üçün faydalıdır; şəxsi - ehtiyatlı (təhlükəsizlik/PII).
13) Interfeys nümunələri
13. 1 İxracın yaradılması (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"}
}
Cavab:
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 ilə hissə verilməsi
http
GET /exports/exp_.../part-00003. parquet. zst
Range: bytes=1048576-
13. 3 Worker psevdokodu
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 ixrac nümunələri
Tam ixrac N dəfə (gün/həftə) + delta hər saat 'updated _ at> watermark'.
İstehlakçı tərəfində: deltaları ardıcıl olaraq 'version '/' seq' təsdiqləyərək tətbiq edin.
Son watermark-ı istehlakçı və manifestdə saxlayın.
15) Anti-nümunələr
Sorğuda ixracın generasiyası (sinxron) - taymaut və OOM.
Parçalanmadan bir nəhəng fayl - bərpa/paralel yükləmənin mümkünsüzlüyü.
Yoxlama və manifestin olmaması - bütövlüyü sübut edə bilməzsiniz.
Şəxsi məlumatlara daimi ictimai linklərin verilməsi.
Tamponlama SSE/CDN və ya off Range - «yükləmə» pozur.
«Çirkli» məlumatların ixracı (snapshot/izolyasiya olmadan).
16) Giriş çek siyahısı
- Format və sıxılma: CSV/JSONL/Parquet + 'zstd/gzip'.
- Uyğunluq: əməliyyat snapshot və ya watermark/offset.
- Bölünmə: 64-512 MB hissələri, paralel nəsil və yükləmə.
- Manifest: hissələri siyahısı, ölçüləri, SHA-256, sxem versiyası, watermark.
- Yeniləmə: HTTP Range, dəstək 'multipart/byteranges', müştəri retrası.
- Təhlükəsizlik: pre-signed URLs, TTL, şifrələmə (KMS/AEAD), PII maskalama.
- Limitlər/kvotalar: per-tenant, gündəlik həcmlər, aktiv cob sayı.
- Müşahidə: gob/hissələrin metrikası, download auditi, checksum-fail-də alertlər.
- Qiymət: ictimai dəsti, TTL və auto-cleanup üçün CDN.
- Runbooks/Game Days: şəbəkə qırılmaları, sızma, həddindən artıq isti, KMS uğursuzluğu.
17) Game Days (playbook)
Yükləmə zamanı şəbəkənin kəsilməsi: müştəri 'Range' ilə davam etməlidir.
Bir hissənin yüklənməsinin uğursuzluğu: bütün ixracın yenidən qurulması olmadan retraj hissələri.
Worker düşməsi: Job son təsdiqlənməmiş çantadan bərpa olunur.
KMS mövcud deyil: təhlükəsiz deqradasiya (nəsil fasiləsi, şifrəsiz buraxmayın).
Data artımı × 2: nəsil vaxtını yoxlayın, paralelliyi yenidən bölüşdürün, DB öldürməyin.
18) Nəticələr
Etibarlı böyük boşaltmalar asenxron arxitektura + parçalanma + bərpa + yoxlanıla bilən bütövlüydür. Snapshot edin, parçaları paralel yazın, checksum manifestini dərc edin, HTTP Range və qısamüddətli linkləri dəstəkləyin. Təhlükəsizlik, limitlər və müşahidə qabiliyyətini düşünün - və gigabayt ixrac komandalar və istifadəçilər üçün kabus olmayacaq.