阿里云消息隊列服務 ONS 的 Node.js SDK!
由于阿里云那邊遲遲不出 Node.js 的 ONS SDK (master 分支還沒東西,在另一個分支),我就自己用 ONS 的 C++ SDK 擼了一個 Node.js 版本的。
其實我也是有想過給官方貢獻代碼,后來粗粗瞄了一眼,發現這貨的協議沒文檔的情況下來寫的話要耗費蠻大的精力的,我只能投機取巧用現成 SDK 擼了。
其實這個包在一個月前就寫好了,不過當時沒找到很好的支持 ACK
的方法,今天腦袋突然一亮,用 libuv
的黑科技搞定了對 ACK
的支持,我才搬上臺面發出來。
不過有一點需要注意:
因為阿里云 ONS 的官方 C++ SDK 是閉源的,且只提供了 Linux 下的靜態鏈接庫(libonsclient4cpp.a),所以該包目前為止只支持在 Linux 下安裝。
如需開發環境,OSX 用戶請移步 Linux 或者啟動一個 Vagrant、Docker 等。
但是等哪天阿里云的 C++ SDK 如果編譯好了 OSX 的鏈接庫的話我會馬上做上支持的。
廢話不多說,上包: https://github.com/XadillaX/aliyun-ons
ONS(開放消息服務)是基于阿里開源消息中間件MetaQ(RocketMQ)打造的一款云消息產品。
安裝
$ npm install --save ons
注意:因為阿里云 ONS 的官方 C++ SDK 是閉源的,且只提供了 Linux 下的靜態鏈接庫(libonsclient4cpp.a),所以該包目前為止只支持在 Linux 下安裝。
如需開發環境,OSX 用戶請移步 Linux 或者啟動一個 Vagrant、Docker 等。
還有一點,由于 C++ SDK 在線程中同步執行需要反饋處理結果,而 Node.js 需要異步執行,所以沒法及時反饋結果,本包只能默許所有消息都成功處理,即 ACK 成功狀態。
(
ACK 成功失敗特性已編碼完成!
)
歡迎提供解決方案以及優化。
</div>
使用方法
首先你需要開通 ONS 服務并且獲取 access key
以及 secret key
,然后創建一個消費者 ID 或者生產者 ID,還有就是話題(topic)。
詳情可以參考 阿里云 ONS 幫助 或者 阿里云控制臺 。
樣例
你可以參考兩個樣例文件 consumer.js 以及 producer.js .
Consumer
通過下面的代碼來創建一個 Consumer。
var Consumer = require("ons").Consumer;
var consumer = new Consumer(CUSTOMER_ID, TOPIC, TAGS, ACCESS_KEY, SECRET_KEY);
然后創建一個獲取消息的事件監聽。
consumer.on("message", function(msg, ack) {
// 做一些事情
//
// 該函數會在收到消息之后被觸發。
//
// 在你做完事情之后別忘了調用 `ack.done(true)` 或是 `ack.done(false)`
// 來告訴 ONS 你已處理消息成功或者失敗,若失敗則 ONS 會重試
//
// `ack.done()` 等價于 `ack.done(true)`
});
當你完成創建和設置監聽函數之后,就可以初始化 Consumer 并開始監聽消息了。
consumer.init(function(err) {
if(err) return console.log(err);
consumer.listen();
});
以及,你也可以在你想要的時候停止它。
consumer.stop();
Producer
通過下面的代碼來創建一個 Producer。
var Producer = require("ons").Producer;
var producer = new Producer(PRODUCER_ID, ACCESS_KEY, SECRET_KEY);
創建完畢之后需要啟動它才能發消息。
producer.start(function(err) {
if(err) return console.log(err);
console.log("Started!");
});
然后你就可以通過 send
函數來發消息了。
producer.send(KEY, TOPIC, TAGS, CONTENT, function(err, messageId) {
console.log(arguments);
});
// KEY
參數并不是必選的,所以也可以如下調用
producer.send(TOPIC, TAGS, CONTENT, function(err, messageId) {
console.log(arguments);
});</code></pre>
當然,你也可以在你想要的時候停止它。
producer.stop();
Contribute
快來快來 Fxxk 我!然后提交 PR 什么的最喜歡了:see_no_evil:
「雖然我覺得不怎麼可能有人會關注我」
來自: http://f2e.souche.com/blog/ons-node-sdk/