Scale out : 접속한 서버의 대수를 늘려 처리 능력 향상 시키는 것
: 서버의 수를 늘림. 복수의 서버를 구축해 Scale out
- 수평 확장(horizontal scaling)
- 공유 자원에 대해 고려해야 한다.
Scale up: 서버 자체를 증강
: 인스턴스를 더 좋은 인스턴스로 변경.
- 수직 확장(vertical scaling)
- 비용 부담이 크다.
- e.g) EC2를 사용하다가 더 성능좋은것으로 이관하는 것.
c.f) 일반적으로 클라우드환경에서 Auto scaling 한다는 것은 트래픽에 따라 scale out / in 한다는 의미로 쓰인다.
Adapter: Redis
: Redis가 어댑터로써 서버간 브로커 역할을 수행한다.
- 소켓서버의 특정 Room에 메시지를 보내면, Redis는 브로커가 되고 각 서버들에게 전달된다.
- 여러 서버가 redis로 연결될 때 채널 개념이 발생하고 이 채널 정보는 socket server에서 들고 있는다. 각 socket server는 메시지를 받으면 서버에서 구독하고 있는 채널에 메시지가 해당하는지를 찾고 맞으면 메시지를 해당 Room에 준다.
- Pub/Sub 매커니즘이 있다. 각 socket server는 n개의 채널을 subscribe할 수 있다.
- Adapter 역할
- 일종의 cluster처럼 연결된 각 서버에 broadcast
- routing message의 역할을 수행하는 Interface
Redis Adapter code example
1
2
3
4
5
6
7
8
9
const redisAdapter = require('socket.io-redis');
const io = require('socket.io');
socketServer = io(baseServer)
.adapter(redisAdapter({
host: 'redis',
port: 6379 // default port
}));
Code level example
1
2
3
4
5
6
7
8
9
const redis = require('redis');
// default port 6379
const client = redis.createClient({ host: 'redis', port: 6379 });
// Unhandled Error를 방지하기 위해 아래 error 이벤트에 대한 핸들링을 꼭 해야한다.
client.on('error', (error: any) => {
debug(error);
});
1
2
3
4
5
6
7
client.hset(hash, key, val, (err, res) => {
console.log(res); // 1 or 0
}
client.hget(hash, key, (err, res) => {
console.log(res); // value
}
- Promisify: 위 코드를 깔끔하게 Promise로 이용하기 위해 아래와 같이 구현(이와 같이 여러 method 구현해 놓고 필요에 따라 사용)
1 2 3 4 5 6 7
public set(hash: string, key: string, value: string) { return new Promise((resolve) => { client.hset(hash, key, value, (err, result) => { resolve(reply); }) }) }
Reference)
https://socket.io/docs/v3
https://socket.io/docs/v3/using-multiple-nodes/
Redis 로컬 설치: https://redis.io/topics/quickstart