تعني مشاركة سياق الموارد غير المتزامنة مشاركة بيانات السياق ضمن دورة حياة طلب الشبكة أو سلسلة استدعاء الموارد غير المتزامنة.
قبل الإجابة على هذا السؤال، يجب علينا أولاً أن نفهم ما هي الموارد غير المتزامنة.
يمكن فهم الموارد غير المتزامنة على أنها كائنات ذات عمليات رد اتصال، على سبيل المثال لا الحصر، Promises وTimeouts وTCPWrap وUDP وما إلى ذلك. راجع قائمة أنواع الموارد غير المتزامنة للحصول على التفاصيل.
التعريف الرسمي هو كما يلي:
يمثل المورد غير المتزامن كائنًا له رد اتصال مرتبط، ويمكن استدعاء رد الاتصال هذا عدة مرات، مثل حدث "الاتصال" في net.createServer()، أو مرة واحدة فقط كما في fs.open. (). يمكن أيضًا إغلاق المورد قبل استدعاء رد الاتصال
هنا نقدم AsyncLocalStorage، وهو حل مشاركة السياق غير المتزامن المقدم رسميًا بواسطة Node.js. كانت هذه الميزة لا تزال ميزة تجريبية قبل 16.4.0 وكانت مستقرة منذ 16.4 .0.
يمكن لـ AsyncLocalStorage مشاركة البيانات في سلسلة من العمليات غير المتزامنة.
يحتوي مثيل AsyncLocalStorage asyncLocalStorage على الطرق الرئيسية التالية:
على سبيل المثال:
const store = { id: 1 }; // يستبدل المتجر السابق بكائن المتجر المحدد asyncLocalStorage.enterWith(store); asyncLocalStorage.getStore(); // إرجاع كائن المتجر someAsyncOperation(() => { asyncLocalStorage.getStore(); // إرجاع نفس الكائن });
المعلمة الأولى للوظيفة asyncLocalStorage.run() هي تخزين البيانات المشتركة التي نحتاج للوصول إليها في المكالمة غير المتزامنة، والمعلمة الثانية هي وظيفة غير متزامنة.
فيما يلي مثال لتوضيح كيفية استخدام AsyncLocalStorage لتنفيذ مشاركة سياق الموارد غير المتزامنة:
الإخراج:
runA 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 هذه رسالة سجل runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 هذه رسالة سجل
في نفس الوظيفة غير المتزامنة التي يتم تشغيلها من خلال asyncLocalStorage.run، سيتم تشغيل الوظائف runA والوظيفة runB، ويمكن تشغيل runA وrunB يمكن الوصول إلى نفس بيانات السياق.
يوفر AsyncLocalStorage وسيلة رائعة لنا لتنفيذ مشاركة سياق الموارد غير المتزامنة بسهولة في Node.js، ولكن كل عملية موارد غير متزامنة ستؤدي إلى تشغيل Async Hooks، والتي سيكون لها حتمًا تأثير معين على أداء تطبيق Node الخاص بنا. إذن ما حجم التأثير؟
وفقًا للقياس الفعلي الذي أجراه Kuzzle، سيؤدي استخدام AsyncLocalStorage إلى خسارة إضافية في الأداء بنسبة 8٪ تقريبًا، وقد يكون لسيناريوهات الأعمال المختلفة أداء مختلف. إذا كنت قلقًا بشأن هذا الجزء من الأداء، فيمكنك أيضًا إضافة اختبار مقارن إلى عملك لاختبار تأثير الأداء المحدد.
---- | سجل باستخدام | سجل | AsyncLocalStorage |
---|---|---|---|
req/s | الفرق الكلاسيكي2613 | 2842 | ~8% |
في اللغات الأخرى متعددة الخيوط، يقوم كل HTTP بإنشاء موضوع جديد، وكل موضوع له ذاكرته الخاصة. يمكنك تخزين الحالة العالمية في ذاكرة الخيط واسترداد الحالة العالمية من أي مكان في التعليمات البرمجية الخاصة بك.
في Node.js، نظرًا لأن Node.js أحادي الترابط ويشارك الذاكرة بين جميع طلبات HTTP، لا يمكن لكل طلب HTTP أن يحتفظ بحالة عامة معزولة عن بعضها البعض.
يمكن لـ AsyncLocalStorage عزل الحالة بشكل فعال بين العمليات غير المتزامنة المختلفة، ويلعب دورًا مهمًا للغاية في سيناريوهات مثل تتبع طلبات HTTP، وأدوات APM، وتتبع سجل السياق، وتتبع سجل الارتباط الكامل القائم على الطلب.