Node.js / المتقدم: خدمات Node.js موثوقة / الدرس 18
النشر وقابلية الملاحظة
أصدر حزمة قابلة للتكرار واعرض إشارات صحة مفيدة واربط السجلات بسياق الطلب دون تسريب بيانات حساسة.
في هذه الصفحة
أهداف الدرس
- اشرح المفاهيم والمفاضلات المتعلقة بموضوع «النشر وقابلية الملاحظة».
- توقع المثالين وتحقق من مخرجاتهما وسلوك تنظيف الموارد فيهما.
- شخّص الإخفاقات الثلاثة الشائعة وطبق الحلول المشروحة على مدخلات مشابهة.
نشر حزمة معلومة
يجب أن يحدد النشر مراجعة المصدر وبيئة التشغيل والقفل وخطوات البناء وعقد الإعدادات. ابن واختبر مرة في بيئة مضبوطة ثم رق الحزمة المراجعة بدلا من تثبيت أحدث حزم عشوائية عند البدء. استخدم إصدارا مدعوما بتصحيحات حديثة وتحقق من التسميات والمواعيد رسميا. الحاوية أداة تغليف وليست حدا أمنيا تلقائيا. شغّل بأذونات مناسبة وحدد المواقع القابلة للكتابة وطلبات الموارد وحدودها بالقياس.
فصل الجاهزية عن الحياة
تسأل الحياة هل تعمل العملية بما يغني عن إعادة تشغيلها، وتسأل الجاهزية هل تستقبل النسخة عملا جديدا. قد تكون النسخة البادئة أو المصرفة حية وغير جاهزة. لا تربط كل فحص حياة بقاعدة خارجية كي لا يسبب تعطلها عاصفة إعادة تشغيل. يمكن للجاهزية تضمين حالة اعتماديات لازمة بفحوص محدودة ومخزنة ومعان واضحة. يمثل المثال الثاني البدء والجاهزية والتصريف دون نشر حقيقي. لا تفيد الاستجابة إلا إذا تصرفت منصة التوجيه وفق معناها.
ربط السجلات بسياق الطلب
تستخدم السجلات المنظمة حقولا متسقة مثل event وrequestId وroute وstatus وdurationMs. سجل بيانات معتمدة بدلا من الأجسام وترويسات الاعتماد كاملة. تنقل AsyncLocalStorage السياق عبر العمل غير المتزامن دون تمرير المعرف لكل مساعد. ينشئ المثال الأول سياقين اصطناعيين ويحفظ كل منهما معرفه بعد await. تحقق من معرف الارتباط الوارد أو استبدله؛ فلا يتحكم العميل بحقول غير محدودة أو متعددة الأسطر. السياق حالة تشخيص لا مصدر قرارات صلاحية.
import { AsyncLocalStorage } from 'node:async_hooks';
import { setTimeout as delay } from 'node:timers/promises';
const context = new AsyncLocalStorage();
async function operation(id) {
return context.run({ requestId: id }, async () => {
await delay(1);
return { event: 'completed', requestId: context.getStore().requestId };
});
}
const records = await Promise.all([operation('lab-a'), operation('lab-b')]);
for (const record of records) console.log(JSON.stringify(record));
{"event":"completed","requestId":"lab-a"}
{"event":"completed","requestId":"lab-b"}
تحفظ كل سلسلة سياق طلبها. تحافظ Promise.all على ترتيب العرض دون الادعاء بترتيب انتهاء العمليتين.
اختيار قياسات ذات تنوع مضبوط
تتبع عدد الطلبات والأخطاء وتوزيع الزمن والعمل النشط والطوابير وانتظار المجمع والذاكرة وتأخر الحلقة. صنف الطلب بقالب المسار لا معرف المستخدم أو الرابط الكامل؛ فقد يغرق تنوع التسميات نظام المراقبة. تربط التتبعات المراحل بين الخدمات، لكن نقلها وأخذ عيناتها مقصودان وتحتاج سماتها حجبا أيضا. ابن التنبيهات على أثر مستمر وخطر نفاد موارد لا كل استثناء منفرد. أدرج مراجعة النشر لربط الرجوع بتغيير محدد.
let state = 'starting';
function probe() { return { live: state !== 'stopped', ready: state === 'ready' }; }
console.log(JSON.stringify(probe()));
state = 'ready'; console.log(JSON.stringify(probe()));
state = 'draining'; console.log(JSON.stringify(probe()));
state = 'stopped'; console.log(JSON.stringify(probe()));
{"live":true,"ready":false}
{"live":true,"ready":true}
{"live":true,"ready":false}
{"live":false,"ready":false}
تتغير الجاهزية قبل توقف العملية. تربط نقاط الفحص الحقيقية الحالة برموز HTTP وأفعال منصة موثقة.
الإصدار والاستعادة بوعي
يحد النشر الآمن التعرض ويراقب مؤشرات النجاح المختبرة ويتيح الرجوع. يجب توافق المخطط مع الإصدارين القديم والجديد أثناء التداخل. افحص تحقق البدء وانتقالات الجاهزية والإغلاق وتفريغ القياس في تجربة معزولة. لا تستنتج النجاح من بقاء العملية حية. ينجح الإصدار حين يبقى السلوك والخطأ والزمن وسلامة البيانات مقبولة. وثّق دليلا تشغيليا للفحص والإيقاف وإعادة التشغيل والتسوية دون تخمين أو كشف اعتمادات.
الأخطاء الشائعة وإصلاحها
يعيد تعطل القاعدة تشغيل النسخ كلها
- لماذا يحدث؟
- اعتمد فحص الحياة على اعتمادية بعيدة.
- كيف تصلحه؟
- افصل صحة العملية عن الجاهزية وحالة الاعتمادية.
- كيف تتجنب تكراره؟
- جرّب فشل الاعتمادية في بيئة معزولة.
يتضخم تخزين القياسات
- لماذا يحدث؟
- تحتوي التسميات معرفات فريدة أو روابط كاملة.
- كيف تصلحه؟
- استخدم أبعادا محدودة كقوالب المسارات.
- كيف تتجنب تكراره؟
- راجع تنوع التسميات قبل الإصدار.
يتعذر تكرار إصدار
- لماذا يحدث؟
- ثبّت البدء إصدارات اعتماديات متغيرة.
- كيف تصلحه؟
- ابن من قفل مراجع ورق حزمة واحدة.
- كيف تتجنب تكراره؟
- سجل مراجعة المصدر والإصدار وهوية الحزمة.
اختبر فهمك
1. تصرّف نسخة الطلبات المقبولة. ماذا تعلن الجاهزية والحياة؟
اعرض الحل المشروح
تكون الجاهزية false لمنع حركة جديدة، وقد تبقى الحياة true أثناء التنظيف المنظم. بعد إغلاق الموارد تتوقف العملية. نسق سماح المنصة مع موعد التطبيق كي لا يسبق الإنهاء القسري فترة التصريف الموعودة.
2. اختر تسميات قياسات وحقول سجل آمنة لطلب GET /users/123.
اعرض الحل المشروح
استخدم GET وقالب /users/:id وفئة الحالة كتسميات محدودة. ضع معرف طلب متحققا منه ومراجعة النشر في السجل عند الحاجة. تجنب معرف المستخدم بعدا للقياسات واحذف ترويسات الاعتماد وبيانات الملف الحساسة.
أهم ما تعلمته
- يجب أن يحدد النشر مراجعة المصدر وبيئة التشغيل والقفل وخطوات البناء وعقد الإعدادات.
- تسأل الحياة هل تعمل العملية بما يغني عن إعادة تشغيلها، وتسأل الجاهزية هل تستقبل النسخة عملا جديدا.
- يحد النشر الآمن التعرض ويراقب مؤشرات النجاح المختبرة ويتيح الرجوع.