{"id":13669739,"url":"https://github.com/XadillaX/aliyun-ons","last_synced_at":"2025-04-27T08:32:55.173Z","repository":{"id":57314836,"uuid":"48031378","full_name":"XadillaX/aliyun-ons","owner":"XadillaX","description":":cloud: SDK of Node.js for Aliyun ONS. :rocket:","archived":false,"fork":false,"pushed_at":"2024-07-03T03:02:02.000Z","size":109055,"stargazers_count":157,"open_issues_count":9,"forks_count":31,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-04-20T18:41:45.089Z","etag":null,"topics":["aliyun","nodejs","ons","rocketmq","sdk"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XadillaX.png","metadata":{"files":{"readme":"README-zh_cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-12-15T09:01:19.000Z","updated_at":"2024-05-01T05:15:21.000Z","dependencies_parsed_at":"2022-09-18T20:33:38.802Z","dependency_job_id":null,"html_url":"https://github.com/XadillaX/aliyun-ons","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XadillaX%2Faliyun-ons","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XadillaX%2Faliyun-ons/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XadillaX%2Faliyun-ons/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XadillaX%2Faliyun-ons/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XadillaX","download_url":"https://codeload.github.com/XadillaX/aliyun-ons/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251112610,"owners_count":21538162,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aliyun","nodejs","ons","rocketmq","sdk"],"created_at":"2024-08-02T09:00:20.995Z","updated_at":"2025-04-27T08:32:54.100Z","avatar_url":"https://github.com/XadillaX.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"# 阿里云 ONS 消息队列服务 Node.js SDK\n\n[![Version](http://img.shields.io/npm/v/ons.svg)](https://www.npmjs.com/package/ons)\n[![Downloads](http://img.shields.io/npm/dm/ons.svg)](https://www.npmjs.com/package/ons)\n[![License](https://img.shields.io/npm/l/ons.svg?style=flat)](https://opensource.org/licenses/MIT)\n[![AppVeypr](https://ci.appveyor.com/api/projects/status/9qdfjl7ig6s9d72s/branch/master?svg=true)](https://ci.appveyor.com/project/XadillaX/aliyun-ons)\n[![TravisCI](https://travis-ci.org/XadillaX/aliyun-ons.svg)](https://travis-ci.org/XadillaX/aliyun-ons)\n[![Dependency](https://david-dm.org/XadillaX/aliyun-ons.svg)](https://david-dm.org/XadillaX/aliyun-ons)\n\n\u003e **ONS**（开放消息服务）是基于阿里开源消息中间件 MetaQ（RocketMQ）打造的一款云消息产品。\n\n## 安装\n\n```sh\n$ npm install --save ons\n```\n\n\u003e **注意:** 因为阿里云 ONS 的官方 C++ SDK 是闭源的，且只提供了 Linux 和 Windows 下的链接库（libonsclient4cpp.a，ONSClientCPP.lib），所以该包目前为止只支持在 Linux 和 64 位 Windows 下安装。\n\u003e\n\u003e 4.x 版本以后支持 OSX 使用——通过不完整的 HTTP 协议。不推荐上线使用，仅供开发测试。\n\n\n## 使用方法\n\n首先你需要开通 ONS 服务并且获取 `access key` 以及 `secret key`，然后创建一个消费者 ID 或者生产者 ID，还有就是话题（topic）。\n\n详情可以参考[阿里云 ONS 帮助](https://help.aliyun.com/product/8315024_ons.html)或者[阿里云控制台](http://ons.console.aliyun.com/)。\n\n### 样例\n\n你可以参考两个样例文件 [consumer.js](example/consumer.js) 以及 [producer.js](example/producer.js).\n\n### Consumer\n\n通过下面的代码来创建一个 Consumer。\n\n```javascript\nvar Consumer = require(\"ons\").Consumer;\nvar consumer = new Consumer(CUSTOMER_ID, TOPIC, TAGS, ACCESS_KEY, SECRET_KEY, OPTIONS);\n```\n\n\u003e `OPTIONS` 及其内部的参数都是可选的。\n\u003e\n\u003e 例如\n\u003e\n\u003e ```javascript\n\u003e {\n\u003e     namesrvAddr: \"112.124.141.191:80\",\n\u003e     onsAddr: \"http://onsaddr-internet.aliyun.com:80/rocketmq/nsaddr4client-internet\",\n\u003e\n\u003e     threadNum: 3\n\u003e }\n\u003e ```\n\u003e\n\u003e + **namesrvAddr**：ONS 服务器地址\n\u003e + **onsAddr**：用于寻找 ONS 服务器地址\n\u003e + **threadNum**：工作线程数\n\u003e + **order**：是否以 `OrderConsumer` 创建\n\u003e + **httpDomain**：OSX 专用，请求域名，参考 https://help.aliyun.com/document_detail/29574.html\n\u003e\n\u003e \u003e OSX 只支持 `threadNum` 和 `httpDomain` 两个参数。以及在构造函数内的 `TAG` 参数在 OSX 下将会失效。\n\n然后创建一个获取消息的事件监听。\n\n```javascript\nconsumer.on(\"message\", function(msg, ack) {\n    // 做一些事情\n    // \n    // 该函数会在收到消息之后被触发。\n    //\n    // 在你做完事情之后别忘了调用 `ack.done(true)` 或是 `ack.done(false)`\n    // 来告诉 ONS 你已处理消息成功或者失败，若失败则 ONS 会重试\n    //\n    // `ack.done()` 等价于 `ack.done(true)`\n});\n```\n\n当你完成创建和设置监听函数之后，就可以初始化 Consumer 并开始监听消息了。\n\n```javascript\nconsumer.init(function(err) {\n    if(err) return console.log(err);\n    consumer.listen();\n});\n```\n\n以及，你也可以在你想要的时候停止它。\n\n```javascript\nconsumer.stop(function() {\n    // 停止了\n});\n```\n\n\u003e **注意：**在调用 `stop()` 之前，你需要 `ack` 所有已接收到的消息（无论是 `done(true)` 或者 `done(false)`），否则回调函数不会被触发，Consumer 不会停止。\n\u003e\n\u003e **另外，你最好在你的程序退出之前停止 Consumer。比如说：**\n\u003e\n\u003e ```javascript\n\u003e process.on(\"SIGINT\", function() {\n\u003e     consumer.stop(function() {\n\u003e         process.exit(0);\n\u003e     });\n\u003e });\n\u003e ```\n\u003e\n\u003e 不过这段代码要视你自己代码的情况而写，只是个例子而已。\n\n### Producer\n\n通过下面的代码来创建一个 Producer。\n\n```javascript\nvar Producer = require(\"ons\").Producer;\nvar producer = new Producer(PRODUCER_ID, ACCESS_KEY, SECRET_KEY);\n```\n\n\u003e `OPTIONS` 及其内部的参数都是可选的。\n\u003e\n\u003e 例如\n\u003e\n\u003e ```javascript\n\u003e {\n\u003e     namesrvAddr: \"112.124.141.191:80\",\n\u003e     onsAddr: \"http://onsaddr-internet.aliyun.com:80/rocketmq/nsaddr4client-internet\",\n\u003e\n\u003e     sendTimeout: 1000\n\u003e }\n\u003e ```\n\u003e\n\u003e + **namesrvAddr**：ONS 服务器地址\n\u003e + **onsAddr**：用于寻找 ONS 服务器地址\n\u003e + **sendTimeout**：发送超时时间\n\u003e + **order**：是否以 `OrderProducer` 模式创建\n\u003e + **httpDomain**：OSX 专用，请求域名，参考 https://help.aliyun.com/document_detail/29574.html\n\u003e\n\u003e \u003e OSX 只支持 `order` 和 `httpDomain` 两个参数。\n\n创建完毕之后需要启动它才能发消息。\n\n```javascript\nproducer.start(function(err) {\n    if(err) return console.log(err);\n    console.log(\"Started!\");\n});\n```\n\n然后你就可以通过 `send` 函数来发消息了。\n\n```javascript\nproducer.send([KEY,] TOPIC, TAGS, CONTENT, [SHARDING_KEY,] [DELAY,] function(err, messageId) {\n    console.log(arguments);\n});\n\n// `KEY` 参数并不是必选的，所以也可以如下调用\n// `SHARDING_KEY` 在非 `OrderProducer` 不需要传，在 `OrderProducer` 模式下必传\n// `DELAY` 延时参数也是可选的，默认不传为立即发送，否则会发一个指定毫秒延时的消息\n\nproducer.send(TOPIC, TAGS, CONTENT, function(err, messageId) {\n    console.log(arguments);\n});\n```\n\n\u003e **注意壹：**`SHARDING_KEY` 仅在 `OrderProducer` 模式必传，否则不需要传。在 `OrderProducer` 模式下，同 `SHARDING_KEY`\n\u003e 的消息会顺序发送，不同 `SHARDING_KEY` 之间消息不能保证顺序。在 `OrderConsumer` 接受消息时，同 `SHARDING_KEY`\n\u003e 的消息会顺序接受，不同 `SHARDING_KEY` 之间消息不能保证顺序。\n\u003e\n\u003e **注意贰：**`callback` 在非 `OrderProducer` 模式下可选，若不传 `callback` 则该 `Producer` 将会以 **Oneway** 形式发送。\n\n当然，你也可以在你想要的时候停止它。\n\n```javascript\nproducer.stop(function() {\n    // 停止了\n});\n```\n\n\u003e **注意：**你最好在你的程序退出之前停止 Producer。比如说：\n\u003e\n\u003e ```javascript\n\u003e process.on(\"SIGINT\", function() {\n\u003e     producer.stop(function() {\n\u003e         process.exit(0);\n\u003e     });\n\u003e });\n\u003e ```\n\u003e\n\u003e 不过这段代码要视你自己代码的情况而写，只是个例子而已。\n\n### 原始日志\n\n\u003e **该特性目前只在 Linux 下实现。**\n\nC++ ONS SDK 会生成它的源日志，所以我们创建了一个 `tail stream` 来监控它。\n\n```javascript\nconst logger = require(\"ons\").logger;\nlogger.on(\"data\", function(data) {\n    console.log(\"[ORIG LOG]\", data);\n});\n\n// [ORIG LOG] ... register sendMessageHook success,hookname is OnsSendMessageHook ...\n// ...\n// [ORIG LOG] ... register consumeMessageHook success,hookname is OnsConsumerMessageHook ...\n// ...\n// [ORIG LOG] ... shutdown producerl successfully ...\n// ...\n// [ORIG LOG] ... shutdown pushConsumer successfully ...\n// ...\n```\n\n\u003e **提示：**C++ ONS SDK 在一个进程中只会创建一个日志文件，所以 `logger` 是一个单件（Singleton）。\n\n## C++ SDK 更改日志\n\n这里是 [ONS 原始 C++ SDK 更改日志](src/third_party/CHANGELOG.md)。\n\n\u003e **注意：**这只是原始 C++ SDK 的更改日志，Node.js SDK 不一定用到所有的新特性。\n\n## 贡献\n\n快来快来 **Fxxk** 我！然后提交 PR 什么的最喜欢了🙈\n\n「雖然我覺得不怎麼可能有人會關注我」\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FXadillaX%2Faliyun-ons","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FXadillaX%2Faliyun-ons","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FXadillaX%2Faliyun-ons/lists"}