어떡하긴 뭘 어떡해
broker를 여러개 만들어 놓아야지.
우리가 집을 내놔도 부동산 한 군데 내놓나?
아니지 않나?
몇 군데 내놓지.
집 구하러 손님이 오면, 일단 자기가 가지고 있는 매물부터 소개해주고,
손님이 맘에 안들어하면 옆 부당산 매물도 보여준다.(수수료가 반띵이라는 말이 있긴한데...)
Broker도 마찬가지다.
앞 1장 읽어 보신 분들은 알겠지만, broker도 부동산처럼 중간에서 연결해주는 역할을 한다.
하나만 있어선 불안하다.
얘가 죽으면...어떡하지
라는 걱정이 드는 것은 당연하다.
우리도 여러군데 부동산에 집을 내놓듯, broker도 여러개 등록할 수 있다.
여러개라고 해서 client가 pub 하면 broker들이 모두 반응하는 것은 아니다.
등록된 순서대로 한 놈만 반응한다.
만약 1번 broker가 반응이 없다면 그 다음 2번 broker가 그 역할을 한다.
완벽한 Active-Standby 구조다.
정말 그렇게 동작하는지 테스트해보자.
VSCode를 4개로 나누어서
# | cmd | 설명 |
---|---|---|
1 | $> mosquitto.exe -c mq_01.conf | 1번째 broker port 1883 |
2 | $> mosquitto.exe -c mq_02.conf | 2번째 broker port 2883 |
3 | $> node server.js | 1장에 있는 server.js |
4 | $> node client.js | 1장에 있는 client.js |
먼저 broker를 2 개 만들어 보자.
1번 broker
mq_01.conf
per_listener_settings false
listener 1883
allow_anonymous true
log_dest stderr
log_type all
실행
$> mosquitto.exe -c mq_01.conf
2번 broker
mq_02.conf
per_listener_settings false
listener 2883
allow_anonymous true
log_dest stderr
log_type all
실행
$> mosquitto.exe -c mq_02.conf
3번 server.js
const mqtt = require("mqtt");
const options = {
servers: [{
host: 'localhost',
port: 1883
}, {
host: 'localhost',
port: 2883
}]
};
const server = mqtt.connect(options);
server.on("connect", () => {
server.subscribe("server/login");
});
server.on("message", (topic, message) => {
var data = JSON.parse(message);
console.log('server', data);
var client_topic = 'clients/' + data.id;
if (data.pwd === 'pwd') {
var res = { msg: 'login ok' };
server.publish(client_topic, JSON.stringify(res));
} else {
var res = { msg: 'login fail' };
server.publish(client_topic, JSON.stringify(res));
}
});
4번 client.js
const mqtt = require("mqtt");
const options = {
servers: [{
host: 'localhost',
port: 1883
}, {
host: 'localhost',
port: 2883
}]
};
const client = mqtt.connect(options);
const user = { id: 'client1', pwd: 'pwd' };
client.on("connect", () => {
client.subscribe("clients/client1");
client.publish("server/login", JSON.stringify(user));
});
client.on("message", (topic, message) => {
console.log(message.toString());
client.end();
});
시나리오는 이렇다.
1. 1번, 2번에 각각 broker를 띄워놓고,
2. 3번 server.js를 실행하면 1번에 붙는다.
3. 4번 client.js를 실행하면 이것도 1번에 붙고, 3번 server.js가 반응한다.
4. 이 상태에서 1번을 Ctrl-C로 죽이면, 3번 server.js가 2번 broker에 붙는다.
5. 4번 client.js를 다시 실행하면, 2번 broker에 연결되어 3번 server.js가 반응한다.
시나리오대로 실행한 동영상이다.
PC에서 봐야 눈이 안 아플것이다.
알흠답지 아니한가~
broker를 서로 다른 cloud 에 두면 IDC에 불이 나도 서비스에는 지장이 없을 것이다.
열심히 보고 도움 많이 받아갑니다.