天天看點

Note.js架構中的cluster叢集和斷言測試的實戰剖析

Cluster

節點。Js在單個線程中運作單個執行個體。為了使用目前的多核系統,使用者(開發人員)有時會使用一個Node字元串。js程序來處理加載任務。

叢集子產品允許輕松建立共享伺服器端口的子程序。

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主程序 ${process.pid} 正在運作`);

  // 衍生工作程序。
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作程序 ${worker.process.pid} 已退出`);
  });
} else {
  // 工作程序可以共享任何 TCP 連接配接。
  // 在本例子中,共享的是一個 HTTP 伺服器。
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界\n');
  }).listen(8000);

  console.log(`工作程序 ${process.pid} 已啟動`);
}
           

第一種方法(也是除Windows以外的所有平台的預設方法)是循環方法。主程序負責偵聽端口,并在接收到新連接配接後将連接配接循環分發給工作程序。發行版中使用了一些内置技術,以防止工作程序過載。

第二種方法是主程序建立偵聽套接字并将其發送給感興趣的工作程序。工作程序負責直接接收連接配接。

理論上,第二種方法應該是最有效的,但在實踐中,由于作業系統的不可預測的排程機制,配置設定将變得不穩定。我們遇到過這種情況:8個程序中有2個共享70%的負載。

worker.send

向工作程序或主程序發送消息,或發送句柄。

當主程序調用此方法時,它将向特定的工作程序發送消息。另一種等效方法是ChildProcess。

當工作程序調用此方法時,它将向主程序發送消息。另一種等效方法是過程。

工作程序将回顯主程序發送的消息。

if (cluster.isMaster) {
  const worker = cluster.fork();
  worker.send('hi there');

} else if (cluster.isWorker) {
  process.on('message', (msg) => {
    process.send(msg);
  });
}
           

assert 斷言測試

測試實際參數是否等于預期深度參數。使用相等運算符(==)比較原始值。

隻測試可枚舉自身屬性,而不測試對象的原型、連接配接器或不可枚舉屬性(在這些情況下使用assert.deepStrictEqual())。例如,以下示例不會引發AssertionError,因為RegExp對象的屬性不可枚舉:

assert.deepEqual(/a/gi, new Date());
           

映射和集合中包含的子項也将進行測試。

還将測試子對象的可枚舉屬性:

const assert = require('assert');

const obj1 = {
  a: {
    b: 1
  }
};
const obj2 = {
  a: {
    b: 2
  }
};
const obj3 = {
  a: {
    b: 1
  }
};
const obj4 = Object.create(obj1);

assert.deepEqual(obj1, obj1);

assert.deepEqual(obj1, obj2);

assert.deepEqual(obj1, obj3);
assert.deepEqual(obj1, obj4);
           

測試通過,兩個對象相等。

Buffer (緩沖)

在ECMAScript 2015(ES6)引入TypedArray之前,JavaScript語言沒有讀取或操作二進制資料流的機制。Buffer類作為Node Js API引入,使其能夠在TCP流或檔案系統操作等場景中處理二進制資料流。

TypedArray已添加到ES6中。Buffer類更優化,更适合Node。js用例的方法實作了Uint8Array API。

Buffer類的執行個體類似于整數數組,但Buffer的大小是固定的,實體記憶體配置設定在V8堆之外。緩沖區的大小在建立時确定,無法調整。

Buffer類位于節點J中。它是一個全局變量,是以不需要使用require('Buffer')。緩沖器

建立一個長度為 10、且用 0x1 填充的 Buffer。

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(10, 1);
const buf3 = Buffer.allocUnsafe(10);

const buf4 = Buffer.from([1, 2, 3]);

const buf5 = Buffer.from('tést');
const buf6 = Buffer.from('tést', 'latin1');
           

建立一個長度為 10、且未初始化的 Buffer。

這個方法比調用 Buffer.alloc() 更快,

但傳回的 Buffer 執行個體可能包含舊資料,

是以需要使用 fill() 或 write() 重寫。

指令行選項

$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>
           
const buf1 = new Buffer('buffer');
const buf2 = new Buffer(buf1);

buf1[0] = 0x61;
console.log(buf1.toString());

console.log(buf2.toString());
           

new Buffer

const buf = new Buffer(10);
           
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
           

繼續閱讀