비동기 리소스 컨텍스트 공유는 네트워크 요청 수명 주기 또는 비동기 리소스 호출 체인 내에서 컨텍스트 데이터를 공유하는 것을 의미합니다.
이 질문에 답하기 전에 먼저 비동기 리소스가 무엇인지 이해해야 합니다.
비동기 리소스는 Promise, Timeouts, TCPWrap, UDP 등과 같은 콜백이 있는 객체로 이해될 수 있습니다. 자세한 내용은 비동기 리소스 유형 목록을 참조하세요.
공식 정의는 다음과 같습니다.
비동기 리소스는 연관된 콜백이 있는 객체를 나타냅니다. 이 콜백은 net.createServer()의 'connection' 이벤트와 같이 여러 번 호출되거나 fs.open에서와 같이 한 번만 호출될 수 있습니다. (). 콜백이 호출되기 전에 리소스를 닫을 수도 있습니다.
여기서는 Node.js에서 공식적으로 제공하는 비동기 컨텍스트 공유 솔루션인 AsyncLocalStorage를 소개합니다. 이 기능은 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에서 비동기 리소스 컨텍스트 공유를 쉽게 구현할 수 있는 뛰어난 순회 기능을 제공하지만 모든 비동기 리소스 작업은 비동기 후크를 트리거하여 필연적으로 Node 애플리케이션의 성능에 특정 영향을 미칩니다. 그럼 그 영향은 얼마나 큽니까?
Kuzzle의 실제 측정에 따르면 AsyncLocalStorage를 사용하면 약 8%의 추가 성능 손실이 발생합니다. 물론 비즈니스 시나리오에 따라 성능이 다를 수 있습니다. 성능의 이 부분이 우려되는 경우 비즈니스에 비교 테스트를 추가하여 특정 성능 영향을 테스트할 수도 있습니다.
---- | AsyncLocalStorage를 사용하여 로그 | 로그 클래식 | 차이 |
---|---|---|---|
req/s | 2613 | 2842 | ~8% |
다른 다중 스레드 언어에서 각 HTTP는 새 스레드를 생성하고 각 스레드는 자체 메모리를 갖습니다. 전역 상태를 스레드 메모리에 저장하고 코드 어디에서나 전역 상태를 검색할 수 있습니다.
Node.js에서는 Node.js가 단일 스레드이고 모든 HTTP 요청에서 메모리를 공유하기 때문에 각 HTTP 요청은 서로 격리된 전역 상태를 보유할 수 없습니다.
AsyncLocalStorage는 서로 다른 비동기 작업 간의 상태를 효과적으로 격리할 수 있으며 HTTP 요청 추적, APM 도구, 컨텍스트 로그 추적 및 요청 기반 전체 링크 로그 추적과 같은 시나리오에서 매우 중요한 역할을 합니다.