🎯 Building Decoupled Architectures — بناء بنى مفصولة
في عالم تطبيقات اليوم، لم يعد بناء نظام واحد كبير يضم كل الوظائف خياراً قابلاً للتطبيق. عندما يزداد الضغط أو يحدث عطل، ينهار النظام بأكمله وكأن شيئاً لم يكن. هنا يأتي دور Decoupled Architectures — فلسفة تصميم تفصل المكونات عن بعضها لتجعلها تعمل وتفشل وتتوسع باستقلالية. في هذه الوحدة سنتعرف على مفهوم الفصل (Decoupling) وخدمات AWS الأساسية لتحقيقه: Amazon SQS للطوابير، Amazon SNS للإشعارات، وAmazon MQ للبيئات الهجينة — وكيف يمكن لهذه الأدوات أن تحوّل تطبيقك الهش إلى نظام مرن لا يتأثر بفشل أي جزء منه.
1️⃣ Tight Coupling in a Three-Tier Architecture — الاقتران المتماسك في البنية ثلاثية الطبقات
في البنية ثلاثية الطبقات (Three-tier architecture)، تتواصل طبقات الويب والتطبيق وقاعدة البيانات بطريقة متزامنة (Synchronous)، حيث يرسل المصدر طلباً وينتظر الرد قبل المتابعة. إذا تعطل خادم التطبيق أو خادم الويب، يتوقف النظام بالكامل وتظهر الأخطاء للعميل مباشرة.
- فشل خادم التطبيق أو الويب يؤدي إلى توقف النظام بالكامل وعودة أخطاء للعميل.
- تحديث خادم التطبيق للصيانة أو إصلاح علّة يتطلب إيقاف النظام بأكمله عن العمل.
- توسيع أي طبقة يتطلب تحديث الكود يدوياً ليعرف عناوين IP الجديدة ومتى يوجّه الحركة لكل منها.
تواصل الطبقات متزامن — خادم الويب يرسل طلباً لخادم التطبيق وينتظر الرد.
عندما تعطل خادم التطبيق، توقف الموقع بالكامل وعادت الأخطاء للعملاء.
قضى فريق التشغيل ساعات في إعادة التوجيه يدوياً.
2️⃣ Tight Coupling Increases Scaling Complexity — الاقتران المتماسك يزيد تعقيد التوسع
عندما ترتبط المكونات مباشرة، يصبح التوسع الأفقي (Scaling out) عملية معقدة: كل خادم جديد يحتاج إلى معرفة بجميع الخوادم الأخرى وتحديث الإعدادات في كل طبقة.
- إضافة خادم ويب جديد يعني تحديث إعدادات الاتصال مع جميع خوادم التطبيق.
- إضافة خادم تطبيق يتطلب تحديث جميع خوادم الويب لتعرف الخادم الجديد.
- فشل خادم تطبيق واحد يجعل خوادم الويب المرتبطة به ترسل طلبات إلى خادم معطل دون أن تدري.
أضاف خادمي ويب وخادم تطبيق جديد.
قضى مسؤول النظام يوماً كاملاً في تحديث ملفات الإعدادات لربط المكونات الجديدة.
بعد أسبوع واحد فقط، تعطل خادم تطبيق، وتوقفت نصف خوادم الويب عن العمل لأنها كانت موجهة إليه.
التوسع لم يحل المشكلة—بل زادها سوءاً.
3️⃣ Decoupling Between Layers — الفصل بين الطبقات
في التصميم المفصول (Loose coupling)، نستخدم حلولاً مُدارة كوسيط بين طبقات النظام. هذا الوسيط يتولى اكتشاف الأعطال وتوزيع الحركة والتوسع تلقائياً دون تدخل يدوي.
- إضافة خادم ويب جديد يحتاج فقط توصيلتين — واحدة لكل موازن — بدلاً من عشرات التوصيلات المباشرة.
- عند فشل خادم تطبيق، يكتشفه موازن الأحمال تلقائياً ويتوقف عن توجيه الحركة إليه.
- جميع خوادم الويب تظل تعمل بشكل طبيعي دون أي تعديل في الكود أو الإعدادات.
وضعت ALB آخر بين طبقة الويب وطبقة التطبيق.
النتيجة: إضافة خادم ويب جديد أصبحت تحتاج فقط توصيلتين بدلاً من عشرات.
عند تعطل خادم تطبيق، اكتشفه ALB عبر فحوصات الصحة وتوقف عن إرسال الحركة إليه فوراً.
كل شيء تم تلقائياً دون أي تدخل يدوي.
4️⃣ Tight Coupling Within the Application — الاقتران المتماسك داخل التطبيق
في التطبيقات المتجانسة، كل الوظائف — من معالجة الدفع إلى تحويل الصور إلى إدارة الحسابات — تعمل ضمن عملية واحدة. إذا استهلكت وظيفة ما موارد كثيرة، تتأثر جميع الوظائف الأخرى. وإذا تعطلت وظيفة واحدة، يتوقف التطبيق بأكمله.
- تباطؤ وظيفة واحدة (مثل تحويل الصور) يؤدي إلى بطء جميع الوظائف الأخرى.
- تعطل وظيفة واحدة يعني توقف كل الطلبات — حتى غير المرتبطة بها.
- تغيير بسيط في وظيفة يتطلب إعادة نشر التطبيق بأكمله.
عندما رفع الزبائن صوراً كثيرة، استهلكت وظيفة تحويل الصور كل موارد CPU المتاحة.
المعاملات المالية—وهي الوظيفة الأهم—توقفت فجأة.
العميل الذي يريد الدفع ينتظر بلا جدوى بينما المعالج مشغول بتحويل الصور.
نقطة فشل واحدة أثرت على كل شيء.
5️⃣ Decoupling: Microservices Architecture — الفصل: بنية الخدمات المصغرة
بنية الخدمات المصغرة (Microservices architecture) تسمح لكل خدمة بالتوسع بشكل مستقل، والفشل بشكل مستقل، والنشر بشكل مستقل — مما يقلل بشكل كبير من تأثير أي مشكلة على بقية النظام.
- كل خدمة تعمل في حاوية (Container) مستقلة — توسيع خدمة لا يؤثر على الخدمات الأخرى.
- فشل خدمة واحدة لا يؤثر على بقية الخدمات — النظام يستمر في العمل.
- تغيير أو تحديث خدمة واحدة لا يتطلب إعادة نشر التطبيق بأكمله.
خدمة المعاملات المالية توسعت إلى ثلاث حاويات لأن الضغط عليها مرتفع.
خدمة الحسابات بقيت بحاوية واحدة لأنها خفيفة.
عندما فشلت خدمة تحويل الصور في حاوية، استمرت الخدمات الأخرى في العمل دون أي مشكلة.
كل خدمة تعيش وتموت لوحدها.
الخدمات المصغرة مثل سيارات أجرة منفصلة — إذا تعطلت سيارة، بقية السيارات تواصل طريقها والركاب الآخرون لا يتأثرون.
كل سيارة تختار طريقها وسرعتها المناسبة.
- الاقتران المتماسك (Tight coupling) يعني أن المكونات تعتمد على بعضها — فشل واحد يؤدي لفشل الباقي.
- التواصل المتزامن بين الطبقات يخلق نقاط فشل فردية ويعيق التوسع.
- موازنات الأحمال مثل ELB تفصل الطبقات على مستوى البنية التحتية وتدير الأعطال تلقائياً.
- التطبيقات المتجانسة تعاني من مشاكل مماثلة داخل التطبيق نفسه.
- الخدمات المصغرة (Microservices) تحل المشكلة بتقسيم التطبيق إلى وحدات مستقلة.
📖 جدول المصطلحات
| المصطلح (English) | الترجمة | المفهوم |
|---|---|---|
| Tight coupling | الاقتران المتماسك | مكونات تعتمد على بعضها البعض — فشل واحد يسبب فشل الباقي. |
| Loose coupling | الاقتران المرن / الفصل | مكونات مستقلة — كل مكون يعمل ويفشل ويتوسع لوحده. |
| Three-tier architecture | بنية ثلاثية الطبقات | بنية تفصل التطبيق إلى طبقة عرض ومنطق وبيانات. |
| Monolithic application | التطبيق المتجانس | تطبيق تجتمع فيه كل الوظائف في وحدة برمجية واحدة. |
| Microservices | الخدمات المصغرة | خدمات صغيرة مستقلة — كل واحدة تؤدي وظيفة محددة. |
| Synchronous | متزامن | نوع اتصال حيث يرسل المصدر طلباً وينتظر الرد قبل المتابعة. |
| Elastic Load Balancing | موازن الأحمال المرن | خدمة توزع حركة المرور عبر خوادم متعددة وتكتشف الأعطال. |
1️⃣ Point-to-Point Messaging — التراسل المباشر من نقطة إلى نقطة
يُسمى Point-to-point لأن التطبيق المرسل يعرف التطبيق المستقبل ويرسل الرسائل إلى طابور محدد. التطبيق المرسل يُسمى المنتج (Producer) لأنه يولد الرسائل ويضعها في الطابور. التطبيق المستقبل يُسمى المستهلك (Consumer) لأنه يسحب الرسائل من الطابور ويعالجها عبر آلية السحب (Pull mechanism) — حيث يفحص الطابور دورياً للتحقق من وجود رسائل جديدة.
- المنتج يضع رسالة في الطابور ← الطابور يخزّنها لحين طلبها.
- الرسالة قد تكون طلباً أو رداً أو خطأ أو معلومات — مثل سجلات العملاء أو أوامر الشراء أو الفواتير.
- المستهلك يسحب الرسالة عبر الاستقصاء الدوري (Polling) ويعالجها ثم يحذفها.
- الطابور يعمل كمستودع مؤقت يفصل المنتج عن المستهلك — كلاهما يعمل بالسرعة التي تناسبه.
تطبيق التوصيل (المستهلك) يسحب الرسالة ويعالج الطلب.
إذا كان تطبيق التوصيل مشغولاً، ينتظر الطلب في الطابور بأمان.
لا يضيع أي طلب ولا يتأثر العميل بسرعة المعالجة.
2️⃣ Amazon Simple Queue Service (Amazon SQS) — خدمة الطوابير البسيطة
تعمل Amazon SQS كممتص صدمات بين المرسلين والمستقبلين — حيث تخزّن الرسائل مؤقتاً وتسمح لكل مكون بالعمل بالسرعة التي تناسبه. تستطيع الخدمة معالجة مليارات الرسائل يومياً وتخزين جميع الطوابير والرسائل ضمن منطقة AWS واحدة مع نسخ احتياطية عبر مناطق توفر متعددة.
- مُدار بالكامل — لا حاجة لإدارة البنية التحتية للرسائل أو البرمجيات الوسيطة.
- موثوقية عالية — تخزين الرسائل على خوادم متعددة يضمن عدم فقدان أي رسالة.
- أمان — تشفير الرسائل باستخدام Server-Side Encryption (SSE) عبر AWS KMS، وفك التشفير فقط للمستهلك المصرح له.
- قابلية توسع هائلة — يتوسع تلقائياً بناءً على الاستخدام دون أي تهيئة مسبقة.
الموقع يضع رسالة الطلب في الطابور ويرد للعميل فوراً بأن الطلب قيد المعالجة.
العميل راضٍ ولا ينتظر.
خلف الستار، خدمة الدفع تسحب الرسائل وتعالجها بالسرعة التي تناسبها.
حتى عندما يأتي آلاف الطلبات فجأة في موسم العروض، الطابور يمتص الضغط ولا يتأثر الموقع.
3️⃣ Amazon SQS Core Components — المكونات الأساسية لـ Amazon SQS
الرسالة هي وحدة البيانات المرسلة — حجمها يصل إلى 256 كيلوبايت (يمكن تمديده إلى 2 جيجابايت باستخدام المكتبة الموسعة). الطابور هو المستودع المؤقت الذي يحتفظ بالرسائل حتى معالجتها. طابور الرسائل الميتة (DLQ) هو طابور خاص يرتبط بالطابور الأساسي لاستقبال الرسائل التي فشلت معالجتها بعد تجاوز الحد الأقصى لعدد المحاولات.
- Message: حجم أقصى 256 كيلوبايت — تبقى في الطابور حتى تُحذف أو تنتهي مدة الاحتفاظ (افتراضي 4 أيام، أقصى 14 يوماً).
- Queue: نوعان — قياسي (Standard) وFIFO. يمكن تهيئة مدة الاحتفاظ، مهلة الرؤية (Visibility timeout)، وزمن انتظار استلام الرسالة.
- DLQ: يخزّن الرسائل الفاشلة — مثل طابور عادي يمكن القراءة منه والحذف — يجب أن يكون من نفس نوع الطابور الأصلي (Standard مع Standard، FIFO مع FIFO).
إذا كانت الصورة تالفة وفشلت المعالجة ثلاث مرات متتالية، تنتقل الرسالة تلقائياً إلى DLQ.
في نهاية اليوم، يراجع المطور طابور DLQ ويرى سبب الفشل.
بدلاً من فقدان المهمة إلى الأبد، أصبحت في انتظار المراجعة والتصحيح.
المنتج يكتب رسالة ويضعها في صندوق البريد ويمضي في عمله.
المستهلك يفتح الصندوق في الوقت المناسب ويقرأ الرسالة ويعالجها.
إذا كانت الرسالة غير قابلة للقراءة (فاشلة)، تنتقل تلقائياً إلى مجلد البريد المهمل (DLQ) ليراجعها المسؤول لاحقاً.
بهذه الطريقة، لا تضيع أي رسالة ولا يتوقف أي طرف بسبب انشغال الطرف الآخر.
4️⃣ Decoupling Example: Amazon SQS — مثال على الفصل باستخدام Amazon SQS
تطبيق استلام الطلبات (المنتج) يعمل على ثلاث مثيلات خلف موازن أحمال ALB — كل مثيل يضع الطلبات كرسائل في طابور "طلبات العملاء". تطبيق التنفيذ (المستهلك) يعمل على مثيلين يسحبان الرسائل ويعالجانها ثم يحذفانها بعد النجاح.
- الطابور يمتص التقلبات المفاجئة في الضغط — التطبيقان يتوسعان كل على حدة.
- يمكن معالجة الطلبات بالسرعة التي تناسب إدارة التكاليف — ليست هناك حاجة للمعالجة الفورية.
- إذا حدث خطأ في المعالجة، يمكن إعادة المحاولة أو توجيه الرسالة إلى Dead-letter queue لإعادة المعالجة لاحقاً.
كل مثيل يضع الطلب في طابور "Customer Orders" في SQS.
تطبيق التوصيل على مثيلين يسحبان الطلبات ويعالجانها بالسرعة المناسبة.
في شهر العروض، زادت الطلبات عشرة أضعاف.
الطابور امتص الزيادة — تطبيق استلام الطلبات لم يتأثر وتطبيق التوصيل اشتغل حتى أنجز المهام.
5️⃣ Queue Types: Standard vs FIFO — أنواع الطوابير: القياسي و FIFO
الاختيار بينهما يعتمد على متطلبات تطبيقك: هل يمكن للرسالة أن تصل أكثر من مرة وبترتيب مختلف؟ استخدم Standard. هل يجب أن تصل بالترتيب ومرة واحدة بالضبط؟ استخدم FIFO.
| الخاصية | Standard Queue | FIFO Queue |
|---|---|---|
| التوصيل | At-least-once — قد تُوصّل الرسالة أكثر من مرة | Exactly-once — تُوصّل مرة واحدة بالضبط |
| الترتيب | Best-effort — ترتيب تقريبي، قد تختلف الرسائل عن ترتيب الإرسال | First-In-First-Out — ترتيب دقيق تماماً كما أُرسلت |
| الإنتاجية | غير محدودة تقريباً — ملايين الطلبات في الثانية | حتى 300 طلب API/ثانية أو 3000 مع تجميع 10 رسائل |
| الاستخدام الأمثل | عندما لا يهم الترتيب ولا مشكلة من التكرار | عندما الترتيب والتوصيل مرة واحدة أمران حاسمان |
FIFO Queue يناسب المعاملات البنكية — الخصم يجب أن يسبق الإيداع وبالترتيب الصحيح، وكل معاملة مرة واحدة فقط.
اختيار النوع المناسب يمنع مشاكل مستقبلية ويحسن أداء التطبيق.
6️⃣ Queue Configuration: Polling Type — إعدادات الطابور: نوع الاستقصاء
معامل Receive message wait time يتحكم في نوع الاستقصاء. القيمة صفر تعني Short polling، أي قيمة أكبر من صفر (حتى 20 ثانية) تعني Long polling.
- Short polling (الصفر): يستقصي مجموعة فرعية من الخوادم — يعيد الرد فوراً حتى لو كان فارغاً — استجابة سريعة لكن تكلفة أعلى بسبب الاستجابات الفارغة الكثيرة.
- Long polling (قيمة موجبة): يستقصي كل الخوادم — ينتظر حتى تنتهي مهلة الانتظار أو تصل رسالة — استجابات أقل ← تكلفة أقل.
مع Short polling (كل ثانية): 3,600 استقصاء في الساعة — 3,500 منها فارغة بتكلفة عالية.
مع Long polling (كل 20 ثانية): 180 استقصاء في الساعة فقط — تكلفة أقل بحوالي 20 مرة.
والرسائل تصل فور وصولها إلى الطابور مع Long polling—لا فرق في وقت الاستجابة للرسالة الأولى.
7️⃣ Queue Configuration: Visibility Timeout — إعدادات الطابور: مهلة الرؤية
أثناء مهلة الرؤية، يجب على المستهلك معالجة الرسالة ثم حذفها من الطابور. إذا فشل المستهلك في حذف الرسالة قبل انتهاء المهلة، تعود الرسالة مرئية لمستهلكين آخرين وقد تُعالج مرة أخرى.
- القيمة الافتراضية: 30 ثانية. الحد الأقصى: 12 ساعة.
- يجب ضبطها على أقصى وقت متوقع لمعالجة الرسالة وحذفها — لا أقل ولا أكثر.
- إذا انتهت المهلة قبل الحذف، تصبح الرسالة مرئية لمستهلك آخر وقد تُعالج مرتين.
ضبطنا Visibility timeout على 4 دقائق — دقيقة زيادة عن أقصى وقت.
في فيديو طويل استغرق 5 دقائق، انتهت المهلة قبل الحذف.
سحب مستهلك آخر الرسالة وعالجها — وهكذا لم يضيع الفيديو.
المهلة المناسبة تمنع فقدان المهام مع تجنب المعالجة المزدوجة غير الضرورية.
8️⃣ How SQS Message Queueing Works — دورة حياة رسالة في Amazon SQS
بعد أن يرسل المنتج الرسالة، يوزّعها SQS عبر خوادم متعددة للتكرار. عندما يسحب المستهلك الرسالة، تبدأ مهلة الرؤية وتختفي الرسالة عن المستهلكين الآخرين. بعد المعالجة الناجحة، يجب على المستهلك حذف الرسالة صراحة — SQS لا يحذفها تلقائياً.
- 1. المنتج يرسل رسالة ← يوزعها SQS عبر خوادم الطابور بشكل متكرر.
- 2. المستهلك يطلب ويستلم الرسالة ← تبدأ مهلة الرؤية ← الرسالة تختفي عن المستهلكين الآخرين.
- 3. المستهلك يعالج الرسالة ويحذفها من الطابور خلال مهلة الرؤية — هكذا لا تُعالج مرة أخرى.
- إذا فشل: تنتهي المهلة ← تعود الرسالة مرئية لمستهلك آخر ← يضمن ذلك معالجتها في النهاية.
بدأت مهلة الرؤية 40 ثانية.
المستهلك يعمل: يتصل بقاعدة البيانات لتأكيد الدفع، يحدّث المخزون، يرسل إشعاراً.
بعد النجاح، يحذف الرسالة من الطابور.
إذا تعطل المستهلك قبل الحذف، بعد 40 ثانية يسحب مستهلك آخر الرسالة ويعالجها.
الطلب لا يضيع أبداً.
9️⃣ Amazon SQS Use Cases — حالات استخدام Amazon SQS
كل حالة استخدام تستفيد من قدرة الطابور على فصل المكونات غير المتزامنة وامتصاص التقلبات في الضغط.
- Work queues: فصل مكونات تطبيق موزع تعالج العمل بمعدلات مختلفة — مثال: نظام ملاحة يجمع بيانات من آلاف السيارات يخزّنها في طابور ثم يعالجها.
- Buffering and batch operations: تخزين مؤقت ضد التقلبات — مثال: تطبيق تداول يفصل تسجيل الصفقات اللحظية عن تحديث أرصدة العملاء في المساء.
- Request offloading: نقل العمليات البطيئة خارج مسار الطلب التفاعلي — مثال: تطبيق بنكي يفصل واجهة الدفع الأمامية عن معالجة الفاتورة الخلفية.
- Trigger Auto Scaling: عدد الرسائل في الطابور يحدد حجم مجموعة Auto Scaling — مثال: إنذار CloudWatch يضيف مثيلات عندما يتجاوز عدد الرسائل 10.
يراقب CloudWatch عدد الرسائل في طابور SQS؛ إذا تجاوز 10 رسائل، يضيف Auto Scaling مثيل EC2 جديداً لاستيعاب الضغط.
عندما يقل العدد عن الحد، يزيل المثيلات الزائدة تلقائياً.
هذه إدارة ذكية للتكلفة والأداء — تدفع فقط مقابل ما تحتاجه فعلاً.
- Amazon SQS هو خدمة طوابير رسائل مُدارة بالكامل تفصل مكونات التطبيق.
- نوعان من الطوابير: Standard (إنتاجية عالية، ترتيب تقريبي) و FIFO (ترتيب دقيق، توصيل مرة واحدة).
- الرسائل الفاشلة تنتقل إلى Dead-letter queue (DLQ) بدلاً من الضياع.
- Long polling يقلل التكلفة — استخدمه في معظم الحالات ما لم تكن تحتاج استجابة فورية.
- Visibility timeout يمنع المعالجة المزدوجة — اضبطه حسب أقصى وقت معالجة متوقع.
📖 جدول المصطلحات
| المصطلح (English) | الترجمة | المفهوم |
|---|---|---|
| Amazon SQS | خدمة الطوابير البسيطة | خدمة طوابير رسائل مُدارة تفصل مكونات التطبيق. |
| Producer | المنتج | التطبيق الذي يولد الرسائل ويضعها في الطابور. |
| Consumer | المستهلك | التطبيق الذي يسحب الرسائل من الطابور ويعالجها. |
| Standard Queue | الطابور القياسي | توصيل مرة على الأقل — ترتيب تقريبي — إنتاجية غير محدودة. |
| FIFO Queue | طابور FIFO | توصيل مرة واحدة بالضبط — ترتيب دقيق — إنتاجية محدودة. |
| Visibility timeout | مهلة الرؤية | مدة إخفاء الرسالة عن المستهلكين الآخرين أثناء المعالجة. |
| Dead-letter queue (DLQ) | طابور الرسائل الميتة | طابور للرسائل الفاشلة بعد تجاوز العدد الأقصى للمحاولات. |
| Long polling | الاستقصاء الطويل | يستقصي كل الخوادم وينتظر — يقلل التكلفة والاستجابات الفارغة. |
1️⃣ Publish/Subscribe (Pub/Sub) Messaging — التراسل بنشر/اشتراك
في هذا النموذج، التطبيق المرسل يُسمى الناشر (Publisher) ولا يحتاج إلى معرفة أي شيء عن المستقبلين. التطبيقات المستقبلة تُسمى المشتركين (Subscribers) — يعبرون عن اهتمامهم باستلام الرسائل بالاشتراك في الموضوع. تُدفع الرسائل فوراً إلى جميع المشتركين عبر آلية الدفع (Push mechanism) دون حاجة للاستقصاء الدوري.
- الناشر ينشر رسالة إلى Topic واحد ← تُدفع تلقائياً لكل المشتركين فوراً.
- المواضيع لا تخزّن الرسائل — تدفعها فوراً (على عكس الطوابير التي تحتفظ بها لحين السحب).
- المشتركون يؤدون وظائف مختلفة بنفس الرسالة بالتوازي — دون علم الناشر بهم.
- الناشر لا يعرف المشترك ولا المشترك يعرف الناشر — فصل تام في المعرفة والمسؤولية.
ينشر التطبيق رسالة واحدة إلى Topic "مشروب جاهز".
المشتركون: تطبيق الجوال يتلقى إشعاراً للزبون، البريد الإلكتروني يتلقى إيصالاً ضريبياً، ونظام المخزون يحدّث الكمية.
نفس الرسالة تنطلق إلى ثلاثة وجهات مختلفة بالتوازي — دون أن يعرف الناشر بمن يرسل.
2️⃣ Amazon Simple Notification Service (Amazon SNS) — خدمة الإشعارات البسيطة
صُممت Amazon SNS لتلبية احتياجات أكبر التطبيقات وأكثرها تطلباً — تستطيع نشر عدد غير محدود من الرسائل في أي وقت. مع عدم وجود أعباء صيانة أو إدارة وتسعير الدفع حسب الاستخدام، تمنح SNS المطورين آلية قوية لدمج نظام إشعارات متكامل مع تطبيقاتهم.
- مُدار بالكامل — لا صيانة أو إدارة — تسعير الدفع حسب الاستخدام (Pay-as-you-go).
- يخزّن نسخاً متعددة من الرسالة على أقراص عبر مناطق توفر متعددة قبل تأكيد الاستلام للناشر.
- بعد النشر الناجح، يحذف SNS الرسالة — لا يحتفظ بها مثل SQS.
- يدعم TLS لتأمين قناة الاتصال — سياسات للتحكم في من يستطيع النشر والاشتراك.
المشتركون: بريد إلكتروني لمسؤول النظام، رسالة SMS لمسؤول الأمن، دالة Lambda تُطبق الإصلاح التلقائي.
كل هذا يحدث في ثوانٍ معدودة دون أي تدخل يدوي — استجابة سريعة تنقذ النظام قبل الانهيار.
3️⃣ Subscriber Types — أنواع المشتركين في Amazon SNS
هذا التنوع يمنحك مرونة هائلة في توجيه الإشعارات — رسالة واحدة تصل إلى وجهات مختلفة تماماً كل منها يعالجها بطريقته.
- Email: إرسال الرسالة إلى بريد إلكتروني — كنص عادي أو JSON.
- SMS: رسالة نصية إلى رقم جوال — للتنبيهات العاجلة.
- Mobile push: إشعار دفع إلى تطبيق جوال — لتحديث التطبيق أو إعلام المستخدم.
- HTTP/HTTPS: إرسال HTTP POST إلى عنوان URL محدد.
- AWS Lambda: استدعاء دالة Lambda لتنفيذ منطق أعمال مخصص.
- SQS queue: إرسال الرسالة إلى طابور SQS لمعالجتها لاحقاً.
- Kinesis Data Firehose: إرسال الرسالة إلى تدفق Firehose للتخزين والتحليل.
مشترك عبر البريد الإلكتروني يتلقى إيصالاً إلكترونياً.
مشترك عبر SMS يتلقى رسالة "طلبك في الطريق".
مشترك عبر طابور SQS يحدّث المخزون.
مشترك عبر دالة Lambda يرسل إشعاراً للتطبيق.
كل مشترك يستقبل نفس الرسالة — لكن كل واحد يعالجها بطريقته المخصصة.
4️⃣ Amazon SNS Use Cases — حالات استخدام Amazon SNS
كل هذه الحالات تستفيد من قدرة SNS على توزيع الرسالة الواحدة إلى عدة وجهات في وقت واحد.
- Application and system alerts: إشعار فوري عند وقوع حدث — مثل تغيير في مجموعة Auto Scaling.
- Push email and SMS: إرسال عناوين أخبار مستهدفة للمشتركين — مثل نشرة إخبارية يومية.
- Mobile push notifications: إشعارات تحديث لتطبيقات الجوال — "تحديث متوفر" مع رابط تحميل.
عند حدوث حدث مهم، ينشر الناشر الخبر العاجل.
يدفع Topic لكل المشتركين: الأول عبر البريد الإلكتروني للتفاصيل الكاملة، الثاني عبر SMS للخبر العاجل جداً، الثالث عبر إشعار تطبيق جوال للتنبيه الفوري.
الجميع يتلقى الخبر في نفس اللحظة — كل واحد بالطريقة التي تناسبه.
5️⃣ Decoupling Example: Using Amazon SQS with Amazon SNS — مثال: استخدام Amazon SNS مع Amazon SQS (Fanout)
هذا السيناريو مثالي للمعالجة المتوازية غير المتزامنة — مثلاً عند تحميل صورة تحتاج إلى تحويلها إلى ثلاث أحجام مختلفة.
- 1. تطبيق جوال يرفع صورة إلى Amazon S3.
- 2. إشعار حدث S3 ينشر رسالة تحتوي على رابط الصورة إلى SNS Topic.
- 3. الـ Topic يوزّع (fans out) الرسالة فوراً إلى ثلاث طوابير SQS: thumbnail، mobile، web.
- 4. كل طابور تراقبه مجموعة Auto Scaling خاصة — تعالج الحجم المخصص لها.
- 5. كل تطبيق يخزّن النتيجة في S3 — بشكل مستقل ومتوازٍ عن البقية.
Topic يوزّع الصورة على ثلاثة طوابير: thumbnail تكبر صورة مصغرة، mobile تضبط للشاشات الصغيرة، web تحسن للعرض على سطح المكتب.
كل تطبيق يعمل بالتوازي في مجموعة Auto Scaling خاصة به.
تتحول الصور إلى الأحجام الثلاثة في دقائق بدلاً من أن ينتظر المستخدم وحده.
في صندوق البريد: شخص واحد يضع الرسالة، شخص واحد فقط يفتح الصندوق ويأخذها.
في الراديو: المحطة تبث إشارة وكل من لديه راديو يستقبلها فوراً — السائق في سيارته، الطباخ في مطبخه، الرياضي في ناديه.
نفس البث — ردود فعل مختلفة.
6️⃣ Amazon SNS Considerations — اعتبارات استخدام Amazon SNS
يدعم SNS نوعين من المواضيع — قياسي (Standard) للترتيب التقريبي وFIFO للترتيب الدقيق. كما يمكن تخصيص سياسة إعادة المحاولة لنقاط نهاية HTTP/HTTPS.
- كل إشعار يحتوي على رسالة واحدة منشورة — لا يمكن استرجاعها بعد التسليم الناجح.
- نوعان من المواضيع: Standard (ترتيب تقريبي — قد تصل الرسائل بترتيب مختلف) وFIFO (ترتيب دقيق — تصل كما أُرسلت).
- يمكن تخصيص سياسة إعادة المحاولة لنقطة نهاية HTTP/HTTPS للتحكم في سلوك إعادة المحاولة حسب سعة الخادم.
- بعد استنفاد سياسة إعادة المحاولة، يتوقف SNS ويتجاهل الرسالة — إلا إذا أُرفق Dead-letter queue بالاشتراك.
توقف الخادم الخارجي فجأة.
يعيد SNS المحاولة وفقاً للسياسة المخصصة — ثلاث محاولات كل خمس دقائق.
بعد ذلك، تذهب الرسالة إلى DLQ بدلاً من الضياع.
الفريق يراجع DLQ في الصباح ويعالج الإشعارات الفاشلة.
- Amazon SNS هو خدمة Pub/Sub مُدارة — Topic واحد ينشر والمشتركون يستقبلون فوراً.
- يدعم 7 أنواع من المشتركين: Email، SMS، Push، HTTP، Lambda، SQS، Kinesis Firehose.
- سيناريو Fanout يوزع رسالة Topic على طوابير SQS متعددة — معالجة متوازية غير متزامنة.
- استخدم DLQ مع SNS لضمان عدم فقدان الرسائل الفاشلة بعد استنفاد محاولات التسليم.
📖 جدول المصطلحات
| المصطلح (English) | الترجمة | المفهوم |
|---|---|---|
| Amazon SNS | خدمة الإشعارات البسيطة | خدمة Pub/Sub مُدارة — واحد ينشر والكل يستقبل فوراً. |
| Topic | الموضوع | قناة اتصال — الناشر يرسل والمشتركون يستقبلون منه. |
| Publisher | الناشر | التطبيق الذي يرسل الرسائل إلى Topic. |
| Subscriber | المشترك | التطبيق الذي يستقبل الرسائل من Topic. |
| Push mechanism | آلية الدفع | SNS يدفع الرسالة فوراً للمشترك — دون استقصاء. |
| Fanout | التوزيع المتعدد | إرسال رسالة Topic إلى طوابير متعددة — معالجة متوازية. |
1️⃣ Amazon MQ — خدمة وسيط الرسائل المُدارة للبيئات الهجينة
وسيط الرسائل يسمح لأنظمة برمجية مختلفة — غالباً بلغات برمجة ومنصات مختلفة — بالتواصل وتبادل المعلومات. كخدمة مُدارة بالكامل، يقلل Amazon MQ أعباء التشغيل عبر إدارة التجهيز والإعداد والصيانة نيابة عنك.
- يدير التجهيز والإعداد والصيانة — أنت فقط تركز على تطبيقك.
- يدعم بروتوكولات مراسلة قياسية مفتوحة: JMS، NMS، AMQP، STOMP، MQTT، وWebSocket.
- يمكن الترحيل من أي وسيط رسائل يستخدم هذه المعايير — غالباً دون إعادة كتابة كود المراسلة.
- يدعم كلاً من الطوابير (Queues) والمواضيع (Topics) — حل متكامل للفصل.
بدلاً من إعادة كتابة كود JMS بالكامل، ترحل إلى Amazon MQ.
كل ما تغير هو عنوان نقطة النهاية — باقي الكود يعمل كما هو دون أي تعديل.
الشركة توفر تكاليف الصيانة والتراخيص وتحصل على وسيط رسائل أكثر استقراراً.
2️⃣ Amazon MQ Use Case: Hybrid Cloud Environment — حالة استخدام: البيئة السحابية الهجينة
هذا مهم بشكل خاص للمؤسسات الكبيرة التي لديها أنظمة رئيسية (Mainframe) مكلفة جداً لنقلها — لكنها لا تزال بحاجة للتواصل مع التطبيقات السحابية الحديثة. يمكن Amazon MQ أيضاً استدعاء دالة Lambda من طوابير ومواضيع Amazon MQ لدمج الأنظمة القديمة مع البنى اللاخدمية الحديثة.
- ينشئ المسؤول وسيط Amazon MQ لـ ActiveMQ في منطقة توفر واحدة.
- يكوّن الوسيط لتخزين الرسائل على قرص EBS محسّن لزمن انتقال منخفض وإنتاجية عالية.
- يرسل التطبيق الداخلي الرسائل إلى ActiveMQ ← يوجّهها الوسيط إلى التطبيق السحابي.
- يبقى التطبيق الداخلي دون تغيير — فقط تغيير وجهة الرسالة.
ينشئ فريق التشغيل وسيط Amazon MQ لـ ActiveMQ — يخزّن الرسائل على قرص EBS محسّن.
النظام المحاسبي القديم يرسل الفاتورة — بدون تغيير ولا سطر كود واحد.
التطبيق السحابي يسحب الفاتورة ويعالجها.
النظام القديم أصبح يتحدث مع السحابة!
قطارات قديمة (أنظمة داخلية) وقطارات حديثة (تطبيقات سحابية) كلها تلتقي في المحطة.
القطار القديم لا يحتاج تغيير قضبانه أو محركه—يصل إلى المحطة ويسلم الركاب.
القطار الحديث يستلمهم ويكمل الرحلة.
المحطة هي الجسر بين عالمين مختلفين دون تغيير أي منهما.
3️⃣ Choosing the Right Decoupling Solution — اختيار حل الفصل المناسب
إذا كنت تبني تطبيقات جديدة في السحابة، توصي AWS باستخدام SQS وSNS — فهما خدمتان تستخدمان API ولا تتطلبان إعداد وسيط رسائل. أما إذا كنت تحتاج دمج التطبيقات الداخلية مع السحابية أو ترحيل وسيط رسائل موجود، فـ Amazon MQ هو الحل الأمثل.
| المعيار | Amazon SQS | Amazon SNS | Amazon MQ |
|---|---|---|---|
| الاستخدام الأمثل | تطبيقات سحابية جديدة | تطبيقات سحابية جديدة | بيئات هجينة + ترحيل |
| نموذج الرسائل | Producer-Consumer | Publisher-Subscriber | كلاهما — طوابير ومواضيع |
| واجهة البرمجة | Amazon SQS API | Amazon SNS API | بروتوكولات قياسية (JMS, AMQP...) |
| التسعير | عدد الطلبات الشهري | عدد الطلبات + التوصيلات | بالساعة + بالجيجابايت |
الأول: تطبيق جديد لفصل طلبات الدفع — تستخدم SQS لطابور المعاملات.
الثاني: إشعارات متعددة عند رفع ملف جديد — تستخدم SNS مع SQS بنمط Fanout.
الثالث: نظام مخزون قديم داخل الشركة يريد التحدث مع التطبيق السحابي الجديد — تستخدم Amazon MQ ببروتوكول JMS قياسي دون تغيير في الكود القديم.
كل أداة في مكانها الصحيح — تطبيق مرن ومستقبلي بالكامل.
| العنصر | الخيار الأول | الخيار الثاني |
|---|---|---|
| Amazon SQS | طابور رسائل — نموذج Producer-Consumer — سحب (Pull) — استمرار الرسالة — تسعير بعدد الطلبات. | - |
| Amazon SNS | إشعارات Pub/Sub — نموذج Publisher-Subscriber — دفع (Push) — لا استمرار للرسالة — تسعير بعدد الطلبات والتوصيلات. | - |
| Amazon MQ | وسيط رسائل مُدار — طوابير ومواضيع — بروتوكولات قياسية — تسعير بالساعة والجيجابايت — مثالي للبيئات الهجينة والترحيل. | - |
- Amazon MQ هو وسيط رسائل مُدارة لـ ActiveMQ وRabbitMQ في السحابة.
- يدعم بروتوكولات قياسية مفتوحة — JMS، AMQP، MQTT وغيرها.
- الحل الأمثل لربط البيئات الداخلية بالسحابية دون تغيير الكود القديم.
- SQS/SNS = تطبيقات سحابية جديدة. Amazon MQ = بيئات هجينة وترحيل.
📖 جدول المصطلحات
| المصطلح (English) | الترجمة | المفهوم |
|---|---|---|
| Amazon MQ | أمازون إم كيو | وسيط رسائل مُدار لـ ActiveMQ و RabbitMQ. |
| Message broker | وسيط الرسائل | برمجية وسيطة تتيح لأنظمة مختلفة التواصل عبر رسائل. |
| ActiveMQ | أكتيف إم كيو | وسيط رسائل مفتوح المصدر — شائع في تطبيقات المؤسسات. |
| RabbitMQ | رابيت إم كيو | وسيط رسائل مفتوح المصدر — خفيف ومرن. |
| Hybrid cloud | البيئة السحابية الهجينة | بيئة تدمج البنية التحتية الداخلية مع خدمات السحابة. |
| JMS | خدمة رسائل جافا | واجهة برمجة رسائل قياسية لتطبيقات جافا. |
| AMQP | بروتوكول الرسائل المتقدم | بروتوكول مراسلة مفتوح ومعياري. |
🚀 الخاتمة
في هذه الوحدة، قطعنا رحلة كاملة من فهم مشكلة الاقتران المتماسك (Tight coupling) إلى تطبيق حلول الفصل المناسبة. بدأنا بتشخيص المشكلة — كيف أن المكونات المرتبطة تخلق نقاط فشل فردية وتعقيدات في التوسع — ثم انتقلنا إلى الحلول المتزامنة مثل موازنات الأحمال والخدمات المصغرة. تعمقنا في Amazon SQS كأداة طوابير تفصل التطبيقات عبر التراسل غير المتزامن مع نوعي الطوابير Standard وFIFO، وتعلمنا مفاهيم أساسية مثل مهلة الرؤية والاستقصاء الطويل وطابور الرسائل الميتة. استعرضنا Amazon SNS كخدمة Pub/Sub تدفع الرسائل فوراً لمشتركين متعددين مع سيناريو التوزيع المتعدد (Fanout) الذي يجمع قوة الخدمتين معاً. وأخيراً، تعرفنا على Amazon MQ — الحل الأمثل للبيئات الهجينة — لربط الأنظمة القديمة داخل الشركة مع التطبيقات السحابية الحديثة عبر بروتوكولات قياسية دون تغيير في الكود. تذكر دائماً: الفصل ليس رفاهية — بل هو الفرق بين تطبيق ينهار بكامله بسبب مشكلة صغيرة وتطبيق يستوعبها ويتجاوزها كأنها لم تحدث.
