Skip to content

تخزين الملفات وتخزين الكائنات

مقدمة

مستخدم يرفع صورة رمزية، تخزنها في مجلد /uploads على الخادم - ثم يمتلئ قرص الخادم، أو تضيف خادمًا ثانيًا، ويكتشف المستخدم أن الصورة الرمزية تظهر وتختفي. تخزين الملفات يبدو بسيطًا، لكنه في البيئة الموزعة مشكلة معمارية تحتاج إلى معالجة جادة. تخزين الكائنات هو الحل القياسي لهذه المشكلة في عصر الإنترنت.

ماذا ستتعلم في هذا المقال؟

بعد إكمال هذا الفصل، ستكتسب:

  • معرفة أنواع التخزين: فهم الفروق بين تخزين الكتل وتخزين الملفات وتخزين الكائنات وسيناريوهاتها المناسبة
  • المفاهيم الأساسية لتخزين الكائنات: إتقان المفاهيم الأساسية مثل Bucket و Object و Key و Pre-signed URL
  • تصميم حلول الرفع: تعلم الاختيار بين الرفع المباشر من العميل مقابل الرفع عبر الخادم
  • مبدأ تسريع CDN: فهم كيفية تسريع CDN لتوزيع الموارد الثابتة عالميًا
  • أفضل الممارسات: إتقان تقنيات تسمية الملفات والتحكم في الصلاحيات وإدارة دورة الحياة
الفصلالمحتوىالمفاهيم الأساسية
الفصل 1مقارنة أنواع التخزينتخزين الكتل، تخزين الملفات، تخزين الكائنات
الفصل 2المفاهيم الأساسية لتخزين الكائناتBucket، Object، Key، البيانات الوصفية
الفصل 3حلول رفع الملفاتالرفع المباشر من العميل، Pre-signed URL
الفصل 4تسريع CDNالعقد الطرفية، استراتيجية التخزين المؤقت، الاسترجاع من الأصل
الفصل 5أفضل الممارساتمعايير التسمية، الصلاحيات، دورة الحياة

0. النظرة الشاملة: لماذا لا يمكن تخزين الملفات محليًا على الخادم؟

عند بدء مشروع، تخزين ملفات المستخدمين في مجلد محلي على الخادم هو النهج الأكثر بديهية. لكن مع تطور المشروع، ستواجه سلسلة من المشاكل:

  • مساحة القرص محدودة: قرص الخادم سيمتلئ في النهاية، والتوسع مزعج
  • الخوادم المتعددة لا تشارك: بعد موازنة الحمل، قد تصل طلبات المستخدم إلى خوادم مختلفة، ولا يتم العثور على الملفات
  • لا يوجد نسخ احتياطي: إذا تعطل الخادم، تضيع الملفات
  • لا يوجد CDN: المستخدمون العالميون يصلون إلى نفس الخادم، والسرعة بطيئة

القيمة الأساسية لتخزين الكائنات

تخزين الكائنات (مثل AWS S3 و Alibaba Cloud OSS) يحل جميع هذه المشاكل: سعة غير محدودة، وصول عالمي، نسخ احتياطي تلقائي، دعم CDN طبيعي. لقد أصبح المعيار الفعلي لتخزين الملفات في تطبيقات الإنترنت.


1. مقارنة أنواع التخزين: الكتل، الملفات، الكائنات

هناك ثلاث طرق تخزين رئيسية في عالم الحاسوب، تحل مشاكل على مستويات مختلفة.

