본문 바로가기
코니79 IT 정보

Node.js 트래픽 분산 처리 참고 정보

by 코니와함께 2018. 1. 14.
반응형

코니79 입니다.
Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있습니다.

Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크
웹브라우저에서 동작하는 자바스크립트를 이용해서 PHP나 JSP의 역할을 대체할 수 있습니다. 하나의 언어로 웹에플리케이션 전체를 구현할 수 있게 됩니다. 
웹에 대한 전체적인 이해를 선행하시면 더욱 좋습니다. 아래 수업은 웹에플리케이션을 구성하는 구체적인 기술들과 전체적인 흐름을 다루고 있습니다. 이 수업을 먼저 볼 것을 추천드립니다. 이 수업은 서버 쪽 기술로 PHP를 다룹니다만 PHP는 태생이 웹을 위한 언어이기 때문에 배우기 쉽다는 장점이 있습니다. PHP를 통해서 서버 쪽 언어에 대한 개념을 파악하신 후에 PHP를 JavaScript로 대체하는 수업인 본 수업을 보시는 것도 좋은 접근입니다. 

기본적으로 node.js는 하나의 코어만 사용을 합니다. 
그러나 트래픽이 증가하고 처리할 데이터 양이 많아 짐에 따라 코어 수 많큼 프로세스를 
띄워 처리를 분산해야 한다. 
이때 코어 수 많큼 프로세스를 띄워주는게 cluster 이다. 

위 처럼 cluster 를 구성하게 되면 세션간 데이터가 공유되지 않는 문제가 생긴다. 
이를 해결하기 위한 방법이 redis 이다. 

redis 에는 node-redis 와 ioredis 를 가장 많이 사용한다. 
ioredis 가 조금 더 최근에 나온것이며 더 많은 기능을 지원한다고 한다. 

위에 대한 정보는 검색해 보고 적절한 것을 사용하면 될것 같다. 


참고 링크 1 : http://bcho.tistory.com/1099 
참고 링크 2 : http://www.maengis.com/studio/75 
참고 링크 3 : http://rocksea.tistory.com/190 
참고 링크 4 : http://mudchobo.tistory.com/539

관련 멀티 포트 지원 샘플정보입니다.

서버 정보에 포트 여러개 설정 

manifest.json에 포트 추가

manifest.json 파일에 port는 3001번에 label은 -api-인 포트를 추가한다.

{

  "static": {

    "port": "8983",

    "labels": ["web-ui"]

  }, "rest": {

    "port": "8984",

    "labels": ["api"]

  }

}

경로와 handler간 routing을 담당하는 route.js 새로운 mapping인 apiendpoints를 추가한다. 경로는 ‘/’로 동일하지만, 하나는 getentry handler, 다른 하나는 api handler로 맵핑된다.


var handler = require('./handlers');

exports.webendpoints = [

    { method: 'GET', path: '/', config: handler.getentry },

    { method: 'GET', path: '/{filename*}', config:handler.get}];

exports.apiendpoints = [

    { method: 'GET', path: '/', config: handler.api }];

handler를 위한 handlers.js

api handler를 추가한다. client폴더의 secapi.html을 읽어서 return하는 것이다.


exports.getentry = {

    handler: {

        file: function (request) {

            return '../client/html/' + 'fistapi.html';

        }

    }

};

exports.get = {

    handler: {

        file: function (request) {

            return '../client/html/' + request.params.filename;

        }

    }

};

exports.api = {

    handler: {

        file: function (request) {

            return '../client/html/' + 'secapi.html';

        }

    }

};

서버 구동을 담당하는 fistapi.js 서버 설정과 routing 설정을 읽어 hapi 서버 object에 등록한 후 서버를 구동한다. 여기서는 connection시 label에 따라 routing을 다르게 설정하도록 하였다. 이처럼 포트와 라우팅을 쉽게 변경할 수 있다.


var Hapi = require('hapi');

var Route = require('./route');

var config = require('./manifest.json');


var server= new Hsecapi.Server();


for(var i in config){

    server.connection(config[i]);

}


server.select("web-ui").route(Route.webendpoints);

server.select("api").route(Route.apiendpoints);


server.start(function() {

    console.log('Server started');

});

테스트

client\html 폴더에 secapi.html을 만든다. 내용은 간단히 아래와 같이 작성한다.


<!DOCTYPE html>

<html>

<head lang="en">

    <meta charset="UTF-8">

    <title></title>

</head>

<body>

API TEST

</body>

</html>

server 폴더에서 node . 명령을 통해 서버를 구동하고 크롬 브라우저에서 http://127.0.0.1:8983/ 주소와 http://127.0.0.1:8984/ 주소로 접근해 본다. 8983으로 접근하면 client폴더의 fistapi.html이 읽히고, 8984로 접근하면 secapi.html이 읽힌다.



반응형

댓글0