Brotli 壓縮與 Protobuf over MQTT
兩個獨立的小範例:從原始碼編譯 Brotli 壓縮函式庫,以及用 Protocol Buffers 序列化訊息後透過 MQTT 發送。
Brotli 函式庫建置
Brotli 是 Google 開發的壓縮演算法,壓縮率比 gzip 更高,被瀏覽器廣泛支援(Content-Encoding: br)。Nginx 要支援它需要先有 libbrotli。
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install git wget autoconf automake gcc -y
RUN git clone https://github.com/bagder/libbrotli
WORKDIR libbrotli
RUN apt-get install libtool -y
RUN apt-get install --reinstall build-essential -y
RUN ./autogen.sh
RUN ./configure --prefix=/usr
RUN make && make install
RUN ldconfig
編譯完成後,就可以搭配 ngx_brotli 模組重新編譯 Nginx:
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript;
Protobuf over MQTT
用 Protocol Buffers 取代 JSON 當 MQTT payload,訊息體積更小、解析更快,適合頻寬受限的 IoT 場景。
Schema
company.proto 定義一個 Employee 訊息:
package Company;
message Employee{
optional string name = 1;
optional uint32 id = 2;
}
發布端
app.js 把物件序列化成 binary buffer 後發布到公開測試 broker:
var ProtoBuf = require("protobufjs");
var mqtt = require('mqtt');
var builder = ProtoBuf.load('./company.proto'),
Company = builder.build('Company'),
Employee = Company.Employee;
var employee = new Employee("James Bond", 007);
var buffer_message = employee.toBuffer();
var client = mqtt.connect('mqtt://test.mosquitto.org');
client.on('connect', function() {
client.publish('MyCompany', buffer_message);
client.end();
});
執行
npm install protobufjs mqtt
node app.js
訂閱端收到的是 binary,要用同一份 .proto 反序列化:
var decoded = Employee.decode(payload);
console.log(decoded.name, decoded.id);
版本注意
上面的 builder.build(...) 是 protobufjs 5.x 的 API。protobufjs 6 以後改成:
protobuf.load("company.proto", function(err, root) {
var Employee = root.lookupType("Company.Employee");
var buffer = Employee.encode({ name: "James Bond", id: 7 }).finish();
});
相關資源
← 回到 Web 網頁伺服器