阿里云消息队列服务 ONS 的 Node.js SDK! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XadillaX
V2EX    Node.js

阿里云消息队列服务 ONS 的 Node.js SDK!

  •  1
     
  •   XadillaX 2016-01-25 21:03:49 +08:00 4351 次点击
    这是一个创建于 3546 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于阿里云那边迟迟不出 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 什么的最喜欢了

    「然我得不怎可能有人注我」

    6 条回复    2016-01-26 08:08:34 +08:00
    icedx
        1
    icedx  
       2016-01-25 21:30:04 +08:00
    兹迟一下
    aqqwiyth
        2
    aqqwiyth  
       2016-01-25 22:15:03 +08:00
    资吃一下
    XadillaX
        3
    XadillaX  
    OP
       2016-01-25 22:21:56 +08:00 via Android
    @icedx @aqqwiyth 资池快来点星星
    icedx
        4
    icedx  
       2016-01-25 23:49:50 +08:00
    @XadillaX 已点
    tinyproxy
        5
    tinyproxy  
       2016-01-26 00:31:51 +08:00
    楼主莫慌,我看了一下官网提供的 SDK ,好像只有 PHP 是有机会不用反编译的,下载打开一看 TM 也是.so , aliyun 内部的人都跟你一样偷懒啦
    phoenixlzx
        6
    phoenixlzx  
       2016-01-26 08:08:34 +08:00
    点个赞,虽然不怎么敢用阿里云了现在
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3235 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:19 PVG 08:19 LAX 17:19 JFK 20:19
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86