قوائم الانتظار والموضوعات المقسمة

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

إشعار

هناك بعض الاختلافات بين Basic / Standard وPremium SKU عندما يتعلق الأمر بالتقسيم.

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

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

كيف تعمل هذه الميزة

كل قائمة انتظار مقسمة أو موضوع يتكون من أقسام متعددة. يتم تخزين كل قسم في مخزن مراسلة مختلفة ومعالجتها بواسطة وسيط رسائل مختلف. عند إرسال رسالة إلى قائمة انتظار مقسمة أو موضوع، ناقل خدمة Microsoft Azure تعيين الرسالة إلى أحد الأقسام. يتم التحديد بشكل عشوائي بواسطة ناقل خدمة Microsoft Azure أو باستخدام مفتاح قسم يمكن للمرسل تحديده.

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

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

لا توجد تكلفة إضافية عند إرسال رسالة إلى قائمة انتظار مقسمة أو موضوع أو تلقي رسالة منها.

إشعار

تقوم عملية النظرة الخاطفة بإرجاع أقدم رسالة من القسم بناءً على رقم التسلسل الخاص به. بالنسبة للكيانات المقسمة، يتم إصدار رقم التسلسل بالنسبة للقسم. لمزيد من المعلومات، راجع تسلسل الرسائل والطوابع الزمنية.

استخدام مفاتيح التقسيم

عند وضع رسالة في قائمة الانتظار في قائمة انتظار أو موضوع مقسم، يتحقق ناقل خدمة Microsoft Azure من وجود مفتاح القسم. إذا وجد واحداً، فإنه يحدد القسم بناءً على هذا المفتاح. إذا لم يعثر على مفتاح قسم، فإنه يحدد القسم بناءً على خوارزمية داخلية.

باستخدام مفتاح القسم

تتطلب بعض السيناريوهات، مثل الجلسات أو المعاملات، تخزين الرسائل في قسم معين. تتطلب كل هذه السيناريوهات استخدام مفتاح القسم. يتم تعيين كافة الرسائل التي تستخدم نفس مفتاح القسم إلى نفس القسم. إذا كان القسم غير متوفر مؤقتا، ناقل خدمة Microsoft Azure بإرجاع خطأ.

استناداً إلى السيناريو، يتم استخدام خصائص رسالة مختلفة كمفتاح قسم:

SessionId: إذا كانت الرسالة تحتوي على مجموعة خصائص معرف جلسة العمل، فإن ناقل خدمة Microsoft Azure يستخدمها كمفتاح القسم. بهذه الطريقة، تتم معالجة كافة الرسائل التي تنتمي إلى نفس جلسة العمل بواسطة وسيط الرسالة نفسه. تعمل الجلسات على تمكين ناقل خدمة Microsoft Azure لضمان ترتيب الرسائل بالإضافة إلى تناسق حالات الجلسة.

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

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

عدم استخدام مفتاح القسم

في حالة عدم وجود مفتاح قسم، يوزع ناقل خدمة Microsoft Azure الرسائل بطريقة round-robin على جميع أقسام قائمة الانتظار أو الموضوع المقسم. إذا لم يكن القسم المختار متاحاً، فسيقوم ناقل خدمة Microsoft Azure بتعيين الرسالة إلى قسم مختلف. بهذه الطريقة، تنجح عملية الإرسال بالرغم من عدم التوفر المؤقت لمخزن الرسائل. ومع ذلك، لن تحقق الأمر المضمون الذي يوفره مفتاح القسم.

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

لمنح ناقل خدمة Microsoft Azure وقتاً كافياً لإدراج الرسالة في قائمة الانتظار في قسم مختلف، يجب أن تكون قيمة المهلة المحددة من قبل العميل الذي يرسل الرسالة أكبر من 15 ثانية. يوصى باستخدام القيمة الافتراضية وهي 60 ثانية.

