2016년 12월 10일 토요일

socketcluster tutorial - 3. 기본 사용법 (Basic usage)

기본 사용법

본 튜토리얼을 진행하기 전에 '시작하기'를 읽어 보아야 합니다.

일단 SocketCluster를 설정하면 server.js라는 JavaScript 파일이 만들어집니다.
// Server code
var SocketCluster = require('socketcluster').SocketCluster;
var socketCluster = new SocketCluster({
  workers: 1,
  brokers: 1,
  port: 8000,
  appName: 'app',
  // 주요 성능 향상을 위해 wsEngine을 'uws'로 전환하세요.
  wsEngine: 'ws',
  workerController: __dirname + '/worker.js',
  brokerController: __dirname + '/broker.js',
  socketChannelLimit: 1000,
  rebootWorkerOnCrash: true
});
이러한 옵션 중 일부를 이해하려면 SocketCluster가 서버에서 3가지 다른 종류의 프로세스 클러스터로 실행되는 것을 고려해야합니다.

마스터 프로세스 (server.js)


모든 것이 시작되는 곳입니다.

Workers


이것은 모든 비즈니스 로직이 있어야하는 곳입니다 - workerController는 실시간 소켓 연결 및 이벤트를 처리하기 위해 HTTP 서버 및 실시간 SocketClusterServer에 대한 로직을 설정할 수 있습니다.

Brokers


이것은 주로 SocketCluster 내부적에서 사용하며 모든 작업자가 서로 효율적으로 이벤트를 공유 할 수 있게합니다. 또한 이 데이터를 사용하여 세션 데이터를 저장하고 여러 대의 컴퓨터에서 수평적으로 응용 프로그램을 확장 할 수도 있습니다.

보일러플레이트 앱


workerController 파일 (worker.js)을 열면 httpServer와 scServer가 요청/연결을 수락하는 코드가 보입니다. 기본적으로 httpServer는 public/folder의 내용을 제공하는 Express(정적 서버 미들웨어 포함) 모듈에 연결됩니다:
// Server code
app.use(serveStatic(__dirname + '/public'));
httpServer.on('req', app);
보일러플레이트 앱에선 scServer는 들어오는 WebSocket 연결을 처리하고 클라이언트 소켓에서 사용자 정의 'ping'이벤트를 수신합니다 (다른 것들 중에서도):
// Server code
var count = 0;
scServer.on('connection', function (socket) {
  // ...
  socket.on('ping', function (data) {
    count++;
    console.log('PING', data);
    scServer.exchange.publish('pong', count);
  });
});

여기에서 'ping'이벤트는 클라이언트 소켓이 다음을 사용하여 클라이언트에서 ping을 내보낼 때마다 트리거됩니다.
// Client code
socket.emit('ping', 'This is a PING message')
이벤트를 보내는 것은 클라이언트와 서버간에 메시지를 전달하는 가장 간단한 방법이지만 메시지를 공유하는 유일한 방법은 아닙니다.

이 목록의 예약된 이벤트 이름을 제외하고 원하는대로 이벤트의 이름을 지정할 수 있습니다. 이는 SC 내에서 특별한 의미가 있습니다. 시스템에 많은 이벤트가있는 경우, 이벤트 이름을 지정하는 좋은 규칙은 '.'기호를 사용하는 것입니다. 형식은 'myNamespace.myEvent'입니다.

채널에 데이터를 발행할 수도 있습니다. 채널에 발행하면 한 번에 여러 클라이언트에 데이터를 보낼 수 있습니다. 채널에 등록된 클라이언트는 해당 채널에 발행한 모든 데이터를 수신합니다. 클라이언트와 서버 모두 채널에 발행할 수 있습니다 (미들웨어로 인해 채널이 차단되지 않는 경우). 채널은 주로 클라이언트와 클라이언트 간의 통신을 위한 것이지만 SC는 서버의 채널을 청취하는 방법을 제공합니다 (이 주제는 다른 튜토리얼에서 더 자세한 내용을 다룹니다).

위의 서버 측 코드 조각 하나는 다음과 같이 'pong'채널에 발행하고 있습니다.

// Server code
scServer.exchange.publish('pong', count);
SocketCluster에 연결되어 있고 'pong'채널을 구독하고 있는 클라이언트는 count 변수의 값을 받습니다. 클라이언트에서 코드는 다음과 같습니다.
// Client code
// New API as of SocketCluster v1.0.0.
var pongChannel = socket.subscribe('pong');
pongChannel.watch(function (count) {
  console.log('Client received data from pong channel:', count);
});
하나 이상의 채널을 구독 취소하려면 다음 단계를 따릅니다:
// Client code
socket.unsubscribe('pong');
앞서 설명한 것처럼 scServer.exchange.publish (...)를 사용하여 서버에서 채널에 발행할 수 있습니다. 편의를 위해 SocketCluster를 사용하면 클라이언트측에서 채널에 발행할 수도 있습니다:
// Client code
socket.publish('pong', 'This PONG event comes from a client');
여기서 문자열을 인수로 전달합니다. 채널 개체에 직접 데이터를 발행할 수도 있습니다. 다음 코드는 위와 똑같은 작업을 수행합니다:
// Client code
pongChannel.publish('This PONG event comes from a client');
때로는 특정 개인의 특정 채널에 대한 읽기 또는 쓰기 권한을 제한할 수 있습니다. 이러한 목적으로 SC를 사용하려면 미들웨어 기능을 활용하세요. 이에 대해 자세히 알아 보려면 "미들웨어와 권한" 가이드를 읽어보세요.

요약


socket.emit (event, data) 함수를 사용하면 클라이언트 소켓 1 개와 일치하는 서버 소켓 1 개 (클라이언트 소켓 1 개⇄서버 소켓 1 개—클라이언트와 서버간 1대1 통신)간에 메시지를 보낼 수 있습니다.

socket.publish (event, data) 및 channel.publish (data) 함수를 사용하면 여러 클라이언트 소켓 (n 개의 클라이언트 소켓 ⇄ n 클라이언트 소켓 - 클라이언트 간의 직접 통신)을 통해 그룹 메시지를 보낼 수 있습니다. 앞에서 설명한 것처럼 교환 객체를 사용하여 서버에서 발행을 호출 할 수도 있습니다.
// Server code
scServer.exchange.publish('foo', 123);
두 클라이언트 사이의 일대일 통신을 위해 게시를 사용할 수도 있지만 두개의 승인된 클라이언트만 동일한 채널을 공유할 수 있도록 특정 미들웨어를 설정해야합니다. 자세한 내용은 "미들웨어와 권한" 가이드를 참조하십시오.

비디오 Nick Kotenberg


007 Socketcluster Server/Client Communication Basic
008 Server/Client Data 1
009 Server/Client Data 2
010 Databases and SC 101
011 Server to Server Communication