MQTT로 카톡서버 만들어보자 - 8/10. IDC에 불이 났어요

빙고리우스·2024년 4월 9일
post-thumbnail

broker가 죽으면 어떡해?

어떡하긴 뭘 어떡해

broker를 여러개 만들어 놓아야지.

우리가 집을 내놔도 부동산 한 군데 내놓나?
아니지 않나?
몇 군데 내놓지.
집 구하러 손님이 오면, 일단 자기가 가지고 있는 매물부터 소개해주고,
손님이 맘에 안들어하면 옆 부당산 매물도 보여준다.(수수료가 반띵이라는 말이 있긴한데...)

Broker도 마찬가지다.
앞 1장 읽어 보신 분들은 알겠지만, broker도 부동산처럼 중간에서 연결해주는 역할을 한다.

하나만 있어선 불안하다.

얘가 죽으면...어떡하지

라는 걱정이 드는 것은 당연하다.

우리도 여러군데 부동산에 집을 내놓듯, broker도 여러개 등록할 수 있다.

여러개라고 해서 client가 pub 하면 broker들이 모두 반응하는 것은 아니다.
등록된 순서대로 한 놈만 반응한다.
만약 1번 broker가 반응이 없다면 그 다음 2번 broker가 그 역할을 한다.

완벽한 Active-Standby 구조다.

정말 그렇게 동작하는지 테스트해보자.

VSCode를 4개로 나누어서

#cmd설명
1$> mosquitto.exe -c mq_01.conf1번째 broker port 1883
2$> mosquitto.exe -c mq_02.conf2번째 broker port 2883
3$> node server.js1장에 있는 server.js
4$> node client.js1장에 있는 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에서 봐야 눈이 안 아플것이다.

알흠답지 아니한가~

그래서 IDC에 불이 나면?

broker를 서로 다른 cloud 에 두면 IDC에 불이 나도 서비스에는 지장이 없을 것이다.

profile
다할줄아는 사람보다 뭔가 한가지 똑부러지게하는 사람이되자.

2개의 댓글

comment-user-thumbnail
2024년 4월 9일

열심히 보고 도움 많이 받아갑니다.

1개의 답글