ما هو حساب الوقت الحقيقي؟
يرجى الاطلاع على الصورة أدناه:
خذ إحصائيات المنتجات الساخنة كمثال لرؤية طرق الحساب التقليدية:
1 احفظ سلوك المستخدم والسجل والمعلومات الأخرى في قاعدة البيانات.
2 حفظ معلومات الطلب في قاعدة البيانات.
3 استخدم الزناد أو coroutine لإنشاء فهارس محلية ، أو فهارس مستقلة عن بعد.
4 ارتبط معلومات الطلب ، وتفاصيل الطلب ، ومعلومات المستخدم ، ومعلومات المنتج ، وما إلى ذلك ، قم بتجميع المنتج في غضون 20 دقيقة ، والعودة إلى أعلى 10.
5WEB أو عرض التطبيق.
هذا مشهد وهمي ، ولكن على افتراض أن لديك خبرة في التعامل مع مشاهد مماثلة ، يجب أن تواجه مثل هذه المشكلات والصعوبات:
1. مشكلة التوسع الأفقي (Scale-Out)
من الواضح ، إذا كان موقعًا إلكترونيًا E -Cnommerce مع مقياس معين ، فإن كمية البيانات كبيرة جدًا. نظرًا لأن معلومات المعاملة تتضمن المعاملات ، فمن الصعب التخلي مباشرة عن قدرة معاملة قاعدة بيانات العلاقة والترحيل إلى قاعدة بيانات NOSQL مع إمكانات توسيع نطاق أفضل.
حسنًا ، يتم ذلك بشكل عام. لحسن الحظ ، يمكننا الأرشفة حسب التاريخ وذاكرة التخزين المؤقت للنتائج عن طريق معالجة الدُفعات الحوسبة في وضع عدم الاتصال.
ومع ذلك ، فإن المتطلبات هنا في غضون 20 دقيقة ، وهو أمر صعب.
2. مشكلات الأداء <br /> تتوافق هذه المشكلة مع التوسيع.
السؤال هو ، كم مرة نحتاج إلى دخول المستودع؟
ماذا عن 10 دقائق؟
ماذا عن 5 دقائق؟
ماذا عن الوقت الحقيقي؟
بالإضافة إلى ذلك ، تواجه طبقة العمل أيضًا قيود قوة الحوسبة ذات النقطة الواحدة وتتطلب توسعًا أفقيًا ، لذلك من الضروري النظر في مشكلة الاتساق.
لذلك ، كل شيء معقد للغاية هنا.
3. قضايا توسيع الأعمال <br /> على افتراض أنه يجب ألا نتعامل فقط مع إحصائيات البضائع المبيع الساخنة ، ولكن أيضًا نقرة إعلانية إحصائية ، أو تحديد خصائص المستخدم بسرعة بناء ستكون الطبقة أكثر تعقيدًا.
ربما يكون لديك طريقة أفضل ، ولكن في الواقع ، ما نحتاجه هو إدراك جديد:
ما حدث في هذا العالم كان الوقت الحقيقي.
لذلك نحن بحاجة إلى نموذج يتم حسابه في الوقت الفعلي ، وليس نموذج معالجة الدُفعات.
يجب أن نكون قادرين على معالجة الكثير من البيانات ، لذلك من الأفضل أن يكون لديك قدرة جيدة.
بعد ذلك ، يعد نموذج الحوسبة هذا نموذجًا لحساب الوقت الحقيقي ، والذي يمكن اعتباره أيضًا نموذج حوسبة تدفق.
الآن على افتراض أن لدينا مثل هذا النموذج ، يمكننا بسعادة تصميم سيناريوهات أعمال جديدة:
ما هو أكثر Weibo إعادة توجيه؟
ما هي أهم المنتجات؟
ما هي النقاط الساخنة التي يبحث عنها الجميع؟
أي إعلان ، أي موقف ، هو الأكثر نقرة؟
أو يمكننا أن نسأل:
ماذا حدث في هذا العالم؟
ما هو موضوع Weibo الأكثر سخونة؟
نستخدم عدد نافذة منزلق بسيطة للكشف عن الحجاب الغامض لحساب الوقت الحقيقي SO.
افترض أن متطلبات أعمالنا هي:
إحصائيات 10 مواضيع Weibo الأكثر سخونة في 20 دقيقة.
لحل هذه المشكلة ، نحتاج إلى النظر في:
1. مصدر البيانات <br /> هنا ، بافتراض بياناتنا ، الموضوع من Weibo Long Connection Push.
2. نمذجة المشكلة
الموضوع الذي نعتقده هو توسيع الرقم#.
على سبيل المثال: foreach_break: مرحبًا ،#比#، أحبك ،#Weibo#.
"العالم" و "Weibo" هي موضوعات.
3. حساب المحرك
نستخدم العاصفة.
4. تحديد الوقت
كيف تحدد الوقت؟
تعريف الوقت أمر صعب ، اعتمادًا على الدقة المطلوبة.
وفقًا للواقع ، نستخدم العلامة عمومًا لتمثيل هذا المفهوم.
في البنية التحتية للعاصفة ، تستخدم مرحلة بدء تشغيل المنفذ الموقت لتشغيل الحدث "بعد فترة من الزمن".
كما هو موضح أدناه:
(Defn Setup-Ticks! [Worker Executor-Data] Ive-Queue (: استقبال executor-data) سياق (: Executor-Countext-Context-Data)] (عندما تكون Secs-time-secs (أو (معرف النظام؟ : Component-ID Executor-Data))))) alse (العاصفة conf-cen-message-message-timeouts) (=: spout (: Type Executor-Data))) (log-message "مهلة معطلة للمنفذ" (: المكون- ID exec utor-data) ":" ("(: executor-id eventor-data) (recursing requording (: user-timer former) secs-secs-secs secs (fn [] (Disruptor/ publish receed-queue [[nil (tupleimpl. context [tick-time-secs] الثوابت/system_task_id الثوابت/system_tick_stream_id)))))))))))))))))))))))))))))))) ،)) ،))في كل مرة ، سيتم تشغيل مثل هذا الحدث.
كيف يحكم بولت على أن tuple المستلم يمثل "علامة"؟
مسؤول عن إدارة سلسلة قائمة الانتخابات في Bolt.
isstick isstick الثابتة العامة (tuple tuple) {return tuple! جنبا إلى جنب مع رمز clojure من الإعداد!
يمكن ملاحظة أنه في الكود التالي ، تم تمرير System_task_id أيضًا إلى Tuple:
؛
(TUPLEIMPL. سياق [Secs-time-time] الثوابت/system_task_id الثوابت/system_tick_stream_id))
ثم استخدم الكود التالي للحصول على system_component_id:
السلسلة العامة getComponentId (int taskid) {if (taskid == constants.system_id_id) {return constants.system_component_id ؛مع البنية التحتية أعلاه <BR /> ، نحتاج أيضًا إلى بعض الوسائل لإكمال "الهندسة" وتحويل الفكرة إلى واقع.
هنا ، دعونا نلقي نظرة على تصميم النافذة المنزلق لمايكل ج. نول.
طوبولوجيا
SPOTID = "WordGenrator" ؛ / نافذة زمنية RollingCountbolt هي 9 ثوان ، ويتم إرسال النتائج الإحصائية كل 3 ثوانٍ إلى Builter.setbolt المصب (Countrid ، RollingCountbolt (9 ، 3) ، 4). ؛ أكمل التجميع الكامل وحساب Top-N Topic Builder.setbolt (TotalRankerId ، TotalRankingsbolt الجديد (TOP_N)).
التصميم الأعلى أعلاه هو على النحو التالي:
الجمع بين حساب التجميع مع الوقت
في وقت سابق ، وصفنا حادثة القراد ، التي ستؤدي إلى طريقة تنفيذ الترباس أثناء رد الاتصال ، والتي يمكن القيام بها:
RollingCountbolt:
Override public void تنفيذ (tuple tuple) {if (tpleutils.istick (tuple)) أرسلها واترك النافذة تمرير EmitCurrentWindowCounts () ؛} آخر {// التقليدية tuple ، ويمكن أن يعدد عدد الموضوعات (tuple) ؛} // OBJ هو الموضوع ، إضافة عد ++ // الانتباه ، السرعة هنا هو أساسا أساسي هنا. يمكن أن يكون الترباس. EmitCurrentWindowCounts () lengtt h_warning_template ، الفعلي windowlengthinseconds ، windowlengthinseconds) ؛} eMIT (التهم ، الفعلي windowlengthinseconds) ؛}قد يكون الكود أعلاه مجردة بعض الشيء.
intermediankingsbolt & totalrankingsbolt:
تنفيذ الفراغ النهائي العام (Tuple Tuple ، Collection BasicOutputCollector) {if (tupleutils.istick (tuple)) {getLogger (). ؛} آخر {// polytes وفرز updaterankingswithtuple (tuple) ؛}}من بينها ، تختلف طريقة الفرز الكلي للإنترنت و totalRankingsbolt قليلاً:
طريقة الفرز الإجمالية للفرز الإجمالي:
. يتم تجميع الأوقات ، ثم جميع الموضوعات shaper.getRankings ().
طريقة الفرز الكلي لـ TotalRankingsbolt:
. ().
طريقة الفرز الثقيل بسيطة نسبيًا وقحًا ، لأن n فقط لن تكون كبيرة جدًا:
private void () {collections.sort (RankedItems) ؛ خاتمة
قد يكون الشكل أدناه هو النتيجة التي نريدها.
ما سبق هو كل محتويات هذا المقال.