公司的微服务化越来越正规,需要用到消息队列的场景越来越多。之前尝试过自建消息队列,但是运维成本太高,还踩了几次坑,最终选择了阿里云的 ONS .
关于 ONS, 有兴趣的可以看下官方的博文,技术上还是很靠谱的。http://jm.taobao.org/2016/05/26/do-you-really-need-so-many-sync-call-in-your-distributed-application/
ONS 提供了多种接入方式,包括 TCP, HTTP, MQTT.
这种接入方式功能最多,性能最好,但是协议繁复,接入成本很高。官方提供了 Java 和 C++ 的 SDK.
技术层面上,Ruby 封装 C++ SDK , 开发量较小,开发难度也低,我们公司的 Node 团队已经吃了螃蟹。
顾名思义,就是通过 HTTP 接口来做消息的管理,速度和稳定性没有保障。
主要的应用场景是物联网中的嵌入式设备,受限与客户端性能,功能做了裁剪,同时有丢消息的风险。
综上,我们选择了用 Ruby 用封装一层 C++ SDK, 解决方案是 https://github.com/jasonroelofs/rice
项目地址在 https://github.com/souche/aliyun-ons-ruby-sdk, 欢迎来 FXXK. 主程是我们的 @0x005a 同学,大家快去围观大神。
$ rvm install 2.1.5
$ apt-get install libboost-all-dev
$ gem install ons
部分资料来自 消息队列 > TCP 接入 (专业) > C/C++ SDK 环境准备
producer = Ons::Producer.new('', '', '')
# 资源准备
producer.start
# 在 topic 下发送消息
producer.send_message('', 'tag', 'Hello, World!')
# 必须在程序退出前调用 shutdown 方法释放相关资源,否则可能出现栈错误
producer.shutdown
更多用法,请参考 {file:samples/producer.rb} 及 API 文档
consumer = Ons::Consumer.new('', '', '')
# 订阅 topic 下的所有消息
# 注意,当消息达到时,会调用下述函数,此函数会被调度到单独线程中执行
consumer.subscribe('', '*') { |message| p message }
# 资源准备
consumer.start
# 等待消息到达
sleep 32
# 必须在程序退出前调用 shutdown 方法释放相关资源,否则可能出现栈错误
consumer.shutdown
希望大家多多参与,能得到官方支持那是最好了。
后续希望做这几件事:
ons_on_rails
, 在目前的 ons
之上封装一次,方便 Rails App 使用。这篇是搜车开源的第一篇,后续还会介绍些其他准备开源的项目,大家期待吧。
最后,照例放一个硬广。D 轮公司招靠谱 Ruby, 这世界很需要你呢,少年!