قطعت التطبيقات عبر الإنترنت واسعة النطاق شوطا طويلا في العقدين الماضيين. لقد غيرت هذه الابتكارات تصوراتنا عن تطوير البرمجيات. Facebook و Instagram و Twitter ، على سبيل المثال ، كلها منصات قابلة للتطوير.
يجب بناء هذه الأنظمة لإدارة كميات هائلة من حركة المرور والبيانات لأن مليارات الأشخاص يستخدمونها في نفس الوقت في جميع أنحاء العالم. هذا هو الوقت تصميم النظام يدخل الصورة.
تُعرف عملية إنشاء البنية والواجهات والبيانات لنظام يلبي معايير معينة باسم تصميم النظام. من خلال أنظمة متماسكة وفعالة ، يلبي تصميم النظام متطلبات عملك أو مؤسستك.
بمجرد أن تحدد شركتك أو مؤسستك معاييرها ، يمكنك البدء في دمجها في تصميم نظام مادي يلبي متطلبات المستهلكين.
سواء اخترت التطوير حسب الطلب ، أو الحلول التجارية ، أو مزيجًا من الاثنين ، فإن كيفية تصميم نظامك ستحدد كيفية بنائه.
سنلقي نظرة مفصلة على تصميم نظام الجدول الزمني لتويتر في هذا المنشور ، مع استكمال البرنامج التعليمي. هيا بنا نبدأ.
الخطوة 1: وضع الخطوط العريضة لحالة الاستخدام والقيود
حالة الاستخدام
- يقوم المستخدم بتحميل تغريدة.
- ترسل الخدمة إشعارات الدفع ورسائل البريد الإلكتروني لمتابعي التغريدات.
- يتم عرض الجدول الزمني للمستخدم (نشاط من المستخدم)
- ينظر المستخدم إلى المخطط الزمني للمنزل (نشاط من الأشخاص الذين يتابعهم المستخدم)
- يتم البحث عن الكلمات الرئيسية من قبل المستخدم.
- الخدمة متاحة حقًا.
خارج النطاق
- يتم إرسال التغريدات إلى Twitter Firehose وغيرها من التدفقات التي تستخدم هذه الخدمة.
- تقوم الخدمة بإزالة التغريدات بناءً على إعدادات الرؤية للمستخدم.
- إذا كان المستخدم لا يتابع أيضًا الشخص الذي يتم الرد عليه ، فقم بإخفاء الرد.
- لاحظ خيار "إخفاء إعادة التغريد".
- التحليلات
القيود والافتراضات
افتراضات الدولة
- حركة المرور ليست مشتتة بالتساوي.
- يجب أن يكون إرسال تغريدة أمرًا سهلاً.
- ما لم يكن لديك الملايين من المتابعين ، يجب أن يكون إرسال تغريدة إلى جميع متابعيك سريعًا.
- هناك 100 مليون مستخدم نشط.
- 15 مليار تغريدة كل شهر أو 500 مليون تغريدة كل يوم
- تحتوي كل تغريدة على 10 توزيعات في المتوسط.
- كل يوم ، ينشر المشجعون 5 مليارات تغريدة.
- تقدم Fanout 150 مليار تغريدة كل شهر.
- 250 مليار طلب قراءة شهريًا
- 10 مليارات عملية بحث شهرية
Timeline
- يجب أن يكون الجدول الزمني سهل التنقل.
- إن موقع Twitter يتعلق بالقراءة أكثر من الكتابة.
- تحسين القراءة السريعة للتغريدات
- استهلاك التغريدات يستغرق وقتا طويلا.
بحث
- يجب أن تكون عملية البحث سريعة.
- يستغرق البحث وقتًا طويلاً.
احسب الاستخدام
حجم كل تغريدة:
- 8 بايت سقسقة معرف
- 32 بايت معرف المستخدم
- 140 بايت من النص
- الوسائط - متوسط 10 كيلوبايت
- الإجمالي: ~ 10 كيلوبايت
كل شهر ، يتم إنشاء 150 تيرابايت من محتوى التغريدات الجديد.
- * 500 مليون تغريدة يوميًا * 30 يومًا في الشهر * 10 كيلوبايت لكل تغريدة
- في ثلاث سنوات ، كان هناك 5.4 بيتابايت من محتوى التغريدات الجديد.
هناك 100,000 طلب قراءة كل ثانية.
- * (400 طلب في الثانية / 1 مليار طلب في الشهر) 250 مليار طلب قراءة كل شهر
هناك 6,000 تغريدة كل ثانية.
- * (400 طلب في الثانية / 1 مليار طلب في الشهر) 15 مليار تغريدة كل شهر
في حالة الجماهير ، يتم إرسال 60 ألف تغريدة كل ثانية.
- تقدم Fanout 150 مليار تغريدة كل شهر * (400 طلب في الثانية / 1 مليار طلب في الشهر).
4,000 طلب معلومات كل ثانية
- * (400 طلب في الثانية / 1 مليار طلب في الشهر) 10 مليارات عملية بحث كل شهر
بعض التحويل المفيد
- كل شهر ، تمر 2.5 مليون ثانية.
- 2.5 مليون طلب شهريًا بمعدل طلب واحد في الثانية
- 100 مليون طلب في الشهر × 40 طلبًا في الثانية
- 1 مليار طلب في الشهر = 400 طلب في الثانية
الخطوة 2: رسم تخطيطي عالي المستوى
الخطوة الثالثة: شرح المكونات الأساسية
يمكننا حفظ تغريدات المستخدم الخاصة لملء الجدول الزمني للمستخدم (نشاط من المستخدم) في قاعدة بيانات علائقية إذا أرسلوا تغريدة. من الصعب إرسال تغريدات وتطوير الخط الزمني للمنزل (نشاط من الأفراد يتابعهم المستخدم).
ستكون قاعدة البيانات العلائقية النموذجية غارقة في نشر التغريدات لجميع المتابعين (يتم تسليم 60 ألف تغريدة كل ثانية). ربما نرغب في استخدام تخزين بيانات سريع الكتابة مثل قاعدة بيانات NoSQL أو ذاكرة التخزين المؤقت.
تستغرق قراءة 1 ميغا بايت بالتتابع من الذاكرة ما يقرب من 250 ميكروثانية ، لكن القراءة من SSD تستغرق 4 أضعاف ، وتستغرق القراءة من القرص 80 ضعفًا.
يمكن استخدام متجر الكائنات لتخزين البيانات مثل الصور ومقاطع الفيديو.
- يتلقى خادم الويب ، الذي يعمل كوكيل عكسي ، تغريدة من العميل.
- يتم إرسال الطلب إلى خادم Write API بواسطة خادم الويب.
- تحفظ واجهة برمجة التطبيقات للكتابة التغريدة في قاعدة بيانات SQL في الجدول الزمني للمستخدم.
يتم الاتصال بخدمة Fan-Out بواسطة Write API ، وهي تقوم بتنفيذ المهام التالية.
- يعثر على أتباع المستخدم في ذاكرة التخزين المؤقت عن طريق الاستعلام عن User Graph Service.
- في ذاكرة التخزين المؤقت للذاكرة ، يتم حفظ التغريدة في الخط الزمني الرئيسي لمتابعي المستخدم.
- 1,000 متابع = 1,000 عملية بحث وإدراج = عملية O (n).
- يتم حفظ التغريدة في خدمة فهرس البحث للبحث السريع.
- يتم استخدام Object Store لتخزين الوسائط.
- يرسل تنبيهات الدفع إلى المتابعين عبر خدمة الإعلام.
- لإرسال التنبيهات بشكل غير متزامن ، فإنه يستخدم قائمة انتظار.
يمكننا استخدام قائمة Redis الأصلية بالهيكل التالي إذا كانت ذاكرة التخزين المؤقت الخاصة بنا هي Redis:
سيتم تحديث الجدول الزمني للمنزل للمستخدم بالتغريدة الجديدة ، والتي سيتم تخزينها في ذاكرة التخزين المؤقت للذاكرة. سنستخدم واجهة برمجة تطبيقات REST العامة التالية:
يتم عرض الجدول الزمني للمستخدم من قبل المستخدم.
- يتلقى خادم الويب طلب مخطط زمني للمستخدم من العميل.
- يتم إرسال الطلب إلى خادم Read API بواسطة خادم الويب.
- تستعلم واجهة برمجة التطبيقات للقراءة عن قاعدة بيانات SQL للإطار الزمني للمستخدم.
ستعمل واجهة برمجة تطبيقات REST بشكل مشابه للجدول الزمني الرئيسي ، باستثناء أن جميع التغريدات ستنشأ من المستخدم بدلاً من الأشخاص الذين يتابعونهم.
يبحث المستخدم عن الكلمات الرئيسية:
- يتلقى خادم الويب طلب بحث من العميل.
- يتم إرسال الطلب إلى خادم واجهة برمجة تطبيقات البحث من خلال خادم الويب.
الخطوة 4: الجدول الزمني لتويتر
إنشاء الجدول الزمني مهمة صعبة. مطلوب خادم إنشاء مخطط زمني يرتبط بالويب أو خوادم التطبيق.
في كل مرة يسجل فيها المستخدم الدخول ، تحتفظ خدمة المخطط الزمني بتتبع أحدث التغريدات من المستخدمين في جدول المتابعين وتقوم بتحديث أو تحديث الجدول الزمني للمستخدم.
نحن لا نطبق أي نوع من أنظمة التصنيف هنا ؛ بدلاً من ذلك ، نفترض أن أهم 5 تغريدات من متابعي المستخدم معروضة في الجدول الزمني بترتيب وقت الإنشاء. يمكننا الحفاظ على حد تحديث 50 تغريدة. ما زلنا نتوقف عن تحديث أو إنشاء مخطط زمني بعد الوصول إلى هذا الحد حتى يقوم المستخدم بتحديث الصفحة.
ستأتي مخاوف تتعلق بوقت الاستجابة والأداء العالي من إنشاء موجز المستخدم المباشر. بدلاً من ذلك ، فإن إنشاء دفق بلا اتصال يمكن تقديمه على الفور هو أفضل طريقة لتحسين الأداء. قم بتشغيل خوادم المخطط الزمني المخصصة التي تقوم باختبار اتصال خادم التطبيق بشكل منتظم لتحديث الموجز بناءً على الوقت الذي تم إنشاؤه فيه.
يجب أن تأخذ خوارزمية التصنيف في الاعتبار الإشارات الحاسمة وتوفر وزنًا لضمان عدم سيطرة مواد من حساب أو أكثر من الحسابات التي يتابعونها على الجدول الزمني للمستخدم.
بتعبير أدق ، يمكننا اختيار الميزات المتعلقة بمدى صلة أي عنصر موجز ، مثل عدد الإعجابات والتعليقات والمشاركات ووقت التحديث. يجب استخدام كل معيار من هذه المعايير لتقييم التغريدة ، ثم يجب استخدام هذا الترتيب لإظهار التغريدات على الخط الزمني.
هل يجب علينا تنبيه المستخدمين باستمرار عندما يتوفر محتوى جديد لملف الأخبار الخاص بهم؟ يمكن للمستخدمين أن يجدوا أنه من المفيد أن يتم تنبيههم عند توفر بيانات جديدة. ومع ذلك ، على الأجهزة المحمولة ، عندما يكون استخدام البيانات مكلفًا للغاية ، يمكن أن يضيع النطاق الترددي.
نتيجة لذلك ، يمكننا اختيار عدم دفع البيانات إلى الأجهزة المحمولة والسماح للمستخدمين بدلاً من ذلك بـ "السحب للتحديث" لعمليات النشر الجديدة.
الخطوة 5: تصميم التحجيم
عنق الزجاجة المحتمل هو خدمة Fanout. سيتعين على مستخدمي Twitter الذين لديهم ملايين المتابعين الانتظار عدة دقائق حتى يتم نشر تغريداتهم. قد يتسبب هذا في حدوث سباق مع الردود على التغريدة ، وهو ما يمكننا تجنبه بإعادة ترتيب التغريدات في وقت الإرسال.
يمكننا أيضًا منع نشر التغريدات من أشخاص لديهم عدد كبير من المتابعين. بدلاً من ذلك ، قد نقوم بالبحث عن التغريدات من أفراد متابعين بشكل كبير ، ودمج نتائج البحث مع نتائج الجدول الزمني لصفحة المستخدم ، ثم إعادة ترتيب التغريدات في وقت الخدمة.
تشمل التحسينات الإضافية ما يلي:
- احتفظ ببضع مئات من التغريدات في ذاكرة التخزين المؤقت للذاكرة لكل مخطط زمني للمنزل.
- في ذاكرة التخزين المؤقت للذاكرة ، يتم حفظ معلومات الخط الزمني للمنزل فقط للمستخدمين النشطين.
- يمكننا إعادة بناء التسلسل الزمني من قاعدة بيانات SQL إذا لم يكن المستخدم نشطًا في الثلاثين يومًا السابقة.
- لمعرفة من هو المستخدم ، استخدم خدمة User Graph Service.
- أضف التغريدات إلى ذاكرة التخزين المؤقت عن طريق استرجاعها من قاعدة بيانات SQL.
- يمكن لخدمة Tweet Info Service حفظ تغريدات شهرية فقط.
- في خدمة معلومات المستخدم ، يتم حفظ المستخدمين النشطين فقط.
- للحفاظ على وقت الاستجابة منخفضًا ، ستحتاج مجموعة البحث على الأرجح إلى الاحتفاظ بالتغريدات في الذاكرة.
وفي الختام
على الرغم من أن Twitter مؤسسة كبيرة ، إلا أنها أفضل فهم تصميم النظام. بذلت قصارى جهدي لتزويدك بنظرة عامة عالية المستوى على الجدول الزمني لتويتر.
آمل أن تكون قد حصلت على معلومات مفيدة منه ويمكن أن تستفيد منها بشكل جيد.
اترك تعليق