2017-10-18 2 views
0

내가 NodeJS 6 데비안 8을 실행하는거야, 그리고 IBM 왓슨의 IoT 플랫폼 주위 재생에 NodeJS 연결 개체를 유지 : https://github.com/ibm-watson-iot/iot-nodejs공유 데이터베이스/메모리

나는 IBM에서 게이트웨이를 만든 및 수

var gatewayClient = new iotf.IotfGateway(config); 

gatewayClient.connect(); 

gatewayClient.on('connect', function(){ 
    gatewayClient.publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}'); 

}); 

config에 내 고유 게이트웨이에 관한 고유 한 정보가 포함되어 있습니다.

다른 NodeJS 인스턴스에서이 gatewayClient을 재사용 할 수 있기를 바란다. 그래서 나는 다음 (의사 코드) 같은 것을 생각하고 :

var gatewayClient = new iotf.IotfGateway(config); 
gatewayClient.connect(); 

sharedDatabase-perhaps-Redis[unique-gatewayClient-ID].push(gatewayClient); 

을 그리고 동일한 서버에있는 모든 NodeJS에서 나는 호출 할 수 있습니다

sharedDatabase-perhaps-Redis[unique-gatewayClient-ID].publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}'); 

내가 그것을 이해가 좋겠지 만 나는 그것이 저장 가능하고 어떻게, 그리고 레디 스가 해결책이나 다른 데이터베이스와 같은 것이 될 수 있다면 약간 혼란 스럽다.

전체 아이디어는 연결을 지속/지속성으로 유지하고 새로운 NodeJS 인스턴스의 클라이언트가 새 연결을 만들지 않고 데이터를 통해 데이터를 밀어 넣을 수 있도록하는 것입니다.

답변

1

네트워크 연결은 직렬화 할 수 없으며 프로세스간에 쉽게 공유 할 수 없습니다.

대신 IBM 백엔드와의 연결을 유지하는 단일 "마스터"프로세스를 만드는 것을 고려해야하며 클라이언트는 IBM이 아닌이 마스터와 직접 통신합니다 (IoT 목적을 위해 일반적인 통신 방법이 사용됩니다). MQTT).

또 하나의 단일 프로세스에서 별도의 Node.js 프로세스에서 실행되는 코드를 실행하지 못하게 할 수 있습니까? 그것은 각각의 부분이 직접 연결을 사용할 수 있기 때문에 문제도 해결할 것입니다.

나는 이미 클라이언트 메시지를 허용하는 단일 서버 프로세스가 있으며이 메시지를 IBM 백 엔드에 릴레이해야합니다. 고유 한 각 클라이언트에 대해 백엔드에 대한 새 연결을 만들거나 이전에 만든 연결을 다시 사용하려고합니다.

당신은 이런 일 (간결에 대한 원천 징수 오류 처리)를 사용할 수 있습니다

// Function to get the connection for a particular client id, 
// or, if one doesn't exist yet, create a new one. 

let clients = {}; 
function connectionForClient(uniqueGatewayClientID) { 
    // Check if we already have a connection for this client. 
    if (! clients[uniqueGatewayClientID]) 

    // No, create a new one, represented by a promise. 
    clients[uniqueGatewayClientID] = new Promise(function(resolve) { 
     let client = new iotf.IotfGateway(config); 

     client.connect(); 

     client.on('connect', function() { 
     resolve(client); 
     }); 
    }); 

    } 
    return clients[uniqueGatewayClientID]; 
} 

사용하려면

connectionForClient(uniqueGatewayClientID).then(function(client) { 
    client.publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}'); 
}); 
+0

를 내 장치가 듣고 Express를 사용하여 내 NodeJS 응용 프로그램에 JSON 데이터를 게시 한 이 데이터는 게이. 웨이 연결을 통해 IBM에 게시되어야하며, 게이트웨이 연결이 설정 될 수도 있고 설정되지 않을 수도 있습니다. 그것이 확립 되었다면 사용되어야한다. 그렇지 않다면 다른 사람들이 미래에 그것을 재사용 할 수 있도록 설립되어야한다. –

+0

아, 이제는 무슨 뜻인지 알 것 같습니다. 고유 한 클라이언트마다 새로운 연결을 만들어야합니다. 잠깐 그 점을 생각해 봅시다. – robertklep

+0

좋아, 이제는 내가 IBM 게이트웨이 클라이언트를 저장하는 익스프레스 외부의 어레이를 단순히 만들었다는 증거를 만들었다 고 생각한다. 그런 다음 HTTP POST를받을 때 isConnected를 확인하십시오. 이것은 트릭으로 인한 것 같지만, 서버 간 (향후) 확장은 어려울 수 있습니다 ... –