Multipart-eksportlar we uly ýükler
1) Haçan-da "uly" eksportlar zerur bolsa we näme möhüm
Ssenariýalar: maliýe hasabatlary, ulanyjylaryň işjeňligini düşürmek, audit/düzgünleşdirijiler, BI-düşürmeler, hyzmatdaş kataloglar, ätiýaçlyk nusgalary. Esasy talaplar:- Maglumatlaryň sazlaşygy (snapshot/nokat).
- Göwrümi boýunça geçiş ukyby (paralel ýazgy/okamak, akym seriýalizasiýasy).
- Täzelenip bilmek (resumable) we bölekleýin eltip bermek.
- Bitewilik (checksum) we tassyklanmak (manifest).
- Howpsuzlyk/PII (gizlemek, şifrlemek, giriş gözegçiligi).
- Gymmaty dolandyrmak (gysyş, wagt-aut, CDN, TTL).
2) Maglumatlaryň formatlary: plýuslar/minuslar
CSV - ykjam, çalt ýazmak/okamak; minuslar: ekranlamak, görnüşleri ýitýär. Tablisa hasabatlary üçin gowy.
JSON Lines (JSONL) - obýektiň setirine görä, akym we bölekleýin nusga almak üçin amatly; minuslar: göwrümi.
Parquet/Euro - sütün/shema formatlary, gysyş we predicate pushdown; analitika we uly maglumatlar üçin amatlydyr.
Mixed: API ýüklemek üçin JSONL → Parquet-e awtonom öwrülişik.
Gysyş: 'gzip '/' zstd' (has gowy). Örän uly göwrümler üçin - bölünen arhiwler (bir bölege 128-512 MB ~).
3) Sazlaşyk: "suraty" nädip almaly
BD: GAÝTADAN DIKELDIP BOLÝAN OKALYŞ/SNAPSHOT; akymlar üçin - logiki köpeliş yuvalary ýa-da 'watermark' belligi (maks. 'updated _ at '/wersiýasy).
Event sourcing: Gündelik eksport.
Bölekler: "doly" eksport + "delta" ("watermark" pursatyndan soň üýtgeşmeleri düşürmek).
4) Bölmek (multipart/chunking)
4. 1 "multipart" görnüşleri
Upload (bize): multipart/form-data (ownuk faýllar), S3 Multipart Upload (MPU )/GCS Resumable (uly).
Download (bizden): HTTP Range ('bytes = start-end'), 'multipart/byteranges' (bir jogapda birnäçe diapazon), "zip of parts", obýektiň gapdalyndaky kataloglar.
4. 2 Bölmek strategiýalary
Ululygy boýunça (mysal üçin, bir bölege 256 MB).
Açar/sene boýunça ('tenant _ id', 'YYYY/MM/DD').
Tablisa/mazmun boýunça (görnüşlere aýratyn faýllar).
Balans: 64-512 MB bölekleri paralel gowy göçürilýär we ýady aşa gyzdyrmaýar.
5) Eksportyň API arhitekturasy (asinhron modeli)
Ädimler:1. 'POST/exports' → nobatdakylar (meta-maglumatlar: format, süzgüçler, şifrlemek, ömri).
2. Workerler snapshot gurýarlar, maglumatlary akdyrýarlar we bölekleri obýektiň ammaryna ýazýarlar.
3. Manifest (JSON) bölekleriň sanawy, ölçegleri, checksum, shema wersiýasy bilen döredilýär.
4. 'GET/exports/{ id}' status we baglanyşygy/pre-signed URL böleklerine gaýtaryp berýär.
5. `GET /exports/{id}/manifest. json '- tassyklamak/ýüklemek üçin hakykat maşyny.
Manifestiň mysaly: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) Gaýtadan dikeldilýän ýükler (resumable)
HTTP Range: Müşderi faýlyň "guýrugyny" ýükleýär: 'Range: bytes = 241172480-'.
Birnäçe zolak: 'Range: bytes = 0-999,2000-2999' → jogap 'Content-Type: multipart/byteranges'.
Müşderi strategiýasy: böleklere paralel "workerler", her birini barlamak 'sha256', eksponensial backoff bilen retralar.
CDN: Range goldawy, uly jogaplaryň öçürilmegi.
7) Bize uly ýüklemeler (resumable upload)
S3 Multipart Upload: Müşderiler böleklerini ýükleýärler (5-5000), serwer "CompleteMultipartUpload" -y ýygnaýar.
GCS Resumable: bir seans, süýşmeler - müşderi 'Content-Range' bilen dowam edip biler.
TUS (protokol) - HTTP-iň üstündäki garaşsyz täzelenip bilýän apload.
B2B patterni: Bölekleri gönüden-göni ýapmak üçin pre-signed URL-i, meta-maglumatlary bolsa API-e berýäris.
8) Gysyş, şifrlemek, bitewilik
Gysyş: 'zstd' has gowy (has gowy ratio/tizlik). Her bölegi aýratyn gysyň (täzelemek/kesmek has amatly).
Şifrlemek:- Simde: TLS 1. 2+.
- Diňe: serwer-side KMS (SSE-KMS) ýa-da client-side (AES-256-GCM) açar örtügi (key wrapping).
- Manifeste hiç haçan "çig" açary goýmaň.
- Checksum: iň az SHA-256 bölek + tutuş toplum üçin umumy. Ack-dan öň müşderiňizi barlaň.
9) Perimetr bilen integrasiýa: NGINX/CDN
NGINX (Range + uly wagtlar + buferlemegi öçürmek):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;
}
}
Jogaplaryň sözbaşylary:
- `Content-Disposition: attachment; filename="export_2025-10-31_part-00000. parquet. zst"`
- 'ETag '/' If-Range' dogry goşmaça ýüklemek üçin.
- 'Cache-Control' (mysal üçin 'private, max-age = 3600').
10) Howpsuzlyk we gabat gelmek
Tassyklamak/ygtyýarlandyrmak: eksportlary diňe eýesine/rollaryna bermek; gysga TTL bilen wagtlaýyn baglanyşyklar (pre-signed).
PII: gizlemek/lakamlaşdyrmak; manifestde - diňe tehniki meýdanlar.
GDPR/lokal düzgünleşdirijiler: TTL boýunça eksportlary aýyrmak, göçürip almak barlagy, esassyz sebitleýin berilmegini gadagan etmek.
Rate limiting & quotas: bir wagtyň özünde eksportyň sanyny we günde/aýda umumy göwrümi çäklendirmek (per-tenant).
Anti-scraping: SAR/bot-süzgüçler baglanyşyklary bermek, diapazonlary çäklendirmek (paralel bölekleriň iň ýokary).
11) Gözegçilik etmek we peýdalanmak
Metrikler:- `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, süzgüç, watermark, göçürip alýanlaryň sanawyny kim döretdi (IP/UA/wagt).
- Bölekleriň heşleri we deňeşdirme müşderiniň tarapynda (tassyklama).
- Snapshot → serialize → upload part → finalize.
12) Öndürijiligi we bahasy
Meňzeşlik: Bir wagtyň özünde birnäçe bölek dörediň (N worker), ýöne I/O çäklendiriň.
Ýat: akym seriýalizasiýasy (iteratorlar, BD kursorlary, 4-16 MB kebelekler).
Dedup: ýygy-ýygydan gaýtalanýan eksport üçin süzgüçler/hashlar boýunça akylly cache of parts.
CDN: "umumy" köpçülik toplumlary üçin peýdaly; şahsy - seresaplylyk bilen (howpsuzlyk/PII).
13) Interfeýsleriň mysallary
13. 1 Eksport döretmek (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"}
}
Jogap:
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 bilen bölek bermek
http
GET /exports/exp_.../part-00003. parquet. zst
Range: bytes=1048576-
13. 3 Workeriň ýalan resminamasy
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 patternleri
Doly eksport N gezek (gün/hepde) + delta her sagat 'updated _ at> watermark'.
Sarp edijiniň tarapynda: deltalary 'version '/' seq' -y barlamak arkaly tertipli ulanmak.
Iň soňky watermarki sarp edijide we manifestde saklaň.
15) Anti-patternler
Haýyşda eksport döretmek (sinhron) - wagt we OOM.
Bölünmedik bir ullakan faýl - täzeden başlamagyň/paralel nasosyň mümkin däldigi.
Checksum we manifestiň ýoklugy - bitewiligini subut edip bolmaz.
Şahsy maglumatlara yzygiderli köpçülige baglanyşyk bermek.
SSE/CDN buferizasiýasy ýa-da "Range" öçürilmegi "goşmaça ýüklemäni" bozýar.
"Hapa" maglumatlary eksport etmek (snapshot/izolýasiýa bolmazdan).
16) Girizmegiň çek-sanawy
- Format we gysyş: CSV/JSONL/Parquet + 'zstd/gzip'.
- Sazlaşyk: geleşik snapshot ýa-da watermark/offset.
- Bölmek: 64-512 MB bölekler, paralel nesil we göçürip almak.
- Manifest: bölekleriň sanawy, ölçegleri, SHA-256, shema wersiýasy, watermark.
- Täzelenme: HTTP Range, goldaw 'multipart/byteranges', müşderi retraslary.
- Howpsuzlyk: pre-signed URLs, TTL, şifrlemek (KMS/AEAD), gizlemek PII.
- Çäklendirmeler/kwotalar: per-tenant, gündelik göwrümler, işjeň joblaryň sany.
- Syn etmek: job/bölek metrikleri, göçürip almak barlagy, checksum-fail-de aladalar.
- Bahasy: Köpçülikleýin toplumlar, TTL we awto-arassalaýyş üçin CDN.
- Runbooks/Game Days: toruň kesilmegi, gapagyň ýoklugy, BD-iň aşa gyzmagy, KMS-iň şowsuzlygy.
17) Game Days
Download edilende toruň kesilmegi: Müşderi 'Range' bilen dowam etmeli.
Bir bölegiň ýüklenmegi şowsuzlyga uçrady: bölek retrai tutuş eksporty täzeden gurmazdan.
Workeriň ýykylmagy: joba soňky tassyklanmadyk käseden täzeden başlaýar.
KMS elýeterli däl: howpsuz zaýalanma (nesil arakesmesi, şifrlenmedik goýberme).
Maglumatlaryň ösüşi × 2: nesil wagtyny barlamak, paralelligi gaýtadan paýlamak, DB öldürmezlik.
18) Netijeler
Ygtybarly uly düşürmeler asinkron arhitekturasy + böleklere bölünmek + täzelenmek + barlanylýan bitewilik. Snapshot ediň, bölekleri paralel ýazyň, checksum bilen manifesti çap ediň, HTTP Range we gysga ýaýran baglanyşyklary goldaň. Howpsuzlygy, çäkleri we gözegçiligi göz öňünde tutuň - we gigabaýt eksportlar toparlar we ulanyjylar üçin gijeki düýş bolmaz.