Storage Type Comparison
Click to inspect the characteristics of each storage model
🧱
Block storage
📁
File storage
☁️
Object storage
Object storage
Stores files as objects through HTTP APIs. Each object has a unique key. It has a flat structure, nearly unlimited capacity, and low cost, making it a common choice for internet applications.
Access method
HTTP/HTTPS RESTful API (PUT/GET/DELETE)
Typical scenarios
Images, videos, backups, static site hosting, data lakes
Representative products
AWS S3, Alibaba Cloud OSS, MinIO, Cloudflare R2
Scalability
Nearly unlimited scaling with automatic distributed storage
البعدتخزين الكتلتخزين الملفاتتخزين الكائنات
وحدة البياناتكتل ثابتة الحجمملف + دليلكائن (Key-Value)
بروتوكول الوصولiSCSI/FCNFS/SMBHTTP REST API
الأداءالأعلى (مستوى المللي ثانية)متوسطأقل (لكن كافٍ)
قابلية التوسعمحدودةمتوسطةشبه غير محدودة
التكلفةالأعلىمتوسطةالأقل
السيناريو النموذجيقواعد البياناتالملفات المشتركةالصور/الفيديو/النسخ الاحتياطي

تذكر ببساطة

  • تخزين الكتل مثل القرص الصلب - لقواعد البيانات
  • تخزين الملفات مثل مجلد الشبكة المشترك - لمشاركة التكوين بين خوادم متعددة
  • تخزين الكائنات مثل التخزين السحابي - للصور والفيديوهات التي يرفعها المستخدمون

2. المفاهيم الأساسية لتخزين الكائنات

نموذج بيانات تخزين الكائنات بسيط جدًا: Bucket (الحاوية) هو الوعاء، Object (الكائن) هو الملف، كل كائن يُعرف من خلال Key (مفتاح) فريد.

my-app-bucket/                    ← Bucket (حاوية)
├── avatars/user-123.jpg          ← Object Key
├── avatars/user-456.png          ← Object Key
├── reports/2024/q1-report.pdf    ← Object Key ("الدليل" مجرد بادئة للمفتاح)
└── uploads/temp/file.zip         ← Object Key
المفهومالوصفمثال
Bucketحاوية تخزين، تسمية فريدة عالميًاmy-app-prod، company-assets
Objectالملف المخزن + البيانات الوصفيةصورة، PDF
Keyالمعرف الفريد للكائنavatars/user-123.jpg
البيانات الوصفيةمعلومات إضافية عن الكائنContent-Type، وسوم مخصصة
ACLقائمة التحكم في الوصولpublic-read، private
Pre-signed URLرابط وصول مؤقت مصرح بهرابط رفع/تنزيل صالح لمدة 15 دقيقة

تخزين الكائنات ليس به "أدلة" حقيقية

avatars/user-123.jpg ليست avatars/ دليلاً، بل مجرد بادئة للمفتاح. تخزين الكائنات هو هيكل مسطح، جميع الكائنات في نفس المستوى. "المجلدات" المعروضة في لوحة التحكم هي مجرد تأثير بصري للتجميع حسب البادئة.


3. حلول رفع الملفات: من يرفع الملف؟

هناك حلان رئيسيان لرفع الملفات: الرفع عبر الخادم والرفع المباشر من العميل. في معظم السيناريوهات، الرفع المباشر من العميل هو الخيار الأفضل.

File Upload Method Comparison
Switch between upload modes to compare their flow
1
Client → Server
The user selects a file and uploads it to your backend server
Large files consume server bandwidth and memory
2
Server receives file
The backend temporarily stores the file on local disk or in memory
May hit Nginx body size limits
3
Server → OSS
The backend forwards the file to object storage
The file is transferred twice, which is inefficient
4
OSS returns URL
Object storage returns the file access URL
5
Server → Client
The backend returns the file URL to the frontend

مزايا الرفع المباشر من العميل

  1. توفير عرض النطاق الترددي للخادم: الملف لا يمر عبر خادمك، بل يذهب مباشرة إلى OSS
  2. تجنب انتهاء المهلة: رفع الملفات الكبيرة لا يؤدي إلى تجاوز حد مهلة Nginx/البوابة
  3. تقليل حمل الخادم: الخادم يحتاج فقط لإصدار بيانات الاعتماد، دون معالجة تدفق الملفات
  4. دعم الاستئناف من نقطة التوقف: OSS يدعم الرفع متعدد الأجزاء أصلاً، ويمكن للواجهة الأمامية تنفيذ الاستئناف

