การแบ่งปันบริบททรัพยากรแบบอะซิงโครนัสหมายถึงการแบ่งปันข้อมูลบริบทภายในวงจรชีวิตคำขอเครือข่ายหรือสายการเรียกทรัพยากรแบบอะซิงโครนัส
ก่อนที่จะตอบคำถามนี้ เราต้องเข้าใจก่อนว่าทรัพยากรแบบอะซิงโครนัสคืออะไร
ทรัพยากรแบบอะซิงโครนัสสามารถเข้าใจได้ว่าเป็นออบเจ็กต์ที่มีการเรียกกลับ เช่น แต่ไม่จำกัดเพียง 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 (ร้านค้า); 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 24/5/2565 20:26:17 นี่เป็นข้อความบันทึก
ในฟังก์ชันอะซิงโครนัสเดียวกันที่ทำงานผ่าน asyncLocalStorage.run ฟังก์ชัน runA และฟังก์ชัน runB จะถูกเรียกใช้ และ runA และ runB สามารถ เข้าถึงข้อมูลบริบทเดียวกันได้
AsyncLocalStorage มอบช่องทางที่ดีเยี่ยมสำหรับเราในการปรับใช้การแชร์บริบททรัพยากรแบบอะซิงโครนัสใน Node.js ได้อย่างง่ายดาย แต่การดำเนินการทรัพยากรแบบอะซิงโครนัสทุกครั้งจะทริกเกอร์ Async Hooks ซึ่งจะมีผลกระทบต่อประสิทธิภาพของแอปพลิเคชัน Node ของเราอย่างหลีกเลี่ยงไม่ได้ แล้วผลกระทบจะขนาดไหน?
ตามการวัดจริงโดย Kuzzle การใช้ AsyncLocalStorage จะทำให้ประสิทธิภาพลดลงประมาณ 8% แน่นอนว่าสถานการณ์ทางธุรกิจที่แตกต่างกันอาจมีประสิทธิภาพที่แตกต่างกัน หากคุณกังวลเกี่ยวกับประสิทธิภาพส่วนนี้ คุณสามารถเพิ่มการทดสอบเปรียบเทียบให้กับธุรกิจของคุณเพื่อทดสอบผลกระทบต่อประสิทธิภาพที่เฉพาะเจาะจงได้
---- | บันทึกด้วย AsyncLocalStorage | บันทึก | ความต้องการความแตกต่าง | แบบคลาสสิ
---|---|---|---|
ก | 2613 | 2842 | ~8% |
ในภาษาแบบมัลติเธรดอื่นๆ HTTP แต่ละรายการจะสร้างเธรดใหม่และแต่ละเธรดจะมีหน่วยความจำของตัวเอง คุณสามารถจัดเก็บสถานะส่วนกลางไว้ในหน่วยความจำเธรดและดึงข้อมูลสถานะส่วนกลางได้จากทุกที่ในโค้ดของคุณ
ใน Node.js เนื่องจาก Node.js เป็นแบบเธรดเดียวและแบ่งปันหน่วยความจำระหว่างคำขอ HTTP ทั้งหมด คำขอ HTTP แต่ละรายการจึงไม่สามารถเก็บสถานะส่วนกลางที่แยกจากกัน
AsyncLocalStorage สามารถแยกสถานะระหว่างการดำเนินการแบบอะซิงโครนัสต่างๆ ได้อย่างมีประสิทธิภาพ และมีบทบาทสำคัญในสถานการณ์ต่างๆ เช่น การติดตามคำขอ HTTP, เครื่องมือ APM, การติดตามบันทึกบริบท และการติดตามบันทึกลิงก์แบบเต็มตามคำขอ