다음은 Node.js를 사용할 때 따르는 10 가지 성능 규칙입니다.
1. 동기 코드를 사용하지 마십시오
디자인 측면에서 Node.js는 단일 스레드입니다. 단일 스레드가 많은 동시 요청을 처리 할 수 있도록 스레드가 차단, 동기 또는 장기 작업을 기다릴 수는 없습니다. Node.js의 독특한 특징은 비동기식을 달성하기 위해 위에서 아래로 설계되고 구현된다는 것입니다. 이것은 이벤트 유형 프로그램에 매우 적합합니다.
불행히도 여전히 동기/차단 호출이 발생할 가능성이 여전히 있습니다. 예를 들어, 많은 파일 시스템 작업에는 writefile 및 writefilesync와 같은 동기 및 비동기 버전이 모두 있습니다. 코드를 사용하여 동기화 방법을 제어하더라도 부주의하게 통화를 차단하는 외부 기능 라이브러리를 사용할 수 있습니다. 이렇게하면 성능에 미치는 영향이 엄청납니다.
// 양호 : 파일 쓰기 파일 asynchronouslyfs.writeFile ( 'message.txt', 'hello node', function (err) {console.log ( "저장되고 서버가 반응 상태로 유지됩니다!");}); // bad : 파일 쓰기 파일 synchronouslyfs.writefilesync ( 'message.txt', 'hello node'); console.log ( "저장되었지만 모든 요청을 차단했습니다!");초기화 로그는 의도하지 않게 구현 될 때 디스크에 컨텐츠를 작성하기위한 동기식 호출이 포함됩니다. 성능 테스트를 수행하지 않으면이 문제를 쉽게 무시할 수 있습니다. 개발자 박스에서 Node.js 인스턴스를 표준 테스트로 사용하면이 동기 호출로 인해 초당 수천 건의 요청에서 수십 개로 성능이 떨어집니다.
2. 소켓 풀을 닫습니다
Node.js의 HTTP 클라이언트는 소켓 풀을 자동으로 사용합니다. 기본적으로 호스트 당 5 개의 소켓 만 제한합니다. 소켓 재사용으로 인해 통제중인 자원이 증가 할 수 있지만 동일한 호스트의 동시 요청을 처리 해야하는 경우 일련의 병목 현상이 발생합니다. 이 경우 MaxSocket의 값을 높이거나 소켓 풀을 닫는 것이 좋습니다.
// 소켓 풀링 var http = require ( 'http'); var 옵션 = {.....}; 옵션 = 거짓; var req = http.request (옵션)3. 정적 자원이 node.js를 사용하도록하지 마십시오
CSS 및 이미지와 같은 정적 리소스의 경우 Node.js 대신 표준 웹 서버를 사용하십시오. 예를 들어 LinkedIn Mobile은 Nginx를 사용합니다. 또한 전 세계의 정적 리소스를 서버에 복사 할 수있는 CDN (Content Delivery Networks)도 사용합니다. (1) Node.js Server의 부하를 줄일 수 있습니다 (2) CDN은 사용자에게 가까운 서버에서 정적 컨텐츠를 전달할 수 있으므로 대기 시간이 줄어 듭니다.
4. 클라이언트를 렌더링하십시오
서버 렌더링과 클라이언트 렌더링의 차이점을 빠르게 비교해 봅시다. Node.js를 사용하여 서버 측에서 렌더링하는 경우 각 요청마다 다음과 같은 HTML 페이지를 다시 보냅니다.
<!-전적으로 서버 쪽 렌더링 된 간단한 웹 페이지의 예-> <! doctype html> <html> <head> <title> LinkedIn Mobile </title> </head> <body> <div> <img src = "http://mobile-cdn.leadedin.com/imgedinages/minkedin.png"/> div. </div> </body> </html>
사용자 이름을 제외 하고이 페이지의 모든 내용을 관찰하는 데주의를 기울이십시오. 나머지는 정적입니다. 각 사용자가 과부하시키는 내용은 동일합니다. 따라서보다 효과적인 접근 방식은 Node.js가 JSON 양식의 페이지에서 요구하는 동적 컨텐츠 만 반환하도록하는 것입니다.
{ "이름": "John"}
나머지 페이지 (모든 정적 HTML 태그)는 javaScripe 템플릿 (indercore.js 템플릿)에 배치 할 수 있습니다.
<!-클라이언트 측면으로 렌더링 할 수있는 JavaScript 템플릿의 예-> <! doctype html> <html> <head> <title> LinkedIn Mobile </title> </head> <body> <div> <img src = "http://mobile-cdn.linkedin.com/linkedin.png"//dvir> </div. " %>! </div> </body> </html>
성능 향상은 다음과 같은 장소에서 비롯됩니다. 세 번째 포인트에서 알 수 있듯이 정적 JavaScript 템플릿은 서버 측에서 WebServer (예 : Nginx)를 통해 제공하거나 더 나은 CDN으로 구현할 수 있습니다. 또한 JavaScript 템플릿을 브라우저에 캐시하거나 로컬로 저장할 수 있습니다. 모든 초기 페이지가로드되면 클라이언트에게 전송 해야하는 유일한 데이터는 JSON입니다. 이 방법은 CPU, IO 및 Node.js의 부하를 크게 줄일 수 있습니다.
5. GZIP를 사용하십시오
많은 서버와 클라이언트는 GZIP를 지원하여 요청과 답변을 압축합니다. 클라이언트에 응답하든 원격 서버로 요청을 보내 든,이를 최대한 활용하십시오.
6. 평행
모든 차단 작업 - 요청, DB 통화 및 원격 서비스에 대한 파일 시스템 액세스를 보내도록하십시오. 이렇게하면 모든 차단 작업의 대기 시간보다는 가장 느린 차단 작업의 대기 시간이 줄어 듭니다. 콜백 및 오류 처리를 깨끗하게 유지하려면 단계를 사용하여 트래픽을 제어합니다.
7. 세션 자유화
LinkedIn Mobile은 Express Framework를 사용하여 요청/응답주기를 관리합니다. 많은 표현 예제에는 다음 구성이 포함됩니다.
app.use (express.session ({비밀 : "키보드 고양이"}));
기본적으로 세션 데이터는 메모리에 저장되며, 특히 사용자 수가 증가함에 따라 서버에 막대한 오버 헤드가 추가됩니다. MongoDB 또는 Redis와 같은 외부 세션 스토어를 사용할 수 있지만 각 요청은 세션 데이터를 얻기 위해 원격 통화의 오버 헤드를 초래합니다. 가능하면 가장 좋은 옵션은 모든 무국적 데이터를 서버 측에 저장하는 것입니다. 위의 Express 구성을 포함하지 않음으로써 세션을 자유화함으로써 더 나은 성능을 볼 수 있습니다.
8. 이진 모듈을 사용하십시오
가능하면 JavaScript 모듈을 이진 모듈로 교체하십시오. 예를 들어, JavaScript로 작성된 SHA 모듈에서 Node.js의 컴파일 버전으로 변환하면 성능이 큰 도약을 볼 수 있습니다.
// 내장 내장 또는 바이너리 모듈 크립토 = 요구 사항 ( 'crypto'); var hash = crypto.createhmac ( "sha1", key) .update (signaturebase) .digest ( "base64");
9. 클라이언트 라이브러리를 표준 V8 JavaScript로 교체하십시오
예를 들어 JavaScript 환경에서 일부 브라우저는 Foreach, MAP 및 Reduce와 같은 기능을 지원하지만 일부 브라우저는 그렇지 않기 때문에 많은 JavaScript 라이브러리가 웹 브라우저에서 사용하기 위해 작성됩니다. 따라서 클라이언트 라이브러리는 일반적으로 브라우저 차이를 극복하기 위해 많은 비효율적 인 코드를 사용합니다. 반면, Node.js에서는 어떤 JavaScript 메소드가 효과적인 지 정확히 알 수 있습니다. V8 JavaScript 엔진은 Node.js를 지원하여 ECMA-262의 다섯 번째 판에 지정된 ECMAScript를 구현합니다. 클라이언트 라이브러리를 표준 V8 JavaScript 함수로 직접 교체하면 성능이 크게 향상됩니다.
10. 코드를 작고 가볍게 유지하십시오
모바일 장치를 사용하면 액세스가 느리고 대기 시간이 높아 지므로 코드가 작고 가볍게 유지해야합니다. 서버 코드에 대해 동일한 철학이 유지됩니다. 때때로 귀하의 결정을 되돌아보고 "우리는이 모듈이 정말로 필요합니까?", "왜 우리는이 프레임 워크를 사용합니까? 오버 헤드가 우리가 사용할 가치가 있습니까?", "간단한 방법으로 구현할 수 있습니까?"와 같은 질문을합니다. 소형 코드는 일반적으로 더 효율적이고 빠릅니다.
시도해보십시오
우리는 모바일 앱을 빠르게 만들기 위해 열심히 노력합니다. iPhone 앱, Android Apps 및 HTML5 모바일 버전과 같은 플랫폼에서 우리가 어떻게 수행하고 있는지 알려주십시오.