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

빙고리우스·2024년 4월 9일
3
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개의 답글