أفضل طريقة لتصميم نظام / تحليلات قابلة للتداول؟

StackOverflow https://stackoverflow.com/questions/742073

سؤال

الشركة التي أعملها لإنشاء تطبيقات لمنصة BlackBerry.

لقد كنا نعمل على "نظام التحليلات" الخاصية التي تسمح لنا بتضمين التعليمات البرمجية داخل تطبيقاتنا ولديها طلبات التطبيقات مرة أخرى بعض الإحصائيات لخوادمنا المركزية في كل مرة يتم فيها تشغيلها. حاليا، يعمل النظام موافق؛ ومع ذلك، فهي فقط في بيتا مع 100-200 هابت في الساعة. يتم إرسال "الزيارات" إلى الخوادم دون مشكلة. لقد بنينا API الصلبة للغاية للتعامل مع قبول الزيارات وتخزينها (في MySQL DB). لقد اختبرنا الحمل ويجب أن نكون قادرين على استيعاب مئات الآلاف من الزيارات في الساعة دون مشكلة. هذه ليست مشكلة حقا.

المشكلة تظهر الإحصائيات. لقد بنينا لوحة عرض مماثلة ل MINT's (Haveamint.com)، فهو يدل على كل ساعة، والأيام الماضية، أشهر، أسابيع، سنوات ... إلخ. ركض النسخة القبضة استفسارات مستقيمة سحب البيانات من الجدول الزيارات وتفسيرها على الطاير. هذا لم ينجح لفترة طويلة جدا. حلنا الحالي هو أن الزيارات هي "قائمة الانتظار" للمعالجة ولدينا كرون من خلال كل 5 دقائق تأخذ الزيارات وفرزها إلى "مخابرات" لكل ساعة أو يوم وأسبوع، شهر، سنة ... إلخ. هذا يعمل مذهلا وهو قابل للتوسع بشكل لا يصدق؛ ومع ذلك، فإنه يعمل فقط ل 1 timezone. نظرا لأن الشركة بأكملها إمكانية الوصول إلى هذا، فإننا نتعامل مع بضع مئات من المستخدمين في مختلف الزمن. ما أعرفه باسم "اليوم" في سان خوسيه يختلف كثيرا عن ما يعرفه زميلي في لندن اليوم. نظرا لأن الحل الحالي يتم تخزين مؤقتا فقط إلى 1 Timezone، فهو كابوس لأي شخص يتحقق من البيانات خارج Timezone.

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

أي شخص آخر لديه فكرة أفضل عن كيفية حل هذه المشكلة؟

(آسف لمثل هذا السؤال الطويل .. ليس من السهل جدا شرحه. شكرا كله!)

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

المحلول

الحل الذي تقترحه له الكثير من التكرار. أود أن أقترح عليك تخزين البيانات في دلاء لمدة 30 دقيقة على الأقل بدلا من كل ساعة وتطبيع المنطقة الزمنية إلى UTC.

مع دلاء 30 دقيقة، إذا طلب المستخدم بيانات كل ساعة لمدة 1-2PM من -4.5 UTC، يمكنك جلب البيانات لمدة 5:30 - 6:30 مساء من نظامك وإظهار ذلك. إذا قمت بتخزين البيانات في زيادات لمدة ساعة لا يمكنك تقديم طلبات الخدمة للمستخدمين في المناطق الزمنية مع اختلافات N + 0.5 ساعة.

للأرقام اليومية، ستحتاج إلى إجمالي فتحات 48 ساعة. سيتم تحديد الفتحات التي يجب اختيارها بواسطة المنطقة الزمنية للمستخدم.

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

تحرير: اتضح Kathmandu هو +5.45 بتوقيت جرينتش حتى تحتاج إلى تخزين البيانات في دلاء 15 دقيقة بدلا من دلاء 30 دقيقة.

تحرير 2: هناك تحسن آخر سهل حول تجميع السنوي حتى لا تضطر إلى إضافة 17،520 دلاء في كل مرة وبدون مطالبة جملة واحدة لكل بلد. إجمالي البيانات السنوية من 02 يناير - 30 ديسمبر. نظرا لأن الفرق الحد الأقصى للمنطقة الزمنية بين أي بلدين هو 23 ساعة، إلا أن هذا يعني أنه يمكنك اتخاذ البيانات السنوية (02 يناير - 30 ديسمبر) وإضافة عدد قليل من الدلاء قبل وبعد حسب الاقتضاء. على سبيل المثال بالنسبة ل A -5 UTC TimeZone، ستضيف جميع الدلاء في Jan 01 بعد 0500، وجميع الدلاء في 31 ديسمبر، وفي 01 يناير في العام التالي حتى الساعة 0500.

نصائح أخرى

عند تصميم البرامج التي تلامسها عدة مرات، أقول دائما تخزين تاريخ / أوقاتك التوقيت العالمي مع حقل آخر للوقت الأصلي ولديك وظيفة تأخذ الوقت وتحويلها من وإلى UTC / TimeZone. ستحفظ نفسك الكثير من المتاعب للتعامل مع حالات التبديل المختلفة في اليوم، وفورات ضوء النهار، والناس الذين ينظرون إلى إحصائيات من بلد من الجانب الآخر من الأرض وهلم جرا ....

في حالتك، فإن وجود مخططات التخزين المؤقت في UTC وضبط الطلبات المراد تحويلها في UTC يجب أن يساعد. لا تقم بتخزين مادة قانونية "اليوم"، قم بتخزينها لساعات 00: 00: 00: 00utc إلى 23: 59: 59UTC وعندما يسأل شخص ما الإحصائيات اليوم في نيويورك، قم بالتحويل.

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

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

ومع ذلك، أود أن أقترح "40 مختارة" (هل هناك أكثر من 24 وحدة زمنية). يجب أن تكون قادرا على توزيات قائمة انتظار الفرز بشكل تافه عن طريق إنشاء نسخ من البيانات.

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

عادة ما يتم تخزين هذا النوع من البيانات باستخدام قواعد بيانات مستديرة روبن أو دائرية. افحص هذا http://www.shinguz.ch/mysql/mysql_20070223.html. وهذه http://techblog.tilllate.com/2008/06/22/2008/06/22/round-robin-data-storage-in-mysql/ لمعرفة كيف تعمل وكيفية تنفذها تحت MySQL

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