socket.io에서 하트비트(heartbeat) 설정하기

socket.io를 사용하면서 클라이언트 연결상태 확인을 위해 connect/disconnect 체크가 필요했습니다.

네트워크가 끊여지면 disconnect 이벤트가 와야하는데 disconnect 이벤트 응답이 네트워크가 끊어진 시간보다

꽤 늦게 도착하여 처리에 문제가 있었고, 원인을 분석하다보니 연결상태 확인을 위한 heartbeat 때문이었습니다.


socket.io에 대해서 정확히 알지는 못하지만 알고있는 범위내에서 설명을 드리면..


socket.io에서 heartbeat 관련하여 설정하는 것이 heartbeat timeoutheartbeat interval 2가지 있습니다. 

두 설정값에 대한 설명을 공식문서에는 못찾았고, stackoverflow에서 찾았습니다.


As far as I can tell, there are 2 values that matter here: the server sends heartbeats to the client every heartbeat interval seconds; the client responds directly, if there is no response, the server decides the client is dead. The client waits for a heartbeat from the server for heartbeat timeout seconds since the last heartbeat (which should obviously be higher than the heartbeat interval). If it hasn't received word from the server in heartbeat timeout seconds, it assumes the server is dead (and will start disconnecting / reconnecting based on the other options you have set. 


 Default values are heartbeat interval = 25s and heartbeat timeout = 60s. Both items are set on the server, the heartbeat timeout is sent to the client upon connecting.

아주 짧은 영어로 살짝 보면(제대로 이해했는지는 모르겠지만..ㅠ), 

서버는 heartbeat interval 초 간격으로 클라이언트에게 heartbeat를 전송하고 클라이언트가 응답하지 않으면 서버는 클라이언트가 죽은 것으로 판단합니다.

클라이언트는 마지막 heartbeat를 전송받고 heartbeat timeout 시간동안 서버로부터 heartbeat가 오기를 기다립니다. heartbeat timeout 시간 동안 서버로부터 heartbeat를 전송받지 못하면 서버가 죽은 것으로 판단하고 접속종료와 재접속 흐름을 진행합니다. 기본값으로 heartbeat interval은 25초, heartbeat timeout은 60초로 설정되어 있습니다.


heartbeat interval과 heartbeat timeout 설정은 아래 처럼 하면 됩니다. 단위는 밀리초(ms) 입니다.

io.set('heartbeat timeout', 15000);
io.set('heartbeat interval', 8000);

이렇게 설정하는 방식은 아마도 0.9 버전 이전까지 사용했던 방식으로 보입니다.

1.0 버전부터는 다른 방법으로 설정하며 하위 호환성을 위해 기존 방식도 사용할 수 있습니다.

var server = app.listen(80);
io = socketio(server,{'pingInterval': 45000});

그리고 1.0 버전 부터는 heartbeat timeout 의 이름이 pingTimeout으로, heartbeat interval이 pingInterval로 이름이 변경되었지만 하위 버전 호환을 위해 기존 이름도 사용할 수 있습니다. 

socket.io 쪽 코드를 살펴보면 아래와 같은 코드가 있습니다.

/**
 * Old settings for backwards compatibility
 */

var oldSettings = {
  "transports": "transports",
  "heartbeat timeout": "pingTimeout",
  "heartbeat interval": "pingInterval",
  "destroy buffer size": "maxHttpBufferSize"
};

socket.io 쪽 코드를 보면 default 값이 지정되는 부분도 있습니다.

/**
 * Server constructor.
 *
 * @param {Object} options
 * @api public
 */

function Server(opts){
  if (!(this instanceof Server)) {
    return new Server(opts);
  }

  this.clients = {};
  this.clientsCount = 0;

  opts = opts || {};
  this.pingTimeout = opts.pingTimeout || 60000;
  this.pingInterval = opts.pingInterval || 25000;
  this.upgradeTimeout = opts.upgradeTimeout || 10000;
  this.maxHttpBufferSize = opts.maxHttpBufferSize || 10E7;
  this.transports = opts.transports || Object.keys(transports);
  this.allowUpgrades = false !== opts.allowUpgrades;
  this.allowRequest = opts.allowRequest;
  this.cookie = false !== opts.cookie ? (opts.cookie || 'io') : false;

  // initialize websocket server
  if (~this.transports.indexOf('websocket')) {
    this.ws = new WebSocketServer({ noServer: true, clientTracking: false });
  }
}

socket.io는 아주 조금씩만 보고 있는 상태이기에 잘못된 내용이나 더 좋은 해결방법이 있을 수 있습니다.

잘못된 부분이나 더 좋은 방법을 알려주세요ㅠ

NGUI를 사용할때 iOS/Android에서 이미지 선명하게

Unity에서 UI 작업시 NGUI를 많이 사용하는데,

아무생각없이 작업후 iOS나 Android로 올려보면 이미지가 흐려보이거나, 

깨져보이거나, 암튼 선명하게 보이지 않는 현상이 나타날 수 있습니다.


여러가지 이유가 있겠지만, 가장 먼저 확인해봐야 할 부분은 Unity의 Quality 설정 부분입니다.


Edit->Project Setting->Quality 를 선택하면 각 환경에서 사용할 값을 지정하게 되는데,

별도 조작을 하지 않은 상태이면 Default로 Fastest에 푸른색 체크 표시가 되어있을 것입니다.


기본값이 Texture Quality의 값이 Half Res로 지정되어 있기 때문에 Texture가 선명하게 보이지 않으며,

당연히 NGUI에서 사용하는 이미지 리소스들도 선명하게 보이지 않습니다.


