기본 콘텐츠로 건너뛰기

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

이 블로그의 인기 게시물

Mac 주의 - 약간 빡치는 git 대소문자 변환 파일명 변환(renaming)하는 법

Mac에서 종종 화나는 일 중 하나가 파일 시스템이 대소문자를 구분하지 않는 점이다.
가령, A.png를 a.png로 바꿔야할 경우 HFS 기준으론 전혀 바뀐 점이 없는 걸로 인식하는데 다소 화가난다.
하지만, 방법이 없는 것은 아닌데

A.png를 임의의 다른 파일로 바꾼다. (ex. A_.png)1에서 바꾼 상태에서 staging 한다. (git add A_.png)1의 파일을 다시 원래 바꾸려고 했던 파일로 바꾼다. (mv A_.png a.png)3을 다시 staging 한다. (git add a.png)commit 한다.https://stackoverflow.com/a/40307511/880991 에서 답변해준 Chris Barr 님에게 감사를.
* 추가

실제로 해보니 git mv --force A.png a.png 가 더 간단하다. 이는 바로 staging 영역에 add까지 해준다.

즐거운 Online Prototyping Tool 들

jsbin, codepen, jsfiddle 이런 것들은 일단 생략. 너무 유명한 것들이라.

https://launchpad.graphql.com - node.js 기반 graphQL 연습장. 이것만으로도 충분히 훌륭한 백엔드
https://codesandbox.io/ npm 사용이 가능한 클라이언트 사이드 연습장. webpackbin이 너무 문제가 많아서 찾아본 것.

https://scrimba.com 이건 codesandbox+ asciinema(https://asciinema.org/) 같은 느낌인데 키 녹화와 음성 녹화 기능이 추가되었다. 다 좋은데 화살표 키로 빨리감기 뒤로감기 기능이 안되고 익스포트(youtube등)으로 지원이 없는게 아쉽다.

이 둘이 만나면? https://codesandbox.io/s/jvlrl98xw3?from-embed
뭐야 이거 무서워 하지마 ㄷㄷ;  graphql+react-native-web(부왘ㅋㅋ)

https://repl.it/languages 전통을 자랑하는 REPL 도구. 지원 언어 종류가 -_-;;;;;

https://tio.run/# repl.it? 장난함? 얘는 지원 언어가 무려 386종류. J랑 아희도 있다.

https://play.golang.org/ 즐거운 go playground. 소스 포멧팅 넘 좋아.

http://decaffeinate-project.org/repl/ 최고의 coffeescript REPL. 원래 용도는 coffee를 ecma6코드로 바꾸는 것이지만...

https://scaphold.io
https://www.graph.cool/ graphql backend service. scaphold.io는 설치도 필요없는 클라우드. graphcool은 호스팅+클라우드 다있음. 둘 다 막상막하. 푸쉬서버도 되고 뭐 미친득.

https://glitch.com/ gomix에서 결국 glitch로 안착.  node.js

https://www.shadertoy.com 잘하고 싶다! 쉐이다! 오디오도 된다!

http:/…

graphql 연습 /w launchpad

https://launchpad.graphql.com/mw9wkzv99
단순 전체쿼리+조건쿼리+추가

http://graphql.org/graphql-js/passing-arguments/
참고. random ID는 crypto 1.0.1 사용
  type Query {
    Members: [member]
    getMember(id: ID!): member
  }
  type member {
    id: ID!
    text: String
  }
  input memberInput {
    text: String
  }
  type Mutation {
    addMember(member: memberInput): member
  } SQL 정의. facebook 쪽은 스트링에 지지는 거 진짜 좋아하네. *.gql 파일이 있다고 하니 이해해주자.
resolver는 var buffer = [];
const resolvers = {
  Query: {
    Members: (root, args, context) => {
      return buffer;
    },
    getMember: (id)=> {
      return buffer.find(o=>o.id)
    }
  },
  Mutation: {
    addMember(_, {member}) {
      const mm = { ...member, id:randomBytes(10).toString('hex') };
      buffer.push(mm);
      return mm;
    }
  }
}; 평범 평범.
https://dev-blog.apollodata.com/tutorial-graphql-subscriptions-server-side-e51c32dc2951 다음으로 pub/sub 연습.
https://launchpad.graphql.com/xvn94n3ql   type Subscription {
    memberAdded: member
  } member가 added되는 순간을 감시. imp…