كيف يمكنني استرداد السجلات المحدثة في الوقت الفعلي؟ (دفع الإخطارات؟)

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

سؤال

أحاول إنشاء تطبيق Ruby on Rails للتجارة الإلكترونية ، حيث سيتمكن العملاء المحتملين من تقديم طلب وسيتمكن مالك المتجر من تلقي الطلب في الوقت الحقيقي. سيتم تسجيل الطلب النهائي في قاعدة البيانات (في الوقت الحالي SQLite) ، وسيكون لصاحب المتجر نافذة متصفح مفتوحة ، حيث ستظهر الطلبات الجديدة بعد الانتهاء من الطلب. (معلومات التطبيق: أنا أستخدم إطار Hobo Rails ، وأخطط لاستضافة التطبيق في Heroku)

أنا الآن أفكر في أفضل تقنية لتنفيذ هذا ، حيث من المتوقع أن يكون لدى التطبيق الكثير من المستخدمين الذين يرسلون الكثير من الطلبات:

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

2) على النحو الوارد أعلاه ، ولكن استطلاع الخادم مع نوع من إطار AJAX.

3) استخدم نوعًا من تقنية دفع الخادم ، مثل "المذنب" غير المتزامن. تم العثور على Juggernaut ، المشكلة الوحيدة هي أنها تستخدم المنافذ الفلاش والمخصصة ، وقد تكون هذه مشكلة لأن تطبيقي يجب أن يكون متاحًا خلف جدران الحماية للشركات و NAT.

4) أنا أيضًا أتحقق من إطار عمل Node.js ، ويبدو أنه فعال لهذا النوع من الرسائل غير المتزامنة ، على الرغم من أنها غير مدعومة في Heroku.

ما هي الطريقة الأكثر فعالية لتنفيذ هذا النوع من الوظائف؟ هل ربما هناك طريقة أخرى لم أفكر فيها؟

شكرا لوقتك و مساعدتك!

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

المحلول

من المحتمل أن تكون Node.js نوبة رائعة - إنها سريعة ، تحب الوقت الحقيقي ولديها دعم رائع. الجانب السلبي هو أنك تقدم تقنية أخرى في الحل الخاص بك. إنه لأمر ممتع للغاية أن نستلهم الكثير من المكتبات من القضبان والسيناترا.

أعلم أن Heroku كان يدير Node.js Beta لفترة من الوقت وكان الناس يستخدمونها كجزء من مسابقة Nodeknockout الأخيرة. شاهد منشور المدونة هذا. إذا لم يكن هذا خيارًا ، فيمكنك بالتأكيد استضافته في مكان آخر. إذا قمت باستضافتها في Heroku ، فقد تتمكن من وكيل الطلبات. خلاف ذلك ، يمكنك تشغيله بسعادة من مجال فرعي حتى تتمكن من مشاركة ملفات تعريف الارتباط.

أيضا الخروج Socket.io. تقوم بعمل رائع في اختيار أفضل طريقة للقيام بمذنب بناء على قدرات المتصفح.

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

نصائح أخرى

في HTTP ، لا يمكن أن تأتي الطلبات إلا من العميل. وبالتالي فإن أفضل الخيارات هي ما ذكرته بالفعل (الاقتراع وتدفق HTTP).

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

خيارك الآخر هو HTTP Streaming (Comet) ؛ سيتطلب ذلك المزيد من العمل على الإعداد ، ولكن قد تجد أنه يستحق كل هذا الجهد. يمكنك ان تعطي الوقت الحقيقي على القضبان لقطة. لمزيد من المعلومات والنصائح حول كيفية تقليل استخدام النطاق الترددي ، انظر:

http://ajaxpatterns.org/periodic_refresh
http://ajaxpatterns.org/http_streaming

في الواقع ، إذا كان لديك مالك المتجر الذي يديره Chrome (ستتبع المتصفحات الأخرى قريبًا) ، فيمكنك استخدام WebSockets (فقط لإخطار مالك المتجر) ، والذي يتيح لك الحصول على اتصال ثابت ، ويمكنك إرسال بيانات إلى المتصفح بدون المستعرض يطلب أي شيء.

هناك عدد قليل من مكتبات WebSocket لـ Node.js ، لكنني أعتقد أنه يمكنك القيام بذلك بسهولة بنفسك باستخدام اتصال TCP عادي.

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