서버 방해 해제: NodeJS 협업 멀티태스킹
5503 단어 nodewebdevjavascript
TL; DR
js-coroutines 이제 노드에서 협업 멀티태스킹을 수행할 수 있으므로 하나 또는 두 개의 장기 실행 작업으로 인해 서버의 대화가 중단되지 않습니다.
노드 처리
Node에서 상당한 처리가 필요할 수 있는 한 곳은 정보 캐시를 생성하거나 정기적으로 업데이트할 때입니다. 데이터 볼륨이 증가함에 따라 이 처리가 매우 번거로워질 수 있으며 이러한 작업이 진행되는 동안 서버가 정체되어 다른 요청에 응답하지 않습니다.
현재 워크로드가 완료되는 동안 빠른 5ms 요청도 잠재적으로 몇 초 동안 차단됩니다.
예를 들어 Run Big Job 버튼을 클릭하면 기본 스레드에서 요청이 차단되기 때문에 시간이 더 이상 업데이트되지 않습니다.
이 예는 결과를 얻을 때마다 서버 시간에 대한 요청을 실행하는 것입니다. Run Big Job 버튼을 클릭하면 서버는 백만 개의 레코드 복사 및 정렬과 관련된 프로세스를 수행합니다.
// This is the culprit
let test = Array.from({ length: 1000000 }, () => Math.random() * 1000)
app.get("/bigjob", async (req, res) => {
let copy = [...test]
copy.sort()
res.status(200).send("done")
})
코루틴
코루틴을 사용하면 협업 멀티태스킹을 통해 시간이 지남에 따라 무거운 작업을 분할할 수 있습니다. js-coroutines에는 다양한 기본 기능이 포함되어 있으며 생성기 구문을 사용하여 직접 작성할 수 있습니다.
이 경우 위의 코드를 다음과 같이 다시 작성할 수 있습니다.
const { appendAsync, sortAsync } = require("js-coroutines")
let test = Array.from({ length: 1000000 }, () => Math.random() * 1000)
app.get("/bigjob", async (req, res) => {
let copy = await appendAsync([], test)
await sortAsync(copy)
res.status(200).send("done")
})
아래 예에서 버튼을 클릭하면 시간이 계속 업데이트됩니다. 두 번 이상 클릭할 수도 있으며 준비가 되면 결과가 다시 표시됩니다(버튼 텍스트에 * 추가).
이러한 모든 작업은 단일 스레드를 사용하므로 최대 성능을 위해 작업을 오프로드할 수 있는 여러 프로세서가 있는 경우 사용해서는 안 됩니다. 작업이 기본 스레드를 차단하지 않으려는 경우 매우 유용합니다. 처리 시간이 중요하지 않습니다.
노드 지원
노드 지원이 즉시 활성화되고 작업이 실행되는 데 최대 20ms가 허용된 다음 이벤트 루프가 실행됩니다.
Reference
이 문제에 관하여(서버 방해 해제: NodeJS 협업 멀티태스킹), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/miketalbot/unjam-your-server-nodejs-collaborative-multitasking-4b8n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)