2013년 6월 25일 화요일

[Node.js] Redis 의 hmset

Hello SyntaxHighlighter

Redis 의 hmset 사용하기

var redis = require('redis');
var client=redis.createClient(포트,호스트,null);
/*
*    MySQL을 사용하다가 Redis를 사용해보니 신세계입니다.
*/
var room={
 key1:'value1', 
 key2:'value2'
 };
//JSON 형태로 집어넣음
client.hmset('test', room);

// 'test' 키의 값중 key2는 그대로 두고 key1만 value5로 바꾸는 방법
room={
 key1:'value5'
 };
client.hmset('test', room);
client.hgetall("test",function(err,obj){
        console.log(obj.key1);
        console.log(obj.key2);
});
//value5 와 value2 가 출력됩니다.



자세히 사용방법이 적혀있는 곳이 별로 없었습니다.

그래서 처음엔 room의 value몇개를 바꾸기 위해

get으로 몽땅 값들을 가져와서 몇개만 바꾸고 다시 몽땅 set으로 집어넣었는데

아무리 생각해도 비 효율적이라 요리조리 해봤는데 저렇게 하니까 되더라구요.

그래서 지금은 value 몇개를 바꾸기 위해 전체를 가져올 필요없이

바꿀 것만 hmset으로 집어넣고 있습니다.

메모리 기반 비관계형 데이터베이스... 정말 빠릅니다 속도 차이가 확실히 느껴져요.

2013년 6월 18일 화요일

[Node.js] DB Pool ( mysql-simple-pool )

Node.js 서버가 오래 켜놓으면 꺼질 때



처음에는 노드 서버가 켜질 때 Mysql DB서버에 Connection을 맺고

계속 쿼리를 날렸었는데 , 오랫동안 서버가 켜져 있다 보니까

Connection이 끊어지면서 서버가 다운되는 현상이 있었습니다.

그래서 사전에 일정량의 Connection 객체를 만들어 모아두고,

사용이 끝난 Connection 객체를 나중에 다시 재사용 가능하도록 하는 Connection Pool을 이용해

속도도 향상시키고 서버가 다운되지도 않도록 해보았습니다.

아 , 물론 사용전에 npm install mysql-simple-pool 로 모듈을 다운 받아야 합니다.

Hello SyntaxHighlighter

Node로 mysql-simple-pool 사용하기

var Pool = require('mysql-simple-pool');
var pool= new Pool( 200,{  //최대 200 개의 연결.
 host:       "호스트주소",
 port:       "MySQL 포트. 기본 3306",
 user:       "MySQL 계정",
 password:   "MySQL 패스워드",
 database:   "접근 할 데이터베이스" 
});


//Query 날리기. write라는 테이블중 id가 data.id 인 것의 
//x,y 값을 data.x , data.y 로 바꿈.

pool.query('UPDATE `write` set x=? , y=? WHERE id=?',
[data.x, data.y , data.id], function (err,rows){
if(err!=null) console.log(err); //err있으면 출력.
});



최대 200개의 연결을 한다고 Pool을 생성 하더라도 , 실제 커넥션은 3~6개만 생기는데,

커넥션을 계속 생성 하는 것이 아니라 적은 개수를 라운드 로빈 스타일로 돌려서

처리 하는 것 같습니다.


사실 쿼리를 자주 날려야 하기 때문에, 지금은 누군가 쿼리를 한번 하면,

노드 서버에서 객체의 멤버로 저장 하고있다가

다음 사람이 쿼리를 원하면 DB에 쿼리하지 않고 변수를 바로 돌려주도록 하였습니다.

-> 지금은 또 수정되어서, Mysql에서 쿼리한 결과를 In-Memory DB 인 Redis에 넣어놓고,

또 요청할 경우 Mysql 이 아닌 Redis에서 가져다 씁니다.



언젠가 Mysql 과 Redis의 장점만이 합쳐진 DB가 나오길 바랍니다..


2013년 6월 15일 토요일

안드로이드 음성 소켓 통신 (2월 단기)



안드로이드-음성을 패킷화 하여 P2P 소켓 통신.



처음엔 TCP로 구현했었는데

서버 과부하를 줄일 수 있도록 P2P로 구현하겠노라 큰소리 쳤습니다.

P2P는 홀펀칭이 필요하며 따라서 TCP로는 어렵다는 것을 알게 되었죠.

각 단말기들이 두개의 포트 즉,
- 음성신호를 녹음해서 보내는 포트
- 음성신호를 받아 처리하는 포트
를 열어 서로가 서로의 서버-클라이언트가 되게 한다는 것이었는데

사설 아이피를 갖는 3G와 4G 환경에서 통신을 시켜주기 위해

STUN Server를 JAVA로 구현했습니다. 사실 진정한 의미의 STUN은 아니었고

말하자면 딱 홀펀칭만 해주는 서버였죠.

다른 해외 논문들에서는 UDP로 symmetric NAT 환경에서도 80~90% 까지

홀펀칭이 잘된다고 나와있지만 제가 했을 땐 그렇진 않았어요.

Cone인데도 안되는 경우가 있었는데, 지금 생각해보면 Lock을 안해줘서 그런것 같네요.

(쓰레드 4개를 돌렸는데 그때 운영체제를 배우지 않아서 세마포어의 개념이 없었음.)


아직도 설날이고 뭐고 다 바쳐서 코딩하다가 결국

4G-4G에서 홀펀칭이 성공하여 전율하며 팀원에게 뛰어갔던

그때가 잊혀지지 않아요.

//////////////////////////////////////////////////////

1.기존의 프로토콜 대신 자체 개발한 새로운 프로토콜-하얍을 사용하는 
STUN(Simple Traversal of UDP Through NAT) 
서버를 외부 라이브러리 없이 직접 구현.

2.STUN서버는 RFC-3489에 기술된 NAT탐색 알고리즘을 사용하지 않고 
바로 홀펀칭을 시도한 후 결과를
클라이언트에게 전달하여 빠른 이니시에이팅이 가능함.

3.UDP패킷 바디에 음성을 그대로 실어 보냄으로써 
딜레이를 최대한으로 줄였음.
임시 테스트(4G-4G , Wifi-Wifi) 결과로는 
현재 어떤 보이스톡 서비스보다 딜레이가 적음.

4.기존의 보이스 톡은 서버경유방식(릴레이)
서버를 통해 가기 때문에 느릴 수밖에 없고
기존의 프로토콜을 그대로 사용하기 때문에 통신사에서 
mVoip 차단 솔루션으로 해당 패킷 랜덤드랍을 
하기가 비교적 쉬움

5.홀펀칭이 실패하는 경우는 Symmetric 기법을 사용하는 NAT환경인데 
IPTime 등에 문의해본 결과 약 5년전에 이미  P2P를 지원하지 못하는
Symmetric 공유기를 모두 Cone 방식으로 교체 하여 기업이 아닌
일반인이 시중에서 Symmetric 공유기를 구매할 수는 없다고 답변.