开源项目 [搜车开源] 阿里云 ONS Ruby SDK

42thcoder for 大搜车 · 发布于 2016年08月15日 · 最后由 42thcoder 回复于 2016年08月16日 · 1118 次阅读
6764

背景

公司的微服务化越来越正规, 需要用到消息队列的场景越来越多. 之前尝试过自建消息队列, 但是运维成本太高, 还踩了几次坑, 最终选择了阿里云的 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.

TCP

这种接入方式功能最多, 性能最好, 但是协议繁复, 接入成本很高. 官方提供了 Java 和 C++ 的 SDK.

技术层面上, Ruby 封装 C++ SDK , 开发量较小, 开发难度也低, 我们公司的 Node 团队已经吃了螃蟹.

HTTP

顾名思义, 就是通过 HTTP 接口来做消息的管理, 速度和稳定性没有保障.

MQTT

主要的应用场景是物联网中的嵌入式设备, 受限与客户端性能, 功能做了裁剪, 同时有丢消息的风险.

综上, 我们选择了用 Ruby 用封装一层 C++ SDK, 解决方案是 https://github.com/jasonroelofs/rice

项目介绍

项目地址在 https://github.com/souche/aliyun-ons-ruby-sdk, 欢迎来 FXXK. 主程是我们的 @0x005a 同学, 大家快去围观大神.

项目依赖

  • Linux/Unix 系统
  • Ruby 2.1.5 或以上版本
  • Boost C++ 程序库

安装步骤

安装 Ruby 程序

$ rvm install 2.1.5

安装 Boost C++ 程序库

$ apt-get install libboost-all-dev

安装 ons

$ gem install ons

使用方式

环境准备

  • 安装 ons rubygems。
  • 代码里涉及到的 TOPIC、PRODUCER_ID、CONSUMER_ID,需要在 MQ 控制台上创建。 Message Tag 可以完全由应用自定义,具体创建过程可参考 申请MQ资源
  • 使用 MQ 服务的应用程序需要部署在阿里云 ECS 上。

部分资料来自 消息队列 > 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

Roadmap

希望大家多多参与, 能得到官方支持那是最好了.

后续希望做这几件事:

  • [] 开发 ons_on_rails, 在目前的 ons 之上封装一次, 方便 Rails App 使用.
  • [] 支持更多的消息发送方式, 目前仅支持单向发送.
  • [] 开发基于 Engine 的 Admin 页面, 管理消息和服务状态

多余的话

这篇是搜车开源的第一篇, 后续还会介绍些其他准备开源的项目, 大家期待吧.

最后, 照例放一个硬广. D 轮公司招靠谱 Ruby, 这世界很需要你呢, 少年!

https://ruby-china.org/topics/30765

共收到 2 条回复
De6df3

看起来像 RPC 服务呀

6764

#1楼 @huacnlee

引入 ONS 主要是为了系统之间的解耦, 也有一部分性能方面的考虑.

当然也可以用来做 RPC, 它支持 可靠同步发送:

同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式。

3楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册