Berbagi konteks sumber daya asinkron berarti berbagi data konteks dalam siklus hidup permintaan jaringan atau rantai panggilan sumber daya asinkron.
Sebelum menjawab pertanyaan ini, pertama-tama kita harus memahami apa itu sumber daya asinkron.
Sumber daya asinkron dapat dipahami sebagai objek dengan panggilan balik, seperti namun tidak terbatas pada Janji, Batas Waktu, TCPWrap, UDP, dll. Lihat daftar jenis sumber daya asinkron untuk mengetahui detailnya.
Definisi resminya adalah sebagai berikut:
Sumber daya asinkron mewakili objek dengan panggilan balik terkait. Panggilan balik ini dapat dipanggil beberapa kali, seperti peristiwa 'koneksi' di net.createServer(), atau hanya satu kali seperti di fs.open. (). Sumber daya juga dapat ditutup sebelum panggilan balik dipanggil.
Di sini kami memperkenalkan AsyncLocalStorage, solusi berbagi konteks asinkron yang secara resmi disediakan oleh Node.js. Fitur ini masih merupakan fitur eksperimental sebelum 16.4.0 dan telah stabil sejak 16.4 .0.
AsyncLocalStorage dapat berbagi data dalam rantai operasi asinkron.
Instance AsyncLocalStorage asyncLocalStorage memiliki metode utama berikut:
contoh:
const store = { id: 1 }; // Mengganti penyimpanan sebelumnya dengan objek penyimpanan yang diberikan asyncLocalStorage.enterWith(toko); asyncLocalStorage.getStore(); // Mengembalikan objek penyimpanan someAsyncOperation(() => { asyncLocalStorage.getStore(); // Mengembalikan objek yang sama });
Parameter pertama dari fungsi asyncLocalStorage.run() adalah untuk menyimpan data bersama yang perlu kita akses dalam panggilan asinkron, dan parameter kedua adalah fungsi asinkron.
Berikut ini adalah contoh untuk menunjukkan cara menggunakan AsyncLocalStorage untuk mengimplementasikan berbagi konteks sumber daya asinkron:
Output:
runA 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 24/5/2022 20:26:17 ini adalah pesan log runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 24/5/2022 20:26:17 ini adalah pesan log
Dalam fungsi asinkron yang sama dijalankan melalui asyncLocalStorage.run, fungsi runA dan fungsi runB akan dijalankan, dan runA dan runB dapat diakses ke data konteks yang sama.
AsyncLocalStorage memberikan traversal yang bagus bagi kita untuk dengan mudah menerapkan berbagi konteks sumber daya asinkron di Node.js, namun setiap operasi sumber daya asinkron akan memicu Async Hooks, yang pasti akan berdampak tertentu pada kinerja aplikasi Node kita. Lalu seberapa besar dampaknya?
Menurut pengukuran sebenarnya oleh Kuzzle, penggunaan AsyncLocalStorage akan menyebabkan hilangnya performa tambahan sekitar 8%. Tentu saja, skenario bisnis yang berbeda mungkin memiliki performa yang berbeda. Jika Anda mengkhawatirkan bagian kinerja ini, Anda juga dapat menambahkan pengujian komparatif ke bisnis Anda untuk menguji dampak kinerja tertentu.
---- | Masuk dengan AsyncLocalStorage | Catat persyaratanperbedaan | klasik |
---|---|---|---|
2613 | 2842 | ~ | 8% |
Dalam bahasa multi-utas lainnya, setiap HTTP membuat utas baru, dan setiap utas memiliki memorinya sendiri. Anda dapat menyimpan status global dalam memori thread dan mengambil status global dari mana saja dalam kode Anda.
Di Node.js, karena Node.js adalah single-threaded dan berbagi memori di antara semua permintaan HTTP, setiap permintaan HTTP tidak dapat menampung status global yang terisolasi satu sama lain.
AsyncLocalStorage dapat secara efektif mengisolasi status antara operasi asinkron yang berbeda, dan memainkan peran yang sangat penting dalam skenario seperti pelacakan permintaan HTTP, alat APM, pelacakan log konteks, dan pelacakan log tautan lengkap berbasis permintaan.