خطوات التنفيذ: الواجهة الأمامية تطلب من الخلفية الحصول على Pre-signed URL → الواجهة الأمامية تستخدم هذا الرابط للرفع مباشرة إلى OSS → OSS تعيد الاتصال بالخلفية للإشعار


4. تسريع CDN: جعل المستخدمين العالميين سريعين

عندما ينتشر مستخدموك حول العالم، سيكون تنزيل الملفات من مصدر واحد بطيئًا. CDN (Content Delivery Network) من خلال نشر عقد طرفية حول العالم، تخزن الملفات مؤقتًا في أقرب عقدة للمستخدم، مما يقلل بشكل كبير من زمن الوصول.

How CDN Acceleration Works
Compare file access paths with and without CDN
👤
Beijing user
5ms
Beijing CDN node
Cache hit
Return to origin on cache miss
🏢
Origin (US West S3)
Time to first byte (TTFB)
~30ms
Download 1MB image
~50ms
مفهوم CDNالوصف
العقدة الطرفيةخوادم تخزين مؤقت موزعة حول العالم
الاسترجاع من الأصلعندما لا يكون لدى العقدة الطرفية نسخة مخزنة، تطلب الملف من المصدر
معدل إصابة التخزين المؤقتنسبة الطلبات التي تستجيب لها العقدة الطرفية مباشرة، كلما ارتفع كان أفضل
TTLمدة صلاحية التخزين المؤقت، بعد انتهائها تحتاج لإعادة الاسترجاع من الأصل
تحديث التخزين المؤقتمسح التخزين المؤقت للعقد الطرفية بشكل نشط، لجعل الملفات الجديدة سارية

أفضل ممارسات CDN

  • إضافة hash لاسم الملف: logo.a3f2b1.png بدلاً من logo.png، هكذا عند تحديث الملف لا تحتاج لتحديث التخزين المؤقت
  • تعيين TTL مناسب: الموارد الثابتة (JS/CSS/صور) تعيين TTL طويل (سنة واحدة)، HTML تعيين TTL قصير (5 دقائق)
  • تفعيل ضغط Gzip/Brotli: الموارد النصية تنخفض بنسبة 60-80% بعد الضغط

5. أفضل الممارسات

الممارسةالوصفمثال
معايير تسمية Keyتنظيم الملفات ببادئات ذات معنى{type}/{date}/{uuid}.{ext}
تجنب المفاتيح الساخنةلا تبدأ بأرقام متزايدةاستخدم UUID أو بادئة hash
تقليل الصلاحياتBucket افتراضيًا privateفقط للملفات التي تحتاج للنشر العام تعيين public-read
قواعد دورة الحياةتنظيف تلقائي للملفات منتهية الصلاحيةالملفات المؤقتة تحذف تلقائيًا بعد 7 أيام
تكوين النطاقات المتقاطعةالرفع المباشر من الواجهة الأمامية يحتاج تكوين CORSالسماح بنطاقك PUT/POST
تشفير الخادمتشفير الملفات الحساسةSSE-S3 أو SSE-KMS

الخلاصة

تخزين الملفات هو مشكلة أساسية تواجه كل تطبيق ويب. تخزين الكائنات بسعته غير المحدودة وتكلفته المنخفضة وتوفره العالي، أصبح الخيار القياسي لتطبيقات الإنترنت.

مراجعة النقاط الرئيسية لهذا الفصل:

  1. ثلاثة أنواع تخزين: تخزين الكتل لقواعد البيانات، تخزين الملفات للمشاركة، تخزين الكائنات لملفات المستخدمين
  2. نموذج تخزين الكائنات: Bucket + Key + Object، هيكل مسطح، وصول عبر HTTP API
  3. الرفع المباشر من العميل: حل Pre-signed URL، الملف لا يمر عبر الخادم، فعال وموفر للموارد
  4. تسريع CDN: تخزين مؤقت في العقد الطرفية + hash اسم الملف، لجعل المستخدمين العالميين سريعين
  5. الأمان والإدارة: تقليل الصلاحيات، قواعد دورة الحياة، تشفير الخادم

قراءة إضافية