Default 부분의 화살표를 선택하면 어떤 값을 사용할 것인지를 지정할 수 있으니 Full Res를 사용하는

설정값으로 알맞게 지정해 주면 됩니다.





Javascript에 관한 정리.

Javascript를 조금씩 사용하고 있는데, 쓰면 쓸수록 어려운 언어같은 느낌이 듭니다.

책이나 다른 블로그를 보면서 찾아본 내용을 조금씩 정리합니다.


==와 === 연산자의 올바른 사용.

==와 === 연산자는 비교하는 연산자이지만, 사용법이 약간 다릅니다.


1. == 연산자는 인자들이 서로 다른 데이터형일때, 일련의 혼동스러운 암묵적인 강제 형변환을 적용시키니다.

2. === 연산자는 비교가 어떠한 암묵적인 강제 형변환과도 연관이 없이 이루어지게 합니다.

3. 비교할 값이 서로 다른 데이터형이라면 프로그램의 동작을 더 명백히 하기 위해 직접 명시적인 강제 형변환을 사용해야 합니다.

(출처 : Effective Javascript Item5)


JS에는 강제 형변환 규칙을 가지고 있기 때문에 이와 같은 사항에 대해서 알고 사용해야할것 같습니다.


변수 스코프의 결정

다른 언어에서는 블록 단위의 스코프를 사용하여 변수를 선언할 수 있지만,

JS에서는 블록으로 스코프를 정하는 것이 아니라 자신을 포함하는 함수에 의해서 정의된다.


JS 변수 선언은 선언과 할당으로 나누어서 처리된다. 암묵적으로 둘러싼 함수의 맨 윗부분으로 선언을 끌어올리고, 할당 부분은 그 자리에 그대로 둔다.  즉, 동일한 함수 내에서 같은 변수를 여러번 정의하는 것은 허용되지 않는다. 변수는 한번만 정의되며, 할당을 여러번 하게 되는것이다.


이러한 규칙에서 예외로, exception에서는 블록 스코프를 지원하여 exception을 잡아 변수로 바인딩하고 이 변수는 catch 블록 안에서만 스코프가 적용된다.

(출처 : Effective Javascript Item12)


brew를 사용하여 버전 switch

mac은 homeBrew라는게 있어서 라이브러리 설치가 무척 쉽다.

최근 Node.js를 사용함에 있어, 최신 버전이 아닌 old 버전을 써야하는데 어떻게 변경할지를 구글링..


그런데 이것이 아직 손에 안익었는데.. 반복적으로 찾게되어 간단하게 정리함.


1. cd /usr/local


2. brew versions nodejs

이렇게 하면 nodejs의 버전별 정보를 출력해줌

0.8.16   git checkout 8aeaf15 Library/Formula/node.rb

0.8.15   git checkout fc6441e Library/Formula/node.rb

0.8.14   git checkout 11b5459 Library/Formula/node.rb


3. 여기서 원하는 버전을 git check out!

ex) git checkout fc6441e Library/Formula/node.rb


4. 다른 버전이 이미 설치되어있다면 링크를 끊어줘야함.

brew unlink nodejs


5. 설치된 버전으로 switch

brew switch nodejs 0.8.1


자세한 설명은 stackoverflow를 보는것이 더 좋을듯하여 생략.


출처 : http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula


2013년 끝, 2014년 시작!

2014이 시작되었다.

거대한 욕심으로 세워진 계획은 잘 지켜지지 않음을 깨달았기에,

올해에도 작지만 꼭 해보고 싶은 계획 몇가지를 정했다.


그전에 2013년을 돌아보자면..

  • 블로그의 글을 고작 7개밖에 적지 않았다. 공부하고 파악한거 조금씩이라도 정리해놔야하는데 잘 정리된 정보를 전달하고 싶다는 과욕이 부른 참사다. 스스로 관심을 가질수 있도록 작은거라도 꾸준히 적어야 할것 같다.
  • 일에 대한 의욕을 제대로 제어하지 못해서 나 자신을 비롯한 주변 사람들을 피곤하게 만들어서 안타깝다. 내가 조금만 더 적극적으로 대처하고 해결책을 찾아나섰다면 극단적인 사태를 만들지 않았을텐데.. 힘든 상황을 만들어서 안타깝고 미안하다.
  • 이직으로 이것저것 일을 하게되었지만, 생각만큼 성과가 안나와서 씁쓸.. 거대함을 꿈꿨지만, 하나씩 차근차근 쌓아올라가야 할때이다. 무수히 많은 계단을 올라야 할듯.
  • 나 자신의 발전도 블로그의 글 개수 만큼이나 더뎠고, 힘겨웠다. 고민이 많았고, 실행이 많았지만, 결과를 제대로 추출하지 못함이 여전히 아쉽다.
음.. 대체적으로.. 불만 사항들만 가득하다. 뭐, 따져보면 좋은 일도 몇몇 있었지만, 좋은일은 좋은일대로 기억하고, 특별히 안좋았던 사항들을 기록해서 좀더 잘 나아가보자.

이제 시작되는 2014년에는
  • 작게나마 결과물을 만들어서 보람을 느껴보고 싶다.
  • 별것 아닌 내용들로라도 블로그에 글을 지속적으로 작성하고 싶다.
  • 꾸준함이라는 식상한 단어를 몸이 습득하게 노력하고 싶다.
  • 잘..하고싶다. 지금의 실력보다 훨씬 더 잘하고싶다ㅠ


'일상' 카테고리의 다른 글

습관 만들기  (0) 2013.04.06
2010년 내가 한일 정리  (0) 2010.12.30
제대로 공부해야하는데..  (0) 2010.06.02