>  기사  >  웹 프론트엔드  >  클러스터 공유 메모리를 만드는 방법은 무엇입니까?

클러스터 공유 메모리를 만드는 방법은 무엇입니까?

php中世界最好的语言
php中世界最好的语言원래의
2018-04-16 13:34:361387검색

이번에는 클러스터 공유 메모리를 만드는 방법과 클러스터 공유 메모리를 만드는 주의 사항을 소개하겠습니다. 다음은 실제 사례입니다.

Node.js의 표준 API는 프로세스 공유 메모리를 제공하지 않습니다. 그러나 IPC 인터페이스의 전송 방법과 메시지 이벤트 모니터링을 통해 여러 프로세스 간의 협업 메커니즘을 구현하여 통신을 통해 공유 메모리를 운영할 수 있습니다.

##IPC 기본 사용법:

// worker进程 发送消息
process.send(‘读取共享内存');
 
// master进程 接收消息 -> 处理 -> 发送回信
cluster.on('online', function (worker) {
   // 有worker进程建立,即开始监听message事件
   worker.on(‘message', function(data) {
     // 处理来自worker的请求
     // 回传结果
     worker.send(‘result')
   });
});

Node.js에서는 send 및 on('message', 콜백으로 구현된 IPC 통신은 몇 가지 특징을 가지고 있습니다. 우선 마스터와 워커는 서로 통신이 가능하지만 워커는 직접적으로 통신할 수는 없지만 마스터 포워딩을 통해 워커는 간접적으로 통신할 수 있다. 또한 send 메소드를 통해 전달된 데이터는 JSON.stringify로 처리된 후 전달됩니다. 따라서 Buffer 객체는 전달된 후 배열이 되지만 함수를 직접 전달할 수는 없습니다. 반면, 버퍼와 함수를 제외한 모든 데이터 유형은 직접 전송할 수 있습니다(이미 매우 강력하며 버퍼와 함수도 대체 방법을 사용하여 전송할 수 있습니다).

위의 특성을 바탕으로 IPC를 통해 메모리를 공유하는 솔루션을 설계할 수 있습니다.

1. 작업자 프로세스는 공유 메모리의 사용자로서 공유 메모리를 직접 운영하지 않고, 쓰기(set) 또는 읽기(get) 작업을 수행하도록 send 메소드를 통해 마스터 프로세스에 알립니다.

2. 마스터 프로세스는 Object 객체를 공유 메모리로 초기화하고, Worker가 보낸 메시지에 따라 Object의 키 값을 읽고 씁니다.

3. 크로스 프로세스 통신을 사용하므로 작업자가 시작한 설정 및 가져오기는 비동기 작업입니다. 마스터는 요청에 따라 실제 읽기 및 쓰기 작업을 수행한 후 그 결과를 작업자에게 반환합니다(즉, 결과를 보냅니다. 작업자에게 데이터 제공)

##데이터 형식

프로세스 간 비동기 읽기 및 쓰기 기능을 구현하기 위해서는 통신 데이터의 형식을 표준화해야 합니다.

첫 번째는 작업자의 요청 데이터입니다:

requestMessage = {
  isSharedMemoryMessage: true, // 表示这是一次共享内存的操作通信
  method: ‘set', // or ‘get' 操作的方法
  id: cluster.worker.id, // 发起操作的进程(在一些特殊场景下,用于保证master可以回信)
  uuid: uuid, // 此次操作的(用于注册/调用回调函数)
  key: key, // 要操作的键
  value: value // 键对应的值(写入)
}

데이터를 받은 후 마스터는 메소드에 따라 해당 작업을 수행한 후 requestMessage.id에 따라 해당 작업자에게 결과 데이터를 보냅니다.

responseMessage = {
  isSharedMemoryMessage: true, // 标记这是一次共享内存通信
  uuid: requestMessage.uuid, // 此次操作的唯一标示
  value: value // 返回值。get操作为key对应的值,set操作为成功或失败
}

데이터 형식 표준화의 의의는 마스터가 요청을 받은 후 처리 결과를 해당 작업자에게 보낼 수 있고, 작업자가 반환된 결과를 받은 후 통신에 해당하는 콜백을 호출하여 협업을 달성할 수 있다는 것입니다.

데이터 형식을 표준화한 후, 다음으로 해야 할 일은 통신을 모니터링하고 통신 데이터를 처리하여 공유 메모리 기능을 구현하는 마스터 프로세스와 작업자 프로세스에 대해 각각 두 개의 코드 세트를 설계하는 것입니다.

##사용자 클래스

User 클래스의 인스턴스는 작업자 프로세스에서 작동하며 공유 메모리 작동 요청을 보내고 마스터의 응답을 수신하는 일을 담당합니다.

rreee

##매니저클래스

Manager 클래스의 인스턴스는 마스터 프로세스에서 Object를 공유 메모리로 초기화하고 User 인스턴스의 요청에 따라 공유 메모리에 키-값 쌍을 추가하거나 키 값을 읽어 결과를 보냅니다. 뒤쪽에.

rreee

##사용방법

var User = function() {
  var self = this;
  self.uuid = 0;
 
  // 缓存回调函数
  self.getCallbacks = {};
 
  // 接收每次操作请求的回信
  process.on('message', function(data) {
    
    if (!data.isSharedMemoryMessage) return;
    // 通过uuid找到相应的回调函数
    var cb = self.getCallbacks[data.uuid];
    if (cb && typeof cb == 'function') {
      cb(data.value)
    }
    // 卸载回调函数
    self.getCallbacks[data.uuid] = undefined;
  });
};
 
// 处理操作
User.prototype.handle = function(method, key, value, callback) {
 
  var self = this;
  var uuid = self.uuid++;
 
  process.send({
    isSharedMemoryMessage: true,
    method: method,
    id: cluster.worker.id,
    uuid: uuid,
    key: key,
    value: value
  });
 
  // 注册回调函数
  self.getCallbacks[uuid] = callback;
 
};
 
User.prototype.set = function(key, value, callback) {
  this.handle('set', key, value, callback);
};
 
User.prototype.get = function(key, callback) {
  this.handle('get', key, null, callback);
};

위는 IPC 통신을 통해 구현된 다중 프로세스 공유 메모리 기능입니다. 이 방법은 마스터 프로세스의 메모리에 직접 데이터를 캐시한다는 점에 유의해야 합니다. 여기서는 몇 가지 간단한 제거 사항을 추가하는 것을 고려할 수 있습니다. . 메모리 사용을 최적화하는 전략. 또한, 한 번에 읽고 쓴 데이터의 양이 상대적으로 많으면 그에 따라 IPC 통신에 소요되는 시간도 늘어납니다. 이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 자료:

el-uploadExcel 파일 업로드 방법


현재 입력 콘텐츠의 바이트 수와 문자 수를 동적으로 가져옵니다


위 내용은 클러스터 공유 메모리를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.