تُستخدم قوائم انتظار الرسائل لنقل الرسائل القصيرة بين الخدمات غير المتصلة. يمكن استخدامها للتواصل في الخدمات المصغرة وكذلك الأنظمة الموزعة التي يجب أن تظل متزامنة. سنناقش الأساسيات ، بالإضافة إلى كيفية استخدامها مع AWS SQS.
كيف تعمل قوائم انتظار الرسائل؟
يمكنك التفكير في قوائم انتظار الرسائل على أنها "الرابط" بين الخدمات غير المتصلة. أنها توفر صلة بين منتجي الرسائل ومستهلكي الرسائل.
على سبيل المثال ، لنفترض أن لديك تطبيق ويب تم نشره على العديد من الخوادم المختلفة خلف موازن التحميل.لديك مستخدمون يقومون بتحميل الصور ، وتريد إجراء بعض المعالجة على الصور على خادم مختلف. يمكنك محاولة جعل كل خادم يرسل طلب POST يدويًا إلى خادم المعالجة ، والذي سيعمل ، ولكن ماذا لو فشل هذا الخادم في تلقي الطلب ، أو أراد المنتج تأكيد معالجة الطلب؟ يصبح من الصعب توسيع نطاق مثل هذا النظام ، خاصةً عندما تحتاج إلى التعامل مع عدة آلاف من الرسائل في الثانية.
مع قائمة انتظار الرسائل ، يمكنك جعل جميع خوادم الويب هذه ترسل رسائل إلى قائمة انتظار مركزية. بعد ذلك ، سيتحقق خادم المعالجة بانتظام من قائمة الانتظار ويعالج كل رسالة. بعد انتهاء المعالجة ، يحذف المستهلك الرسالة من قائمة الانتظار ، مما يضمن عدم معالجتها مرتين بواسطة مستهلك آخر. إذا كنت مهتمًا بالطلب ، فيمكنك استخدام قائمة انتظار ما يرد أولاً يصرف أولاً ، حيث يجب معالجة الرسائل بالترتيب الذي تم استلامها به بالضبط.

يمكن أن تحتوي الرسائل على أي شيء تريده ، على الرغم من أنه يجب عمومًا أن تظل صغيرة إلى حد ما. AWS SQS يبلغ الحد الأقصى لحجم الرسالة 256 كيلو بايت ، وهو أكثر من كافٍ لقليل من JSON يحتوي على بعض البيانات الوصفية. إذا كنت بحاجة إلى تخزين كائنات كبيرة ، فيجب عليك تحميلها إلى خدمة تخزين مثل S3 ، ثم الرجوع إلى URI في الرسالة.
تتمتع قوائم الانتظار أيضًا بالعديد من الفوائد الأخرى. أنها تتيح التكرار من خلال استمرار الرسالة ؛ يجب حذف الرسائل الموضوعة في قائمة الانتظار يدويًا ، لذا يمكنك التأكد من أنه حتى لو تأخرت ، تتم معالجتها دائمًا في مرحلة ما. في حالة فشل أي شيء ، يمكن معالجة الرسائل بمجرد عودة النظام عبر الإنترنت.
يمكن أيضًا استخدام قوائم الانتظار لتجميع عناصر المعالجة. بدلاً من إرسال 100 طلب قاعدة بيانات ، يمكنك معالجة قائمة الانتظار بأكملها في نفس الوقت وإرسال طلب واحد كبير ، والذي غالبًا ما يكون أكثر أداءً.
بالإضافة إلى ذلك ، ستحتوي معظم خدمات قائمة الانتظار مثل AWS SQS على أدوات مراقبة مضمنة ، بحيث يمكنك تتبع عدد الرسائل التي يتم إرسالها بمرور الوقت.
بدء استخدام AWS SQS
إعداد قائمة انتظار SQS بسيط جدًا. توجه إلى وحدة تحكم SQS وأنشئ قائمة انتظار جديدة:

لديك خياران متاحان: قياسي ، والذي يضمن تسليم الرسائل مرة واحدة على الأقل ويقوم بعمله الأفضل لترتيبها بشكل صحيح ؛ و First-in ، First-out ، والتي تضمن معالجة الرسائل مرة واحدة فقط وبالترتيب الدقيق. كلاهما لهما امتيازاتهما ، لأن FIFO عمومًا أقل أداءً لأحمال العمل التي تولد أطنانًا من الرسائل في الثانية.

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

أخيرًا ، يمكن استخدام سياسة الوصول لتأمين قائمة الانتظار هذه لمستخدمي IAM أو أدوار محددة.

لاستخدام قائمة الانتظار ، يمكنك إرسال رسائل إلى SQS برمجيًا باستخدام مجموعات SDK للعميل ، أو الوصول إليها من AWS API. سنعرضه مع رمز لأنه من الأسهل فهمه.
في. NET SDK ، يمكنك إنشاء
AmazonSQSClientجديد عن طريق تمرير عنوان URL للخدمة ، والذي يمثل المنطقة الموجودة في قائمة الانتظار.

بعد ذلك ، يمكنك إنشاء
SendMessageRequests
، وإعطائها نص الرسالة وعنوان URL لقائمة الانتظار ، وإرسالها باستخدام
SQSClient. SendMessageAsync
، والتي يمكن أن تكون
await'ed وتُرجع رمز حالة

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

بالطبع ، بمجرد الانتهاء ، ستحتاج إلى التنظيف بعد نفسك. لكل رسالة تتعامل معها ، ستحتاج إلى إرسال DeleteMessageRequest إلى SQS لإزالتها من قائمة الانتظار. سترغب في القيام بذلك قبل انتهاء مهلة الرسالة ، وإلا فقد ينتهي بك الأمر مع معالجة الرسائل مرتين.