سؤال

لماذا رديس عن الطابور?

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

حسنا, ذلك أن الخلفية.أساسا أنا كلاسيكي جدا وبسيطة طابور نموذج العديد من المنتجين إنتاج العمل و العديد من المستهلكين المستهلكة العمل و كل من المنتجين و المستهلكين بحاجة إلى أن تكون قادرة على توسيع نطاق بذكاء.اتضح ساذجة PUBSUB لا تعمل, منذ أنا لا أريد كل المشتركين تستهلك العمل ، أريد فقط واحد المشترك من الحصول على عمل.في البداية تمر ، يبدو لي BRPOPLPUSH هو ذكي التصميم.

يمكننا استخدام BRPOPLPUSH?

التصميم الأساسي مع BRPOPLPUSH هل لديك قائمة انتظار العمل و التقدم الانتظار.عندما المستهلك يتلقى العمل الذرة يدفع البند في التقدم الانتظار و عند اكتمال العمل LREM'ق ذلك.هذا يمنع blackholing العمل إذا كان العملاء يموت و يجعل رصد جهد كبير - على سبيل المثال نستطيع أن نقول إذا كان هناك مشكلة تسبب المستهلكين إلى أن تأخذ وقتا طويلا لأداء المهام, بالإضافة إلى قول إذا كان هناك حجم كبير من المهام.

فإنه يضمن

  • العمل يتم تسليم واحد بالضبط المستهلك
  • العمل رياح تصل في التقدم الانتظار ، لذلك لا يمكن أن blackhole إذا كان المستهلك

عيوب

  • يبدو غريبا لي أن أفضل تصميم وجدت لا تستخدم في الواقع PUBSUB حيث يبدو أن هذا هو ما معظم بلوق وظيفة حول الطابور على رديس التركيز على.لذا أشعر أنا في عداد المفقودين شيء واضح.الطريقة الوحيدة أرى أن استخدام PUBSUB دون استهلاك المهام مرتين هو ببساطة دفع الإخطار أن العمل قد وصلت ، والتي يمكن للمستهلكين ثم غير مؤمن-ly RPOPLPUSH.
  • من المستحيل أن طلب أكثر من عمل واحد في الوقت الذي يبدو أن هناك مشكلة في الأداء.لا واحد ضخم بالنسبة لنا الوضع, ولكن بدلا من ذلك فإنه من الواضح أن تقول هذه العملية ليست مصممة إنتاجية عالية أو هذا الوضع
  • باختصار: أنا في عداد المفقودين شيئا غبيا ؟

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

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

المحلول

إذا كنت ترغب في استخدام Redis لقائمة انتظار الرسائل في node.js ولا تمانع في استخدام وحدة نمطية لذلك، قد تحاول RSMQ - قائمة انتظار الرسائل البسيطة Redis للعقدة.لم يكن متاحا في الوقت الذي طرحه هذا السؤال ولكن اليوم هو خيار قابل للتطبيق.

إذا كنت ترغب في فعلا تنفيذ قائمة الانتظار بنفسك كما ذكرت في سؤالك، فقد ترغب في قراءة مصدر RSMQ لأنه فقط 20 شاشات من التعليمات البرمجية التي تقوم بالضبط ما تطلبه الأمر.

انظر:

  • http://smrchy.github.io/rsmq/
  • li> href="https://github.com/smrchy/rsmq" rel="noreferrer"> https://github.com/smrchy/rsmq
  • li href="https://www.npmjs.com/package/rsmq" rel="noreferrer"> https://www.npmjs.com/package/rsmq

نصائح أخرى

لقد واجهت بعض الصعوبات حتى الآن أود أن الوثيقة هنا.

كيف يمكنك التعامل مع إعادة المنطق ؟

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

وعلاوة على ذلك, الاستماع العملية يجب أن تكون بسيطة بقدر الإمكان. من الناحية المثالية يجب أن يكون هذه الخصائص:

  • الاستماع هو idempotent.
  • المستهلك هو دائما الاستماع واختناق المنطق هو معالجتها خارج الاستماع كود المنطق.RabbitMQ بتغليف هذا عن طريق السماح المستهلك ملزمة عدد من unacked الرسائل يمكن أن يكون.
    ولا سيما ذهبت مع سوء التصميم في إعادة إدخال حجب البوب يتوقف على نجاح العمليات السابقة التي كان هش ويتطلب التفكير الجاد.

أنا الآن يفضلون رديس PUBSUB + RPOPLPUSH الحل.هذا فصل إخطارا من العمل من استهلاك العمل الذي يتيح لنا عامل نظيفة الاستماع الحل. على PUBSUB هو المسؤول الوحيد عن إخطارا من العمل. الطبيعة الذرية RPOPLPUSH هو المسؤول عن استهلاك تفويض العمل إلى واحد بالضبط المستهلك.في البداية هذا الحل يبدو داع تعقيدا مقارنة حجب البوب, ولكن الآن أرى أن تعقيد لا داعي على الإطلاق ؛ كان حل مشكلة صعبة.

ولكن هذا الحل ليس تافهة جدا:

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

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

لذلك السبب الأكبر لاختيار استخدام Rabbitmq على Redis هو سيناريوهات الفشل، وتجميع.

تفسر هذه المقالة بشكل أفضل، لذلك سأقدم الرابط فقط:

href="https://aphyr.com/posts/283-jepsen-redis" rel="nofollow"> https://aphyr.com/posts/283-jepsen-redis < / ص>

Redis Sentinel والمزيد من التجمعات Redis مؤخرا غير قادر على التعامل مع عدد من سيناريوهات الفشل الأساسية للغاية التي جعلتها اختيارا سيئا لقائمة انتظار.

لدى RabbitMQ مجموعة من المشكلات الخاصة بها، ولكن القول إنها صلبة بشكل لا يصدق في الإنتاج وهي قائمة انتظار رسائل جيدة.

هنا هو منشور الأرنب:

https://aphyr.com/posts/315-jepsen-rabbitmq / ص>

عندما تنظر إلى نظرية CAP (الاتساق، والتوافر، والتقسيم المناولة)، يمكنك فقط اختيار 2 من 3. نحن نرفع RMQ للحصول على CP (التعامل مع الاتساق والتقسيم) مع تحميل رسالتنا، إذا لم نكن متاحا، انها ليست نهاية العالم. من أجل عدم تفقد الرسائل، نستخدم تجاهله للتقسيم من أجل عدم فقد الرسائل. يمكن معالجة التكرارات نظرا لأن المصدر يدير UUID.

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