转载

阿里云消息队列服务 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 成功失败特性已编码完成!

欢迎提供解决方案以及优化。

使用方法

首先你需要开通 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); }); 

当然,你也可以在你想要的时候停止它。

producer.stop();   

Contribute

快来快来 Fxxk 我!然后提交 PR 什么的最喜欢了:see_no_evil:

「雖然我覺得不怎麼可能有人會關注我」

原文  http://f2e.souche.com/blog/ons-node-sdk/
正文到此结束
Loading...