بارادايس كوداستوديو برمجيات
العودة إلى المقالات
هندسة الخلفيةتحديث ١٨ دقيقة قراءة

خدمات NestJS الصغيرة: عند RabbitMQ، عند gRPC، عند البقاء معياريًا

قرارات عملية تتعلق بحدود الخدمة، والمراسلة غير المتزامنة مع RabbitMQ، وعقود المزامنة المكتوبة مع gRPC في أنظمة NestJS.

NestJSRabbitMQجي آر بي سيخدمات صغيرةبنيان

علي مرتضوي

مؤسس بارادايس كود

حدود المجال أولًا، وتقنية الرسائل ثانيًا

غالبًا ما تبدأ الفرق بقوائم الانتظار وgRPC لأنها تبدو حديثة. التكلفة الحقيقية للخدمات الصغيرة هي أوضاع فشل الشبكة، وإمكانية المراقبة، وإصدار العقد، والعمليات - وليس مصممي Nest. إذا كان الفريق صغيرًا والمجال لا يزال يتحرك، فعادةً ما تكون الكتلة المتراصة ذات الحدود الواضحة أسرع وأكثر استقرارًا.

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

RabbitMQ للعمل الذي يمكن أن ينتظر

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

يجب أن يكون المستهلكون عاجزين. تحدث التكرارات؛ يمنع المفتاح الفريد للأعمال أو جدول الأحداث المعالجة الرسوم المزدوجة ورسائل البريد الإلكتروني المزدوجة. قم بتكوين الجلب المسبق وDLQ في اليوم الأول، وليس بعد الحادث الأول.

gRPC للمزامنة والمسارات التعاقدية

يتألق gRPC بزمن انتقال منخفض، وعقود مكتوبة، ومكالمات داخلية من خدمة إلى خدمة: فحص المخزون، والتسعير، وقراءة الملف الشخصي على مسار طلب المستخدم. يجعل Protobuf التوافق أكثر جدية من JSON ذي الشكل الحر، إذا اتبعت قواعد التوافق.

احتفظ بـ gRPC بعيدًا عن الإنترنت العام ما لم يكن لديك بوابة وسياسة أمان صريحة. بالنسبة لعملاء الويب، احتفظ بـ BFF أو HTTP API؛ بارك gRPC على الشبكة الداخلية.

مكافحة النمط: مزامنة الدردشة عبر قائمة الانتظار

لا تستخدم قائمة الانتظار كطلب/استجابة ذات مهلة قصيرة إلا إذا لزم الأمر. يجلب هذا النمط معرفات الارتباط وقوائم انتظار الرد والفشل غير الشفاف - بينما يحل gRPC أو HTTP الداخلي نفس الحاجة بشكل أكثر بساطة. احتفظ بـ RabbitMQ لسير العمل الذي يتميز بالتجاهل والنسيان أو سير العمل المرحلي.

عندما تحتاج حقًا إلى استجابة عبر الخدمات، فإن الملحمة/التنسيق الواضح مع جهاز الحالة يتفوق على RPC المزيف على المراسلة.

عقود الخدمة والإصدارات

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

في Nest، حافظ على دقة المعالجات: التحقق من صحة الإدخال، واستدعاء حالة الاستخدام، وتعيين الأخطاء. احتفظ بمنطق المجال خارج طبقة النقل حتى ينجو المجال من تغيير النقل.

إمكانية الملاحظة في النظام الموزع

بدون معرف الارتباط المشترك عبر HTTP والرسائل وgRPC، ينهار تصحيح أخطاء الإنتاج. متابعة التتبع من الحافة إلى قائمة الانتظار للمستهلكين. تعامل مع مقاييس قائمة الانتظار - العمق، والعمر، وعمليات إعادة المحاولة، وDLQ - على أنها مساوية لزمن استجابة واجهة برمجة التطبيقات (API).

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

مسار الهجرة دون انفجار كبير

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

يناسب NestJS هذا المسار لأن نفس أنماط الوحدة/الموفر تعمل في شكل أحادي وجزئي؛ لا يزال النجاح يأتي من انضباط المجال، وليس من عدد الخدمات الصغيرة.

الأسئلة الشائعة

هل يجب أن نبني خدمات صغيرة من اليوم الأول؟

عادة لا. ابدأ بوحدة متراصة وحدود واضحة؛ يتم تقسيمها عند إثبات احتياجات الإصدار أو النطاق المستقل.

RabbitMQ أو كافكا؟

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

كيف نتخلص من الرسائل المكررة؟

أنت لا؛ أنت تبني العجز. تعتبر المفاتيح الفريدة للأعمال وتخزين الرسائل المعالجة إلزامية.

هل يعتبر gRPC مناسبًا للواجهة الأمامية؟

ليس للمتصفحات في معظم الأكوام. استخدم سطح BFF/HTTP واحتفظ بـ gRPC لمكالمات الخدمة الداخلية.

المعرفة والمقالات

تحتاج تطبيق هذه المفاهيم في منتجك؟

بارادايس كود معك من الاستشارة حتى التسليم الكامل.

اطلب التعاون