더북(TheBook)

전체 코드는 다음과 같습니다.

코드 6-12 Distributor 전체 코드

예제 파일 : distributor.js

'use strict'

/*
 * distributor
 */
// 접속 노드 관리 오브젝트
var map = {};

// Server 클래스 상속
class distributor extends require('./server.js') {
    constructor() {
        super("distributor", 9000, ["POST/distributes", "GET/distributes"]);
    }

    // 노드 접속 이벤트 처리
    onCreate(socket) {
        console.log("onCreate", socket.remoteAddress, socket.remotePort);
        this.sendInfo(socket);
    }

    // 노드 접속 해제 이벤트 처리
    onClose(socket) {
        var key = socket.remoteAddress + ":" + socket.remotePort;   
        console.log("onClose", socket.remoteAddress, socket.remotePort);
        delete map[key];
        this.sendInfo();
    }

    // 노드 등록 처리
    onRead(socket, json) {
        var key = socket.remoteAddress + ":" + socket.remotePort;   
        console.log("onRead", socket.remoteAddress, socket.remotePort, json);
        
        if (json.uri == "/distributes" && json.method == "POST") {
            map[key] = {
                socket: socket
            };
            map[key].info = json.params;
            map[key].info.host = socket.remoteAddress;          
            this.sendInfo();
        }
    }
    
    // 패킷 전송
    write(socket, packet) {
        socket.write(JSON.stringify(packet) + '¶');
    }

    // 접속 노드 혹은 특정 소켓에 접속 노드 정보 전파
    sendInfo(socket) {
        var packet = {
            uri: "/distributes",
            method: "GET",
            key: 0,
            params: []
        };

        for (var n in map) {
            packet.params.push(map[n].info);
        }

        if (socket) {
            this.write(socket, packet);
        }
        else {
            for (var n in map) {
                this.write(map[n].socket, packet);
            }
        }
    }
}

// distributor 객체 생성
new distributor();

분산 아키텍처의 핵심적인 역할을 수행하는 Distributor를 구현했습니다. 이제 Distributor와 연동되는 상품 관리, 회원 관리, 구매 관리 마이크로서비스를 구현하겠습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.