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) ырааттуулук: кантип алуу үчүн "сүрөт"
DD: транзакциялык изоляция 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 MB бөлүктөрү параллелдүү жүктөлөт жана эстутумду ысытпайт.
5) API-экспорттук архитектура (асинхрондук модели)
Кадамдар:1. 'POST/exports' → кезектеги тапшырма (метадеректер: формат, чыпкалар, шифрлөө, жашоо мөөнөтү).
2. Воркерлер snapshot куруп, маалыматтарды агып, объектинин сактагычына бөлүктөрдү жазышат.
3. Манифест (JSON) бөлүктөрүнүн тизмеси, өлчөмдөрү, checksum, схеманын версиясы менен түзүлөт.
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), Server чогултат 'CompleteMultipartUpload'.
GCS Resumable: бир сессия, жылыштар - кардар 'Content-Range' менен уланта алат.
TUS (протокол) - HTTP үстүнөн көз карандысыз кайра жаралуучу аплоад.
B2B үлгүсү: Биз түздөн-түз апплоад бөлүктөрү үчүн pre-signed URL берип, жана метадеректер - биздин API.
8) кысуу, шифрлөө, бүтүндүк
Компрессия: 'zstd' артыкчылык (жакшы ratio/ылдамдыгы). Ар бир бөлүгүн өзүнчө кысып (кайра/кэш үчүн ыңгайлуу).
Шифрлөө:- зымда: TLS 1. 2+.
- Тынч: server-side KMS (SSE-KMS) же client-side (AES-256-GCM) ачкычты ороп (негизги wrapping).
- Эч качан "чийки" ачкычты манифестке салбаңыз.
- 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) Коопсуздук жана комплаенс
Аутентификация/авторизация: экспортту ээсине/ролдорго гана берүү; убактылуу шилтемелер (pre-белги) кыска TTL менен.
PII: маскировка/псевдоним; манифестте - техникалык талаалар гана.
GDPR/жергиликтүү жөнгө салуучу: TTL боюнча экспортту алып салуу, download аудит, негизсиз кросс-аймактык чыгарууну тыюу.
Rate limiting & quotas: бир эле учурда экспорттун санын жана күнүнө/айына жалпы көлөмүн чектөө (per-tenant).
Анти-скрапинг: SAR/бот чыпкалары шилтемелерди берүү, диапазондорду чектөө (максималдуу параллелдүү бөлүктөрү).
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 workers), бирок I/O чектеңиз.
Эс: агымдык сериалдаштыруу (итераторлор, DD курсорлору, 4-16 МБ чанктар).
Дедуп: көп учурда кайталанган экспорттор үчүн акылдуу cache of parts боюнча чыпкалар/хеш.
CDN: "жалпы" коомдук топтомдор үчүн пайдалуу; жеке үчүн - этият (коопсуздук/PII).
13) Interface мисалдар
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 Worker Psevdocode
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 экспорттук үлгүлөрү
Толук экспорт N жолу (күн/жума) + delta ар бир саат 'updated _ at> watermark'.
Керектөөчү тарапта: дельталарды "version "/" seq" деп текшерүү менен колдонуу.
Акыркы суу маркасын керектөөчүдө жана манифестте сактаңыз.
15) Анти-үлгүлөрү
Суроо-талапта экспортту генерациялоо (синхрондуу) - таймауттар жана ООМ.
бөлүнбөстөн бир ири файл - жандандыруу/параллелдүү жүктөө мүмкүн эмес.
checksum жана манифесттин жоктугу - бүтүндүгүн далилдөө мүмкүн эмес.
Жеке маалыматтарга туруктуу коомдук шилтемелерди берүү.
Буферизация SSE/CDN же өчүрүлгөн Range - бузат "жүктөө".
"кир" маалыматтарды экспорттоо (snapshot/обочолонгон жок).
16) Киргизүү чек-тизмеси
- Формат жана кысуу: CSV/JSONL/Parquet + 'zstd/gzip'.
- ырааттуулук: бүтүм snapshot же watermark/offset.
- Бөлүү: 64-512 MB бөлүктөрү, параллелдүү муун жана жүктөп алуу.
- Манифест: бөлүктөрүнүн тизмеси, өлчөмдөрү, SHA-256, схема версиясы, watermark.
- Улантуу: HTTP Range, колдоо 'multipart/byteranges', кардар retra.
- Коопсуздук: pre-signed URLs, TTL, коддоо (KMS/AEAD), PII жашыруу.
- Лимиттер/квоталар: per-tenant, күнүмдүк көлөмдөр, активдүү джоб саны.
- Байкоо: Gob/бөлүктөрүнүн метрика, download аудит, checksum-fail боюнча алерт.
- Наркы: коомдук топтомдор үчүн CDN, TTL жана auto-тазалоо.
- Runbooks/Game Days: тармактын үзүлүшү, кол тийбестик, БДнын ысып кетиши, KMS мүчүлүштүктөрү.
17) Game Days (Playbook)
Жүктөөдө тармак үзүлүшү: кардар 'Range' менен уланышы керек.
Бир бөлүгүн жүктөө ийгиликсиз: бардык экспортту кайра түзбөстөн, тетиктер.
Worker жыгылышы: Джоба акыркы тастыкталбаган чандан кайра башталат.
KMS жеткиликсиз: коопсуз деградация (генерацияны токтотуу, шифрленбеген чыгарбоо).
Маалымат өсүшү × 2: жаралуу убактысын текшерүү, параллелизмди кайра бөлүштүрүү, DD өлтүрбөө.
18) натыйжалары
Ишенимдүү чоң жүктөр - бул асинхрондук архитектура + бөлүктөргө бөлүнүү + жаңылануу + текшерилүүчү бүтүндүк. snapshot, параллелдүү бөлүктөрүн жазуу, checksum менен манифест жарыялоо, HTTP Range жана кыска мөөнөттүү шилтемелерди колдоо. Коопсуздукту, чектөөлөрдү жана байкоону ойлонуп көрүңүз - жана гигабайт экспорттор командалар жана колдонуучулар үчүн коркунучтуу түш болбой калат.