יצוא רב ־ גוני ועליות גדולות
1) כאשר דרושים יצוא ”גדול” ומה חשוב
תרחישים: דוחות כספיים, העלאות פעילות המשתמש, ביקורות/רגולטורים, העלאות BI, ספריות שותף, גיבויים. דרישות מפתח:- עקביות נתונים (צילום/נקודה בזמן).
- מעבר בנפח (כתיבה/קריאה מקבילה, הזרמת סריאליזציה).
- משלוח מתחדש וחלקי.
- שלמות (checksum) ואימות (מניפסט).
- אבטחה/PII (מיסוך, הצפנה, בקרת גישה).
- ניהול עלויות (דחיסה, פסקי זמן, CDN, TTL).
2) פורמטים נתונים: יתרונות/חסרונות
CSV - קומפקטי, מהיר לכתיבה/קריאה; חסרונות: מיגון, סוגים אבודים. טוב לדיווחים טבעיים.
קווי JSON (JSONL) - על ידי קו לכל אובייקט, נוח להזרמה ודגימה חלקית; חסרונות: נפח.
פרקט/אברו - עמודה/תבניות מעגל, דחיסה וחיזוי שכיבות סמיכה; אידיאלי לאנליטיקה ונתונים גדולים.
מעורבב: JSONL להורדת API # המרה לא מקוונת לפרקט.
דחיסה: "gzip "/" zstd' (טוב יותר). לכרכים גדולים מאוד - ארכיונים מפוצלים (~ 128-512 MB לחלק).
3) עקביות: כיצד להשיג ”צילום”
DB: Repartable Read/SNAPSHOT Transactional Division; עבור אשכולות, חריצי שכפול לוגיים או סימן מים (max. "מעודכן _ at'/גרסה).
מיקור אירועים: יצוא על ידי רישום קיזוז.
פרוסות: ”מלא” ייצוא + ”deltas” (לאחר מכן העלאות של שינויים מאז ”watermark”).
4) מולטי פארט/צ 'אנק
4. 1 סוגים של ”רב ־ חלקים”
העלאה (אלינו): Multipart/form-data (קבצים קטנים), S3 Multipart Upload (MPU )/GCS Resummable (גדול).
הורדה (מאיתנו): HTTP Range ('bytes = start-end'),' multipart/byteranges '(מספר טווחים בתגובה אחת),' zip of parts ', ספריות בערימת העצם.
4. 2 אסטרטגיות פיצול
לפי גודל (לדוגמה, 256 MB לחלק).
על ידי key/date (מחודד על ידי "terant _ id'," YYYY/MM/DD ").
על ידי טבלה/ישות (קבצים בודדים לכל סוג).
שיווי משקל: חלקים של 64-512 MB מורידים היטב במקביל ולא מתחממים יתר על המידה בזיכרון.
5) ייצוא ארכיטקטורת API (מודל אסינכרוני)
צעדים:1. 'POST/Exporting' Gob = עבודה בתור (metadata: פורמט, מסננים, הצפנה, לכל החיים).
2. עובדים בונים תמונות, מזרימים נתונים, וכותבים חלקים לאחסון אובייקטים.
3. צור מניפסט (JSON) עם רשימה של חלקים, גדלים, checksum, סכימה.
4. 'GET/Export/Yid' מחזירה מעמד וקישור (s) לחלקים של/חתומים מראש כתובת.
5. 'קבל/יצוא/& id/מניפסט. מכונת אמת לאימות/טעינה מחדש.
רשימת דוגמאות: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: הלקוח טוען את ”הזנב” של הקובץ: ”Range: bytes = 241172480-”.
מספר טווחים: 'Range: bytes = 0-999, 2000-2999' Content-Type: multipart/byteranges 'reservation.
אסטרטגיית הלקוח: מקביל ”עובדים” בחלקים, אימות של 'sha256' של כל אחד, retrai עם גיבוי מעריכי.
CDN: תמיכה בטווח, חיץ תגובה גדול מנוטרל.
7) הורדות גדולות אלינו (העלאה חוזרת)
S3 Multipart Upload: לקוחות מורידים חלקים (5-5000), השרת אוסף את 'LoughtPartupload'.
GCS ניתן להחזרה - מפגש אחד, קיזוז - הלקוח יכול להמשיך עם 'Content-Range'.
פרוטוקול TUS (ראשי תיבות של TUS) הוא התקן חידוש עצמאי על גבי HTTP.
תבנית B2B: אנו שולחים את הכתובת החתומה מראש עבור כמות החלקים ישירות לחנות, ואת המטא-נתונים ל-API שלנו.
8) דחיסה, הצפנה, שלמות
דחיסה: "zstd' עדיפה (יחס טוב יותר/מהירות). דחוס כל חלק בנפרד (נוח יותר לחדש/מטמון).
הצפנה:- על החוט: TLS 1. 2+.
- במנוחה: בצד השרת KMS (SSE-KMS) או בצד הלקוח (AES-256-GCM) עם עטיפת מפתחות.
- לעולם אל תשים מפתח ”גולמי” במניפסט.
- Checksum: מינימום SHA-256 לחלק + נפוץ עבור כל הקבוצה. בדוק על הלקוח לפני אק.
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;
}
}
כותרות תגובה:
- 'תוכן-נטייה: מצורף; שם קובץ = "export _ 2025-10-31 _ part-000000. פרקט. zst'"
- 'Etag '/' If-Range' עבור טעינה נכונה.
- 'מטמון-בקרה' (לדוגמה, 'פרטי, מקסימום גיל = 3600') עבור העלאות אישיות.
10) בטיחות וציות
אימות/אישור: הנפקת יצוא רק לבעלים/תפקידים; חתום מראש עם TTL קצר.
PII: מיסוך/כינוי; במניפסט - רק בתחומים טכניים.
GDPR/רגולטורים מקומיים: מחיקת הייצוא על ידי TTL, בחינת הורדות, איסור על הפקת סחורה חוצה-אזורית ללא סיבה.
מגביל את מספר היצוא הסימולטני והנפח הכולל ליום/חודש (לכל דייר).
אנטי-גירוד: מסנני CAP/בוט להפקת קישורים, מגבילים טווחים (חלקים מקבילים מקסימליים).
11) יכולת תצפית ותפעול
מדדים:- 'export _ works _ total _ status' (תור/ריצה/הצליח/נכשל/פג תוקף)
- 'export _ bytes _ total', 'export _ part _ wardation _ ms _ p50, p95, p99'
- 'Download _ range _ coses _ total', 'קורות חיים _ total', 'checksum _ fall _ total&fs
- 'storage _ cost _ associate' egress _ bytes _ cdn&fose
- מי יצר את הייצוא, המסננים, סימן המים, רשימת ההורדות (IP/UA/time).
- חשיש חלקי ופיוס צד לקוח (אישורים).
- spans: snapshot = serialize = להעלות חלק = לסיים.
12) ביצועים ועלות
מקבילית: צור חלקים מרובים בו זמנית (N Workers), אך הגביל את I/O.
זיכרון: הזרמת סריאליזציה (איטרטורים, מסכי נתונים, נתחים של 4-16 MB).
דדופ: עבור יצוא חוזר ונשנה, מטמון חכם של חלקים על ידי פילטרים/חשיש.
CDN: מועיל עבור סטים ציבוריים ”גנריים”; לזהירות אישית (בטיחות/מח "ש).
13) דוגמאות של ממשקים
13. 1 צור ייצוא (מנוחה)
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 (יום/שבוע) + דלתות כל שעה על ידי 'עדכון _ at> סימן מים'.
בצד הצרכני, ליישם את הדלתות על ידי אימות 'version '/' seq'.
שמור את סימן המים האחרון בצרכן ובמניפסט.
15) אנטי דפוסים
יצוא דור בקשת (סינכרוני) - פסקי זמן ו-OOM.
קובץ ענק אחד ללא פיצול הוא חוסר היכולת לחדש/להקביל הורדה.
היעדר צ 'קסום וגילוי - אתה לא יכול להוכיח יושרה.
הוצאה של קישורים ציבוריים קבועים למידע אישי.
חציצה של SSE/CDN או טווח מנוטרל - שוברת את ה ”טעינה מחדש”.
ייצוא מידע מלוכלך (ללא צילום/בידוד).
16) רשימת מימושים
[ ] פורמט ודחיסה: CSV/JSONL/Parquet + zstd/gzip.
[ ] עקביות: תמונת מעבר או סימן מים/קיזוז.
[ ] מחיצה: 64-512 חלקי MB, דור מקביל והורדה.
[ ] מניפסט: רשימת חלקים, ממדים, SHA-256, סכימה, סימן מים.
[ חידוש ]: HTTP Range, 'מולטי-פארט/בייטרנג' תמיכה, מגשים מחדש לקוח.
אבטחה: כתובות חתומות מראש, TTL, הצפנה (KMS/AEAD), מיסוך PII.
גבולות/מכסות: לכל דייר, כרכים יומיים, מספר עבודות פעילות.
[ תצפית ]: מטרי עבודה/חלק, ביקורת הורדה, התראות צ 'קסום-כשל.
[ עלות ]: CDN עבור סטים ציבוריים, TTL וניקוי אוטומטי בחנות.
[ ] Runbooks/Game Days: רשת נשברת, חנות לא זמינה, מסד נתונים מתחמם יתר על המידה, כשל KMS.
17) ימי משחק (חוברות משחק)
הורדת רשת במהלך ההורדה: הלקוח חייב להמשיך עם 'Range'.
חלק אחד לא הצליח לטעון: חלק המגש מחדש מבלי לשחזר את כל היצוא.
העבודה מתחדשת עם החתיכה האחרונה שלא אושרה.
KMS לא זמין: ביטול מאובטח (הפוגה בדור, אל תשחרר לא מוצפן).
צמיחת נתונים x2: לבדוק את זמן הדור, לחלק מקביליות מחדש, לא להרוג את מסד הנתונים.
18) סיכומים
פריקות גדולות אמינות הן ארכיטקטורה אסינכרונית + החלקה + חידוש + שלמות ניתנת לאימות. קחו תצלום, כתבו חלקים במקביל, פרסמו מניפסט עם checksum, תמכו ב HTTP Range וקישורים קצרים. תחשוב דרך ביטחון, גבולות ויכולת תצפית - ויצוא ג 'יגה בייט יחדל להיות סיוט עבור צוותים ומשתמשים.