هذا هو استمرار لمقال " نحن نكتب أول خدمة microservice على Node.js مع التواصل من خلال RabbitMQ " ، والتي لقيت استقبالا حسنا من قبل مستخدمي Habr.
في هذه المقالة سأتحدث عن كيفية التواصل بشكل صحيح بين الخدمات الصغيرة بحيث تظل الخدمات الصغيرة معزولة.
كيف لا تفعل ذلك
لماذا تحتاج إلى التواصل بين الخدمات الصغيرة؟ استخدم قاعدة بيانات واحدة ، واقرأ ما تريد - عمل شيء!
لا ، لا يمكنك فعل ذلك. مفهوم الخدمات الصغيرة هو أنها معزولة عن بعضها البعض ، لا أحد يعرف أي شيء عن أي شخص (عمليا). على الأرجح ، في المستقبل ، عندما يبدأ النظام في النمو ، سترغب في توسيع الوظيفة وتحتاج إلى التواصل بين الخدمات الصغيرة: على سبيل المثال ، اشترى المستخدم منتجًا ، لذلك تحتاج إلى إرسال إشعار حول البيع إلى البائع.
فوائد العزل
دقة
لنفترض أن هناك تطبيقًا مترابطًا به عدة وحدات تحكم:
- بضائع
- تخفيض
- المدونة
- المستخدمين
يوم واحد على ما يرام ، قاعدة بياناتنا تتساقط: الآن لا يمكننا الحصول على أي منتجات ، لا خصومات ، لا مشاركات مدونة ، لا مستخدمين. الموقع غير متاح تمامًا ، لا يمكن للعملاء تسجيل الدخول ، والأعمال تفقد الأرباح.
ماذا سيحدث في العمارة microservice؟
في عالم آخر ، في نفس اليوم الذي تسقط فيه قاعدة بيانات microservice للمستخدم ، يصبح الوصول إليها غير ممكن: لا يمكن للمستخدمين تسجيل الخروج والتسجيل وتسجيل الدخول. يبدو أن كل شيء سيئ وأن الشركة تفقد أيضًا الأرباح ، ولكن لا: يمكن للمشترين المحتملين إلقاء نظرة على السلع المتاحة ، وقراءة مدونة الشركة ، والعثور على خصومات.
نظرًا لحقيقة أن كل خدمة microservice لها قاعدة بيانات خاصة بها ، فإن الآثار الجانبية تصبح أقل بكثير.
وهذا ما يسمى التدهور التدريجي .
التجريد
في تطبيق كبير ، من الصعب جدًا التركيز على مهمة واحدة ، لأن تغيير بعض البرامج الوسيطة الصغيرة يمكن أن يكسر نوعًا من وحدة التحكم. تريد استخدام العميل الجديد لـ redis - لا ، لا يمكنك ، وحدة التحكم التي كتبناها قبل ثلاث سنوات تستخدم الإصدار 0.1.0. هل تريد أخيرًا الاستفادة من الميزات الجديدة لـ Node.js 10؟ أو ربما 12؟ عذرا ، ولكن يستخدم متراصة الإصدار 6.
كيفية التواصل
نظرًا لأننا بدأنا الحديث عن المثال "اشترى المستخدم منتجًا ، فإننا نرسل إشعارًا بالبيع إلى البائع" ، ثم سنقوم بتنفيذه.
المخطط كما يلي:
- يرسل المستخدم طلبًا إلى سوق الخدمات الصغيرة لشراء الأشياء على الرابط / السوق / شراء /: الهوية
- يتم كتابة العلم في قاعدة البيانات التي يتم بيع المنتج
- من سوق الخدمات المصغرة ، يتم إرسال طلب إلى إخطارات الخدمات الصغيرة ، التي يتصل بها العملاء عبر WebSocket
- ترسل إعلامات Microservice رسالة إلى البائع حول بيع الأشياء
تثبيت MicroMQ
$ npm i micromq@1 -S
كتابة بوابة
const Gateway = require('micromq/gateway');
تتكون البوابة الخاصة بنا من نقطة نهاية واحدة ، ولكن هذا يكفي على سبيل المثال والتدريب.
كتابة إعلامات microservice
const MicroMQ = require('micromq'); const WebSocket = require('ws');
نحن هنا نرفع خادم مقبس الويب والخدمات الصغيرة في نفس الوقت لتلقي الطلبات لكل من مآخذ الويب و RabbitMQ.
المخطط كما يلي:
- مستخدم يتصل بخادم مقبس الويب الخاص بنا
- يُصرح للمستخدم بإرسال حدث
authorize
مع userId داخله - نحتفظ باتصال المستخدم حتى تتمكن من إرسال إعلامات إليه في المستقبل
- يصل حدث ما على RabbitMQ تحتاج إلى إرسال إشعار إلى المستخدم
- التحقق من صحة البيانات الواردة
- الحصول على اتصال المستخدم
- إرسال إشعار
كتابة سوق الخدمات
const MicroMQ = require('micromq'); const { Items } = require('./api/mongodb');
المخطط كما يلي:
- نتلقى طلب المستخدم لشراء عنصر
- نحن نبحث عن العنصر ذو المعرف الصحيح ونتأكد من عدم بيعه بعد
- علامة البند كما تباع
- نرسل إشعارًا إلى البائع بشأن عملية البيع في الخلفية
- نرد على العميل
مراجعة
- نبدأ 3 عمليات
- سوف نرسل وظيفة / السوق / شراء / 1
- حصلنا على الرد
{ ok: true }
- البائع يتلقى الإخطار
$ PORT=9000 node ./src/gateway.js $ PORT=9001 node ./src/notifications.js $ MONGODB_URL=mongodb://localhost:27017/my-super-microservice node ./src/market.js
