阿里云消息队列服务 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 什么的最喜欢了🙈

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 131,216评论 18 138
  • 姓名:周小蓬 16019110037 转载自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw阅读 33,738评论 13 424
  • 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下: 以时间复杂度为O...
    高广超阅读 12,170评论 8 168
  • 分布式开放消息系统(RocketMQ)的原理与实践 来源:http://www.jianshu.com/p/453...
    meng_philip123阅读 12,487评论 6 104
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 11,285评论 0 15
  • 写了一晚上代码,读了尼采的一小段书: “就我的经验而言,最令我惊奇的事情是:男人与女人在潜意识中自然认为,与四周的...
    云时之间阅读 250评论 3 3
  • 幸福来得太突然 “灵珊,你嫁给我吧!” “嗡——” 程诺的一句话,让方灵珊一瞬间楞在了那里,大脑里一片空白。当她好...
    诺阳阁阅读 185评论 0 1
  • 我们这个学科不仅要学高数,线性代数,概率论,还要学微观经济学宏观经济学等。高数虚吗?以后管理工作会用到高数吗?安排...
    读点书阅读 53评论 0 0
  • 三年久别,重去纳木错。行至途中,苍天胡乱了天气,气象迷乱了我的认知。 清晨启程,天朗气清,绿树白云下,一展展风马旗...
    藏地茗月阅读 405评论 2 3