سؤال

أنا فقط رأيت فرحان "صعود وسقوط تويتر" مما جعلني أفكر:

إذا كنت ل reimplemented تويتر ، ما يمكن أن تفعله بشكل مختلف ؟

ما التقنيات التي تستخدمها ؟ ما اللغات ؟

كيف يمكنك التأكد من أن الخدمة غير قابلة للتطوير ؟

ما الذي تغير ؟

هل كانت مفيدة؟

المحلول

كنت قد نفذت على جي مثل:

كل مستخدم سوف يكون لديك جدول يحتوي على تويت من الناس يتبعون.هذا الجدول سوف يكون مرتبطا من قبل (المستخدم زمني تنازلي).

كل مستخدم لديه أيضا follower_ranges الجدول الذي خرائط مستخدم إلى مجموعة من متجاورة أتباع id نطاقات.بالنسبة لمعظم المستخدمين ، الذين لديهم سوى بضعة آلاف من أتباع هذا الجدول سوف يكون دخول واحدة (-inf..+inf);هذا سوف يكون ضمنيا الافتراضي.بالنسبة للمستخدمين مع المزيد من الأتباع ، كل مجموعة في الجدول بضعة آلاف من المستخدمين.نطاقات سوف تكون متوازنة مع مرور الوقت إلى إبقاء عدد من المستخدمين في بعضها داخل بعض الفاصل, على سبيل المثالأكبر من 1000 أصغر من 10000.الاتحاد من جميع نطاقات سوف تشمل جميع معرفات المستخدمين.

كلما مستخدم -> تابع عملية خلق ، فمن ترميز العمل وإضافتها إلى قائمة الانتظار.كل عنصر في قائمة الانتظار هو (المرسل, عمل, حمولة, أتباع subrange) tuple.طابور العمال أخذ عنصر ، تجد كل أتباعه في subrange ، وتطبيق العمل لكل منهم.(علما بأن العمل يمكن أن يكون "إضافة تغريدة" على "حذف تغريدة" على "تحرير تغريدة" الخ.أساسا أي شيء سوف تحتاج إلى أن تطبق على جميع أتباعه.)

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

تظهر للمستخدم تويت الخاصة بهم سوف تكون رخيصة العملية:"حدد * من التغريدات حيث user_id = :user_id النظام (created_at DESC) الحد :max_per_page".هذا سوف تفحص جدول واحد و يكون سريع جدا العملية.(حفظ المستخدم حجب الكمون أسفل جيد!)

أعتقد أن هذا التصميم سيكون مقياس جيد نوعا ما في البداية.كل مكون من مكونات النظام الآن يمكن زيادتها بسهولة:

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

لا يمكنك التفكير في عدة تحسينات في المستقبل وأود أن ننظر إلى على الفور:

  • والحد من تخزين نادرا-أظهرت بيانات.هذا التصميم denormalizes كل تغريدة إلى كل أتباع نسخ.إلا أن أحدث تويت عادة الوصول إليها.بحذف لكل مستخدم نسخة من التغريدات بعد ن أيام العمر ، يمكننا استعادة الكثير من التخزين.إذا كان يحاول مستخدم لعرض شيء من التاريخ القديم ، ونحن جلب البيانات من denormalized الجداول.هذا سوف يكون أبطأ, ولكن لن يحدث في كثير من الأحيان ، الوفورات سوف تكون كبيرة.وفورات التخزين:(#avg_followers - 1) / #avg_followers
  • الكتابة نمط غير الأمثل.عبر العديد من طابور العناصر ، كل عامل الانتظار سيتم كتابة كل تغريدات المستخدم الجدول ، مما محلة يكتب لن تكون جيدة جدا.(أسوأ الأحوال سيكون لدينا #المعالج * #تخزين اتصالات الملقم.) وهذا يمكن أن تكون ثابتة عن طريق تطبيق تحديثات متعددة لكل مجموعة من المستخدمين.على سبيل المثال ، إذا كان اثنين من الإجراءات A و B هي تطبق على نطاق [0, 10000) ، ثم يكون طابور واحد معالج تطبيق هذه الإجراءات اثنين في وقت واحد.

نصائح أخرى

انها بالفعل: Laconica

  1. انها بالفعل الجزء الثاني - الانتقام: identi.ca (الذي هو على رأس Laconica)
  2. انها بالفعل الجزء الثالث - من الجانب المظلم: yammer

VBG!(-:

سأبدأ من فرضية العودة إلى القيام بذلك مرة أخرى:ما أود القيام به بشكل مختلف على تويتر حينها ؟

لا شيء.

تويتر الحفاظ على التركيز على ما يهم:توفير خدمة الناس فعلا تريد للاستخدام.

أنا أحب العمل على المنتجات التي أصبحت شعبية جدا في هذه فترة قصيرة من الوقت أن أكبر تهديد أصبح الخاصة قابلية.وهذا يعني أن كنت قد فاز.مع النجاح يأتي من الموارد والاهتمام للاستفادة من النجاح.

أود أن تصميم قابلة للتطوير مثل الجحيم فقط من البداية.

خياري سيكون منصة مايكروسوفت, C#, IIS, SQL Server, أعطها (أو السرعة إذا كان هذا هو النهائي و يعمل جيدا عندما أبدأ ;-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top