كيف يمكنك الحفاظ على ترتيب الرسائل عند استهلاك الرسائل من ActiveMQ؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

لدي خدمة .NET تستخدم عميل ActiveMQ.لقد قمت بتطبيق messageListener مع اتصال تم التعامل معه لاستهلاك الرسائل.

في بعض الأحيان، أتلقى رسائل بترتيب مختلف تم وضعها في قائمة الانتظار.

هل كان من الخطأ استخدام messageListner؟هل هناك طريقة للحفاظ على ترتيب الرسائل؟

لعِلمِكَ:يوجد منتج واحد يضع الرسائل في قائمة الانتظار ومستهلك واحد يسحب الرسائل من قائمة الانتظار.

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

المحلول 2

ومعلومات عن: ملقم أدعو هو طرف ثالث، وليس لدي أي سيطرة على ما يرسله الرسائل. أنا أعرف، استنادا إلى الرسالة ID التي وضعوا عليها في الترتيب الصحيح. أيضا، في هذا النظام أن هناك فرقا بين ACK والاعتراف. تلقي ACK عندما يتم وضع رسالتي الأصلية على قائمة الانتظار "الصادرة". I ثم رصد و"الواردة" طابور للاستجابات. وعادة ما تحصل على "الاعتراف" تليها "تمرير" أو "فشل". معرف ارتباط هذه الرسائل هو معرف رسالة من ACK.

وكنت قد استخدمت في الأصل المستمع رسالة وردت لحدث OnMessge. تخليت عن هذا النهج بعد أن أدرك ذلك، باستخدام هذه الطريقة، يتم تسليم الرسائل بشكل غير متزامن وبالتالي في أي ترتيب معين. لذلك، لقد غيرت قانون بلدي لاستطلاع باستخدام جهاز توقيت (System.Threading.Timer) لاستدعاء consumer.Receive () والحصول على رسالة واحدة في وقت واحد. هذا يعمل بالطريقة التي أريدها.

وI فتح المستهلك مرة واحدة عند بدء تشغيل الخدمة وأنا استطلاع مستمر للرسائل.

نصائح أخرى

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

أيضا، هناك هذا السؤال من الأسئلة الشائعة حول ActiveMQ قد يساعد ذلك.

يحرر: من قراءة التعليقات على إجابة دافيمو, ، يبدو أنك تبالغ في الهندسة قليلاً.بشكل عام، يمكن استخدام قائمة انتظار الرسائل مثل ActiveMQ وسلسلة MQ وjoram وما إلى ذلك.لها خاصيتين:يقومون بتسليم الرسائل بنفس الترتيب الذي تم إدراجها به، ويضمنون تسليم الرسالة.يعد إرسال رسالة ACK منفصلة أمرًا زائدًا عن الحاجة؛إنه يشبه إلى حد ما تنفيذ معاملة قاعدة بيانات، ثم الاستعلام عن نفس المعلومات مرة أخرى للتحقق مرة أخرى من أن قاعدة البيانات قامت بتخزينها بالفعل.

بعد قولي هذا، هل الخادم الخاص بك متعدد الخيوط؟إذا كان الأمر كذلك فقد يكون من الممكن أن يدرج الاستجابة قبل فإنه يسرد ACK.

لماذا هو لأجل رسالة مهمة؟ لا ينبغي أن يكون هناك MessageListener على الرعاية.

إذا كنت في حاجة الى ID ارتباط لمباراة الرد مع طلب معين، فهذا موضوع آخر. هل هذا ما تعنيه؟

وقال كل شيء جيسون فقط. وهناك أشياء قليلة أخرى أن نكون حذرين من. كنت حفظ العراء المستهلكين على الكثير من الرسائل أليس كذلك؟ كنت لا خلق المستهلك لبضع رسائل ثم إغلاقه؟ إغلاق فقط مستهلكا يسبب الرسائل المرتبطة المستهلك إلى وضعها مرة أخرى على قائمة الانتظار التي يمكن كسر النظام.

هل تتصل مستواها السابق؟ (هل دحر أي معاملات؟).

وأخيرا، يمكنك التأكد دائما من أجل باستخدام Resequencer لإعادة ترتيب الأمور ل لك.

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