Node.js 확장


86

저는 대규모 서버 측 개발에 상당히 익숙합니다. Node.js를 사용하여 서버를 작성하고 싶지만 계속 진행하기 전에 노드를 초당 20 개의 쿼리까지 확장하는 일반적인 원칙이 무엇인지 알고 싶습니다.

내가 작성하는 서비스는 주로 데이터베이스에 대한 인터페이스와 입력 데이터의 인증 및 유효성 검사입니다.


"노드 확장"이란 무엇을 의미합니까? 다중 노드 프로세스를 시작 하시겠습니까?
Thilo

3
초당 20 개의 쿼리는 상당히 낮습니다. Node.js는 수천 개의 동시 연결을 처리 할 수 ​​있어야합니다. 전체 인터프리터를 차단하므로 무거운 루프 처리를하지 마십시오. 사용 사례는 비교적 가볍습니다. Node에서 데이터베이스 연결은 스레드에 자동으로 생성되고 자바 스크립트 수준에서 비동기 적으로 처리됩니다.
slebetman

답변:


149

부하 분산

가장 간단한 사이트의 경우 확장이 전혀 필요하지 않습니다. 단 하나의 상자로 보장됩니다. 그 후에는 모든 아키텍처에 대해 거의 동일한로드 밸런싱을 수행해야합니다 (예 : 먼저 여러 노드 프로세스를 시작할 수 있다고 말한 것처럼 말입니다.하지만 실제로 커지면 더 많은 상자가 필요합니다).

Nginx 부하 분산 예 :

http {
  upstream myproject {
    server 127.0.0.1:8000 weight=3;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;    
    server 127.0.0.1:8003;
  }

  server {
    listen 80;
    server_name www.domain.com;
    location / {
      proxy_pass http://myproject;
    }
  }
}

Redis

초당 쿼리 20 개

node.js에 대한 땀이 없습니다. 그것은 미친 속도이기 때문에 redis를 데이터 저장소로 사용해야합니다 :). node_redis 를 사용할 때 node 용 ac 라이브러리도 있습니다 .

npm install hiredis redis

Hiredis는 노드 내부의 C 코드로 컴파일되기 때문에 뛰어난 성능을 제공합니다. 다음은 hiredis와 함께 사용할 때 redis의 벤치 마크입니다.

PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287

이 숫자를 보면 20 / s는 아무것도 아닙니다 :).

입증


최신 정보:


나는 이것을 많이 말하고 있지만 신의 사랑을 위해 자신의 인증 시스템을 구현하려고 시도하지 마십시오. 아마도 안전하지 않을 것입니다 (많은 일이 잘못 될 수 있음). 인증을 위해서는 우수한 connect-auth 라이브러리를 사용하여 facebook-connect, twitter single sign-in 등을 사용해야합니다 . 그런 다음 로그인 시스템에서 구멍을 테스트하는 전문가가 있고 일반 텍스트를 통해 암호를 전송하지 않지만 https를 사용하는 것에 감사하기 때문에 안전합니다. 나는 또한 facebook-connect 를 사용하고자하는 사용자를위한 주제에 답변했습니다 .

입력 데이터 검증

입력을 확인하려면 node-validator를 사용할 수 있습니다 .

var check = require('validator').check,
    sanitize = require('validator').sanitize

//Validate
check('test@email.com').len(6, 64).isEmail();       //Methods are chainable
check('abc').isInt();                               //Throws 'Invalid integer'
check('abc', 'Please enter a number').isInt();      //Throws 'Please enter a number'
check('abcdefghijklmnopzrtsuvqxyz').is(/^[a-z]+$/);

//Sanitize / Filter
var int = sanitize('0123').toInt();                  //123
var bool = sanitize('true').toBoolean();             //true
var str = sanitize(' \s\t\r hello \n').trim();      //'hello'
var str = sanitize('aaaaaaaaab').ltrim('a');        //'b'
var str = sanitize(large_input_str).xss();
var str = sanitize('&lt;a&gt;').entityDecode();     //'<a>'

양식 을 만드는 데 도움 이되는이 양식 라이브러리 도 있습니다.


1
@nornagon 환영합니다 :). 특히 자신의 로그인 시스템을 작성하지 마십시오. 또한 Jeff Atwood (Stackoverflow 작성자)는 이에 대해 강력히 조언합니다! => blog.stackoverflow.com/2010/04/openid-one-year-later
Alfred

10
nginx가 작동하지 않기 때문에 WebSocket을로드 밸런싱하기 위해 HAProxy를 사용할 수 있습니다. @alfred의 이미 멋진 답변에 추가되었습니다.
Shripad Krishna

5
웹 소켓을 사용하는 경우 HAProxy 설정의 예 : stackoverflow.com/questions/4360221/…
Shripad Krishna

9
좋은 대답입니다. 그래도 everyauth보다 passport.js를 강력히 권장합니다.
UpTheCreek

1
everyauth 대신 여권은 어떻습니까?
chovy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.