يقوم مفتاح القسم "بتثبيت" رسالة على قسم معين. في حالة عدم توفر مخزن الرسائل الذي يحتوي على هذا القسم، تقوم خدمة ناقل خدمة Microsoft Azure بإرجاع خطأ. في حالة عدم وجود مفتاح قسم، يمكن لناقل خدمة Microsoft Azure اختيار قسم مختلف وتنجح العملية. لذلك، يوصى بعدم توفير مفتاح قسم ما لم يكن مطلوبا.

موضوعات متقدمة

استخدام المعاملات مع الكيانات المقسمة

يجب أن تحدد الرسائل التي يتم إرسالها كجزء من المعاملة مفتاح قسم. يمكن أن يكون المفتاح إحدى الخصائص التالية: معرف جلسة العمل أو مفتاح القسم أو معرف الرسالة. يجب أن تحدد جميع الرسائل المرسلة كجزء من نفس المعاملة مفتاح القسم نفسه. إذا حاولت إرسال رسالة دون مفتاح قسم داخل إحدى المعاملات، فسيقوم ناقل خدمة Microsoft Azure بإرجاع استثناء عملية غير صالح. إذا حاولت إرسال رسائل متعددة في نفس المعاملة التي لها مفاتيح أقسام مختلفة، فسيقوم ناقل خدمة Microsoft Azure بإرجاع استثناء عملية غير صالح. على سبيل المثال:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    ServiceBusMessage msg = new ServiceBusMessage("This is a message");
    msg.PartitionKey = "myPartitionKey";
    await sender.SendMessageAsync(msg); 
    ts.Complete();
}
committableTransaction.Commit();

إذا تم تعيين أي من الخصائص التي تعمل كمفتاح قسم، يقوم ناقل خدمة Microsoft Azure بتثبيت الرسالة في قسم معين. يحدث هذا السلوك سواء تم استخدام معاملة أم لا. يوصى بعدم تحديد مفتاح قسم إذا لم يكن ضروريا.

استخدام المعاملات في الجلسات مع الكيانات المقسمة

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

على عكس قوائم الانتظار أو الموضوعات العادية (غير المقسمة)، لا يمكن استخدام معاملة واحدة لإرسال رسائل متعددة إلى جلسات عمل مختلفة. إذا تمت محاولة ذلك، تقوم ناقل خدمة Microsoft Azure بإرجاع استثناء عملية غير صالح. على سبيل المثال:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    ServiceBusMessage msg = new ServiceBusMessage("This is a message");
    msg.SessionId = "mySession";
    await sender.SendMessageAsync(msg); 
    ts.Complete();
}
committableTransaction.Commit();

إعادة توجيه الرسائل تلقائياً مع كيانات مقسمة

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

