صادرات چند و آپلود بزرگ
1) هنگامی که صادرات «بزرگ» مورد نیاز است و مهم است
سناریوها: گزارش های مالی، آپلود فعالیت های کاربر، ممیزی/تنظیم کننده، آپلود BI، دایرکتوری های شریک، پشتیبان گیری. الزامات کلیدی:- سازگاری داده ها (snapshot/point in time).
- قابلیت عبور در حجم (موازی نوشتن/خواندن، سریال سازی جریان).
- تحویل تجدید پذیر و جزئی.
- یکپارچگی (checksum) و قابلیت اطمینان (manifest).
- امنیت/PII (پوشش، رمزگذاری، کنترل دسترسی).
- مدیریت هزینه (فشرده سازی، زمان بندی، CDN، TTL).
2) فرمت های داده: جوانب مثبت/منفی
CSV - جمع و جور، سریع برای نوشتن/خواندن ؛ منفی: محافظ، انواع از دست داده است. مناسب برای گزارش های جدولی
JSON خطوط (JSONL) - توسط خط در هر شی، مناسب برای جریان و نمونه برداری جزئی ؛ منفی: حجم.
پارکت/آورو - قالب های ستون/مدار، فشرده سازی و پیش بینی فشار پایین ؛ ایده آل برای تجزیه و تحلیل و داده های بزرگ.
مخلوط: JSONL برای دانلود API → تبدیل آفلاین به پارکت.
فشرده سازی: 'gzip '/' zstd' (بهتر). برای حجم های بسیار بزرگ - آرشیو تقسیم (~ 128-512 MB در هر بخش).
3) سازگاری: چگونه می توان یک «عکس فوری» دریافت کرد
DB: انعطاف پذیری معامله قابل خواندن/SNAPSHOT قابل تکرار ؛ برای موضوعات، اسلات تکرار منطقی یا علامت (حداکثر. 'updated _ at '/version).
منابع رویداد: صادرات توسط ورود به سیستم افست.
برش ها: صادرات «کامل» + «deltas» (بارگذاری های بعدی تغییرات از زمان «علامت گذاری»).
4) چند بخش/chunking
4. 1 انواع «چند بخشی»
آپلود (به ما): چند بخش/فرم داده (فایل های کوچک)، S3 چند آپلود (MPU )/GCS Resumable (بزرگ).
Download (from us): محدوده HTTP ('bytes = start-end')، 'multipart/byteranges' (چندین محدوده در یک پاسخ)، 'zip of parts'، دایرکتوری ها در پشته شی.
4. 2 استراتژی های تقسیم
با اندازه (به عنوان مثال، 256 مگابایت در هر قسمت).
با کلید/تاریخ (sharding توسط 'tenant _ id'، 'YYYY/MM/DD').
توسط جدول/نهاد (فایل های فردی در هر نوع).
تعادل: قطعات 64-512 مگابایت به خوبی به صورت موازی دانلود می شوند و حافظه را بیش از حد گرم نمی کنند.
5) معماری صادرات API (مدل ناهمزمان)
مراحل:1. 'POST/export' → کار در صف (ابرداده: فرمت، فیلتر، رمزگذاری، طول عمر).
2. کارگران ساخت عکس های فوری، جریان داده ها، و نوشتن قطعات به شی ذخیره سازی.
3. ایجاد یک مانیفست (JSON) با یک لیست از قطعات، اندازه، checksum، نسخه طرح.
4. 'GET/export/{ id}' وضعیت و پیوند (ها) را به قسمت هایی از/URL از پیش امضا شده باز می گرداند.
5. 'GET/صادرات/{ شناسه }/آشکار. 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) قابل بازیابی
محدوده HTTP: مشتری «tail» فایل را بارگذاری می کند: «محدوده: بایت = 241172480-».
محدوده های چندگانه: «محدوده: بایت = 0-999، 2000-2999» → «محتوا نوع: چند بخش/byteranges» پاسخ.
استراتژی مشتری: موازی «کارگران» در قطعات، تایید «sha256» از هر، retrai با عقب نشینی نمایی.
CDN: پشتیبانی از محدوده، بافر پاسخ بزرگ غیر فعال است.
7) دریافت های بزرگ برای ما (آپلود مجدد)
S3 چند آپلود: مشتریان دانلود قطعات (5-5000)، سرور جمع آوری 'CompleteMultipartUpload'.
GCS Resumable - یک جلسه، آفست - مشتری می تواند با «Content-Range» ادامه دهد.
TUS (پروتکل) یک اپلود مستقل قابل تجدید در بالای HTTP است.
الگوی B2B: ما URL از پیش امضا شده را برای apload قطعات به طور مستقیم به فروشگاه و ابرداده به API ما ارسال می کنیم.
8) فشرده سازی، رمزگذاری، یکپارچگی
فشرده سازی: 'zstd' ترجیح داده شده (نسبت بهتر/سرعت). فشرده سازی هر بخش به طور جداگانه (راحت تر برای تجدید/کش).
رمزگذاری:- روی سیم: TLS 1. 2+.
- در حالت استراحت: KMS سمت سرور (SSE-KMS) یا سمت سرویس گیرنده (AES-256-GCM) با بسته بندی کلید.
- هرگز کلید «خام» را در مانیفست قرار ندهید.
- Checksum: حداقل SHA-256 در هر قسمت + مشترک برای کل مجموعه. بررسی در مشتری قبل از ACK.
9) ادغام محیط: NGINX/CDN
NGINX (محدوده + مدت زمان طولانی + غیر فعال کردن بافر):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;
}
}
هدر های پاسخ:
- 'محتوا-وضع: پیوست ؛ filename = "صادرات _ 2025-10-31 _ part-00000. پارکت. «زست»
- 'ETag '/' If-Range' برای بارگذاری صحیح.
- 'Cache-Control' (به عنوان مثال، 'خصوصی، حداکثر سن = 3600') برای آپلود شخصی.
10) ایمنی و انطباق
احراز هویت/مجوز: صدور صادرات فقط به مالک/نقش ؛ پیش امضا شده با TTL کوتاه.
PII: ماسک کردن/نام مستعار ؛ در آشکار - فقط زمینه های فنی.
GDPR/تنظیم کننده های محلی: حذف صادرات توسط TTL، ممیزی بارگیری، ممنوعیت صدور بین منطقه ای بدون دلیل.
محدود کردن نرخ و سهمیه: محدود کردن تعداد صادرات همزمان و حجم کل در روز/ماه (برای هر مستاجر).
Anti-scraping: فیلترهای CAP/bot برای صدور لینک، محدود کردن محدوده (حداکثر قطعات موازی).
11) قابلیت مشاهده و عملکرد
معیارها:- 'export _ jobs _ total {status}' (صف/در حال اجرا/موفق/ناموفق/منقضی شده)
- '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'
- چه کسی صادرات، فیلترها، علامت گذاری، لیست دانلود (IP/UA/time) را ایجاد کرد.
- هش قطعات و آشتی سمت مشتری (تایید).
- Spans: snapshot → serialize → بخش آپلود → finalize.
12) عملکرد و هزینه
موازی سازی: تولید چندین قسمت به طور همزمان (N کارگر)، اما محدود کردن I/O.
حافظه: سریال سازی جریان (تکرار کننده، نشانگر پایگاه داده، تکه های 4-16 مگابایت).
Dedup: برای صادرات مکرر، حافظه پنهان هوشمند قطعات توسط فیلترها/هش.
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 صدور بخش با محدوده
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 (روز/هفته) + deltas هر ساعت توسط 'updated _ at> watermark'.
در طرف مصرف کننده، deltas را با تأیید «version »/« seq» اعمال کنید.
آخرین علامت را در مصرف کننده و در آشکار نگه دارید.
15) ضد الگوهای
تولید صادرات در درخواست (همزمان) - زمان بندی و OOM.
یک فایل غول پیکر بدون تقسیم عدم توانایی برای از سرگیری/دانلود موازی است.
فقدان چک سام و آشکار - شما نمی توانید صداقت را ثابت کنید.
صدور لینک های عمومی دائمی به اطلاعات شخصی.
بافر SSE/CDN یا دامنه غیرفعال - «بارگذاری مجدد» را می شکند.
صادرات داده های کثیف (بدون عکس فوری/انزوا).
16) چک لیست پیاده سازی
- فرمت و فشرده سازی: CSV/JSONL/پارکت + 'zstd/gzip'.
- سازگاری: عکس فوری معاملاتی یا علامت/افست.
- پارتیشن بندی: 64-512 مگابایت قطعات، تولید موازی و دانلود.
- Manifest: لیست قطعات، ابعاد، SHA-256، نسخه طرح، علامت.
- تجدید: محدوده HTTP، پشتیبانی چند بخش/byteranges، مشتری retrays.
- امنیت: URL های از پیش امضا شده، TTL، رمزگذاری (KMS/AEAD)، ماسک PII.
- محدودیت/سهمیه: برای هر مستاجر، حجم روزانه، تعداد مشاغل فعال.
- قابل مشاهده بودن: معیارهای شغلی/بخشی، ممیزی بارگیری، هشدارهای خرابی چک.
- هزینه: CDN برای مجموعه های عمومی، TTL و تمیز کردن خودکار در فروشگاه.
- Runbooks/بازی روز: شکست شبکه، در دسترس نبودن فروشگاه، پایگاه داده بیش از حد، شکست KMS.
17) روزهای بازی (کتاب های بازی)
افت شبکه در هنگام بارگیری: مشتری باید با «Range» ادامه دهد.
یک قسمت بارگیری نشد: قسمت retray بدون بازسازی کل صادرات.
سقوط کارگر: کار با آخرین قطعه تایید نشده ادامه می یابد.
KMS در دسترس نیست: تخریب امن (مکث نسل، رمزگذاری نشده را آزاد نکنید).
× رشد داده 2: زمان تولید را بررسی کنید، توزیع مجدد موازی، پایگاه داده را از بین نبرید.
18) مجموع
بارهای بزرگ قابل اعتماد معماری ناهمزمان + پارتیشن بندی + تجدید + یکپارچگی قابل اثبات است. یک عکس فوری بگیرید، قطعات را به صورت موازی بنویسید، مانیفست را با چک سام منتشر کنید، از دامنه HTTP و پیوندهای کوتاه مدت پشتیبانی کنید. از طریق امنیت، محدودیت ها و قابلیت مشاهده فکر کنید - و صادرات گیگابایت متوقف خواهد شد که یک کابوس برای تیم ها و کاربران باشد.