阿里云消息队列服务 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 等。
)
欢迎提供解决方案以及优化。
使用方法
首先你需要开通 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:
「雖然我覺得不怎麼可能有人會關注我」
</div>