اعتبارات وإرشادات

  • ميزات التناسق العالي: إذا كان الكيان يستخدم ميزات مثل جلسات العمل أو الكشف عن التكرارات أو التحكم الصريح في مفتاح التقسيم، فسيتم توجيه عمليات المراسلة دائما إلى قسم معين. إذا كان أي من الأقسام تواجه حركة مرور عالية أو المخزن الأساسي غير صحية، تفشل هذه العمليات ويتم تقليل التوافر. وبصفة عامة، لا يزال الاتساق أعلى بكثير من الكيانات غير المقسمة؛ تواجه مجموعة فرعية فقط من حركة المرور مشكلات، بدلا من جميع حركة المرور. لمزيد من المعلومات، راجع هذه المناقشة حول التوفر والاتساق.
  • الإدارة: يجب تنفيذ عمليات مثل إنشاء وتحديث وحذف على جميع أقسام الكيان. إذا كان أي قسم غير صحي، فقد يؤدي إلى فشل هذه العمليات. بالنسبة لعملية Get، يجب تجميع معلومات مثل عدد الرسائل من جميع الأقسام. إذا كان أي قسم غير صحيح، يتم الإبلاغ عن حالة توفر الكيان على أنها محدودة.
  • سيناريوهات الرسائل ذات الحجم المنخفض: بالنسبة لمثل هذه السيناريوهات، خاصة عند استخدام بروتوكول HTTP، قد تضطر إلى تنفيذ عمليات تلقي متعددة للحصول على جميع الرسائل. لتلقي الطلبات، الواجهة الأمامية ينفذ تلقي على جميع الأقسام ومخابئ جميع الاستجابات المتلقاة. سيستفيد طلب تلقي لاحق على نفس الاتصال من هذا التخزين المؤقت ويكون زمن انتقال الاستلام أقل. ومع ذلك، إذا كان لديك اتصالات متعددة أو تستخدم HTTP، يتم إنشاء اتصال جديد لكل طلب. على هذا النحو، ليس هناك ما يضمن أنها ستهبط على نفس العقدة. إذا تم تأمين جميع الرسائل الموجودة وتخزينها مؤقتا في واجهة أمامية أخرى، فترجع عملية الاستلام قيمة خالية. ستنتهي صلاحية الرسائل في نهاية المطاف ويمكنك استلامها مرة أخرى. يوصى بإبقاء HTTP على قيد الحياة. عند استخدام التقسيم في سيناريوهات منخفضة الحجم، قد تستغرق عمليات الاستلام وقتا أطول من المتوقع. ومن ثم، نوصي بعدم استخدام التقسيم في هذه السيناريوهات. احذف أي كيانات مقسمة موجودة وأعد إنشاءها مع تعطيل التقسيم لتحسين الأداء.
  • استعراض/نظرة خاطفة الرسائل: لا ترجع عملية النظرة الخاطفة دائما عدد الرسائل المطلوبة. هناك سببان شائعان لهذا السلوك. أحد الأسباب هو أن الحجم المجمع لمجموعة الرسائل يتجاوز الحد الأقصى للحجم. سبب آخر هو أنه في قوائم الانتظار المقسمة أو المواضيع، قد لا يكون قسم رسائل كافية لإرجاع العدد المطلوب من الرسائل. بشكل عام، إذا كان أحد التطبيقات يريد إلقاء نظرة خاطفة/استعراض عدد معين من الرسائل، يجب استدعاء عملية peek بشكل متكرر حتى يحصل على هذا العدد من الرسائل، أو لا توجد رسائل أخرى لإلقاء نظرة خاطفة. لمزيد من المعلومات، بما في ذلك نماذج التعليمات البرمجية، راجع استعراض الرسائل.

قيود الكيانات المقسمة

يفرض ناقل خدمة Microsoft Azure حالياً القيود التالية على قوائم الانتظار والموضوعات المقسمة:

  • بالنسبة لمساحات الأسماء المميزة المقسمة، يقتصر حجم الرسالة على 1 ميغابايت عند إرسال الرسائل بشكل فردي، ويقتصر حجم الدفعة على 1 ميغابايت عند إرسال الرسائل في دفعة.
  • لا تدعم قوائم الانتظار والموضوعات المقسمة إرسال الرسائل التي تنتمي إلى جلسات مختلفة في معاملة واحدة.
  • يسمح ناقل خدمة Microsoft Azure حاليا ما يصل إلى 100 قائمة انتظار أو موضوع مقسم لكل مساحة اسم ل SKU الأساسية والقياسية. يتم احتساب كل قائمة انتظار أو موضوع مقسم إلى الحصة النسبية البالغة 10000 كيان لكل مساحة اسم.

الخطوات التالية

يمكنك تمكين التقسيم باستخدام مدخل Microsoft Azure و PowerShell و CLI وقالب Resource Manager و .NET و Java و Python و JavaScript. لمزيد من المعلومات، راجع تمكين التقسيم (أساسي / قياسي) .

اقرأ عن المفاهيم الأساسية لمواصفات المراسلة Advanced Message Queueing Protocol (AMQP) 1.0 في دليل بروتوكول AMQP 1.0.