الصادرات المتعددة الأجزاء والتحميلات الكبيرة
1) عندما تكون هناك حاجة إلى صادرات «كبيرة» وما هو مهم
السيناريوهات: التقارير المالية، وتحميلات نشاط المستخدم، وعمليات التدقيق/المنظمين، وتحميلات الكتاب المقدس، وأدلة الشركاء، والنسخ الاحتياطية. الاحتياجات الرئيسية:- اتساق البيانات (لقطة/نقطة زمنية).
- إمكانية المرور في المجلد (كتابة/قراءة موازية، تسلسل البث).
- التسليم المتجدد والجزئي.
- النزاهة (checksum) وإمكانية التحقق (بيان).
- الأمن/PII (الإخفاء والتشفير والتحكم في الدخول).
- إدارة التكاليف (الضغط، المهلات، CDN، TTL).
2) صيغ البيانات: الإيجابيات/السلبيات
CSV - مضغوط، سريع الكتابة/القراءة ؛ السلبيات: الحماية، الأنواع المفقودة. جيد للتقارير المجدولة.
JSON Lines (JSONL) - حسب الخط لكل كائن، وملائم للبث وأخذ العينات الجزئية ؛ السلبيات: الحجم.
Parquet/Avro - أشكال العمود/الدائرة، الضغط والتنبؤ بالدفع ؛ مثالية للتحليلات والبيانات الضخمة.
مختلط: JSONL لتنزيل API → تحويل غير متصل إلى Parquet.
الضغط: «gzip »/« zstd» (أفضل). للأحجام الكبيرة جدًا - أرشيفات مقسمة (~ 128-512 ميجابايت لكل جزء).
3) الاتساق: كيفية الحصول على «لقطة»
DB: قابل للتكرار اقرأ/SNAPSHOT عزلة المعاملات ؛ بالنسبة للخيوط أو فتحات التكرار المنطقية أو العلامات المائية (الحد الأقصى "محدث _ at'/النسخة).
مصادر الأحداث: التصدير حسب سجل التعويض.
الشرائح: التصدير «الكامل» + «الدلتا» (التحميلات اللاحقة للتغييرات منذ «العلامة المائية»).
4) قطع متعددة/قطع
4. 1 أنواع «متعددة الأجزاء»
تحميل (إلينا): multipart/form-data (ملفات صغيرة), S3 Multipart Upload (MPU )/GCS Restainable (كبير).
تنزيل (منا): نطاق HTTP («bytes = start-end')،» multipart/byteranges «(عدة نطاقات في استجابة واحدة)،» zip of parts'، أدلة في كومة الكائن.
4. 2 استراتيجيات التقسيم
حسب الحجم (على سبيل المثال، 256 ميجابايت لكل جزء).
حسب المفتاح/التاريخ (الشحن بواسطة 'المستأجر _ id'، 'YYYY/MM/DD').
حسب الجدول/الكيان (الملفات الفردية لكل نوع).
التوازن: يتم تنزيل أجزاء 64-512 ميجابايت جيدًا بالتوازي ولا تسخن الذاكرة.
5) بنية واجهة برمجة التطبيقات التصديرية (نموذج غير متزامن)
الخطوات:1. وظيفة → "POST/exports' في قائمة الانتظار (البيانات الوصفية: التنسيق، المرشحات، التشفير، العمر).
2. يقوم العمال ببناء لقطات، وتدفق البيانات، وكتابة الأجزاء لتخزين الأشياء.
3. قم بإنشاء بيان (JSON) مع قائمة بالأجزاء والأحجام والكشكسوم وإصدار المخطط.
4. «GET/Exports/{ id}» حالة العوائد والربط (الربط) بأجزاء من/عنوان URL الموقع مسبقًا.
5- 'GET/Exports/{ id }/manifest. جسون - آلة الحقيقة للتحقق/إعادة التحميل.
مثال واضح: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: يقوم العميل بتحميل «ذيل» الملف: «النطاق: بايت = 241172480-».
النطاقات المتعددة: «النطاق: البايتات = 0-9992000-2999» → «نوع المحتوى: استجابة متعددة الأطراف/byteranges».
استراتيجية العميل: موازية «العمال» في أجزاء، التحقق من «sha256» لكل منها، retrai مع تراجع أسي.
CDN: دعم النطاق، وتعطيل الاستجابة الكبيرة.
7) تنزيلات كبيرة لنا (تحميل قابل للاستئناف)
S3 Multipart Upload: يقوم العملاء بتنزيل الأجزاء (5-5000)، ويجمع الخادم "CompleteMultipartUpload'.
GCS المستأنف - جلسة واحدة، تعويضات - يمكن للعميل الاستمرار في «نطاق المحتوى».
TUS (بروتوكول) هو حمل مستقل متجدد على رأس HTTP.
النمط B2B: نرسل عنوان URL الموقع مسبقًا لتحميل الأجزاء مباشرة إلى المتجر، والبيانات الوصفية إلى واجهة برمجة التطبيقات الخاصة بنا.
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;
}
}
رؤوس الرد:
- 'المحتوى - التصرف: المرفق ؛ اسم الملف = "export _ 2025-10-31 _ part-00000. parquet. zst"
- 'ETag '/' If-Range' للتحميل الصحيح.
- "Cache-Control' (على سبيل المثال،" private، max-age = 3600 ") للتحميلات الشخصية.
10) السلامة والامتثال
التوثيق/الإذن: إصدار الصادرات إلى المالك/الأدوار فقط ؛ تم توقيعه مسبقًا مع TTL قصير.
PII: الإخفاء/التسريح ؛ في البيان - المجالات التقنية فقط.
اللائحة العامة لحماية البيانات/المنظمون المحليون: حذف الصادرات بواسطة TTL، مراجعة عمليات التنزيل، حظر الإصدار عبر الإقليمي دون سبب.
تحديد الأسعار والحصص: الحد من عدد الصادرات المتزامنة وإجمالي الحجم في اليوم/الشهر (لكل مستأجر).
مضاد للكشط: مرشحات CAP/bot لإصدار الروابط، ونطاقات الحد (الأجزاء المتوازية القصوى).
11) إمكانية الرصد والتشغيل
المقاييس:- 'export _ jobs _ total {status}' (قائمة الانتظار/التشغيل/النجاح/الفشل/انتهاء الصلاحية)
- 'export _ bytes _ total', 'export _ part _ tormation _ ms {p50, p95, p99}'
- «download _ range _ requests _ total», «reseves _ total», «checksum _ fail _ total»
- 'storage _ cost _ estimate' и 'ext _ bytes _ cdn'
- من أنشأ قائمة التصدير والفلاتر والعلامة المائية والتنزيل (IP/UA/time).
- تجزئة القطع وتسوية جانب العملاء (تأكيدات).
- Spans: لقطة → تسلسل → تحميل جزء → الانتهاء.
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 (يوم/أسبوع) + دلتا كل ساعة بواسطة «محدث _ على> علامة مائية».
على جانب المستهلك، قم بتطبيق الدلتا من خلال التحقق من «version »/« seq».
احتفظ بآخر علامة مائية في المستهلك وفي البيان.
15) الأنماط المضادة
توليد الصادرات في الطلب (متزامن) - المهلة و OOM.
أحد الملفات العملاقة بدون تقسيم هو عدم القدرة على استئناف/التنزيل المتوازي.
قلة الشيكات والظهور - لا يمكنك إثبات النزاهة.
إصدار روابط عامة دائمة بالبيانات الشخصية.
تخزين SSE/CDN أو النطاق المعاق - يكسر «إعادة التحميل».
تصدير البيانات القذرة (بدون لقطة/عزل).
16) قائمة التنفيذ المرجعية
- الشكل والضغط: CSV/JSONL/Parquet + 'zstd/gzip'.
- الاتساق: لقطة معاملات أو علامة مائية/تعويض.
- التقسيم: 64-512 ميجابايت من الأجزاء، التوليد والتنزيل الموازي.
- بيان: قائمة الأجزاء، والأبعاد، SHA-256، ونسخة المخطط، والعلامة المائية.
- التجديد: HTTP Range، دعم «multipart/byteranges»، إعادة تشغيل العملاء.
- الأمن: عناوين URL موقعة مسبقًا، TTL، التشفير (KMS/AEAD)، قناع PII.
- الحدود/الحصص: لكل مستأجر، والأحجام اليومية، وعدد الوظائف العاملة.
- قابلية الملاحظة: مقاييس الوظيفة/الجزء، عمليات تدقيق التنزيل، تنبيهات فشل الشيكات.
- التكلفة: CDN للأطقم العامة و TTL والتنظيف التلقائي في المتجر.
- كتب التشغيل/أيام اللعبة: فواصل الشبكة، عدم توفر المتجر، ارتفاع درجة حرارة قاعدة البيانات، فشل KMS.
17) أيام اللعبة (كتب اللعب)
إسقاط الشبكة أثناء التنزيل: يجب على العميل الاستمرار في «المدى».
فشل جزء واحد في التحميل: إعادة الدفع الجزئي دون إعادة إنشاء التصدير بأكمله.
سقوط العامل: تستأنف الوظيفة مع آخر جزء غير مؤكد.
KMS غير متوفر: تدهور آمن (توقف جيل مؤقت، لا تطلق غير مشفر).
نمو البيانات × 2: التحقق من وقت التوليد، وإعادة توزيع التوازي، لا تقتل قاعدة البيانات.
18) المجاميع
التفريغ الكبير الموثوق به هو بنية غير متزامنة + تقسيم + تجديد + سلامة يمكن التحقق منها. خذ لقطة، واكتب الأجزاء بالتوازي، وانشر بيانًا مع الشيكات، ودعم HTTP Range والروابط قصيرة العمر. فكر في الأمن والحدود وقابلية الملاحظة - وستتوقف صادرات الجيجابايت عن كونها كابوسًا للفرق والمستخدمين.