阿里云消息隊列服務 ONS 的 Node.js SDK!

jopen 8年前發布 | 10K 次閱讀 阿里云 Node.js

由于阿里云那邊遲遲不出 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/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!