GitHub issues GitHub forks GitHub stars Yard Docs Gem Version License

OnsOnRails

整合阿里云 ONS 到 Rails 项目

项目依赖

  • Linux/Unix 系统
  • Ruby 2.1.5 或以上版本
  • Rails 4.1.0 或以上版本

如何使用

配置 Rails 环境

在 Gemfile 添加依赖规则

gem 'ons', group: :linux
gem 'ons_on_rails'

在 config/application.rb 添加 require 规则

Bundler.require(*Rails.groups)
Bundler.require(RUBY_PLATFORM.match(/(linux|darwin)/)[0].to_sym)

在 config/ 目录下添加配置文件 ons_on_rails.yml

#
# access_key,阿里云官网身份验证访问码
# secret_key,阿里云身份验证密钥
#
# user_service_subscriber,消费者名称,需要与实际定义的类名信息保持一致,具体见下文的消费者章节
# user_service_subscriber#consumer_id,阿里云 MQ 控制台创建的 Consumer ID
# user_service_subscriber#topic,阿里云 MQ 控制台创建的 Topic
# user_service_subscriber#tag,当前消费者订阅的 Topic 下所关注的消息标签表达式
#
# user_service_publisher,生成者名称,具体见下文的生成者章节
# user_service_publisher#producer_id,阿里云 MQ 控制台创建的 Producer ID
# user_service_publisher#topic,阿里云 MQ 控制台创建的 Topic
# user_service_publisher#tag,当前生成者发布的消息所使用的消息标签
#
default: &default
  access_key: <%= ENV['ONS_ACCESS_KEY'] %>
  secret_key: <%= ENV['ONS_SECRET_KEY'] %>
  user_service_subscriber:
    consumer_id: <%= ENV['ONS_CONSUMER_ID'] %>
    topic: <%= ENV['ONS_TOPIC'] %>
    tag: 'user_service'
  user_service_publisher:
    producer_id: <%= ENV['ONS_PRODUCER_ID'] %>
    topic: <%= ENV['ONS_TOPIC'] %>
    tag: 'user_service'

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

消费者

在 app/subscribers 目录下添加消费者实现文件,比如 user_service_subscriber.rb

# 注意,类名应当与 config/ons_on_rails.yml 中的配置保持一致
class UserServiceSubscriber
  include OnsOnRails::Subscriber

  def consume(message)
    # do something...
  end
end

在 daemons/ 目录下添加守护进程定义文件,比如 user_service_subscriber_control.rb

require 'rubygems'
require 'ons_on_rails'

APP_PATH = File.expand_path('../..', __FILE__)
OnsOnRails.run_subscriber_as_a_daemon(:user_service_subscriber, APP_PATH)

启动或关闭消费者进程,此进程会与阿里云 MQ 建立 TCP 连接,然后在本地消费消息

$ RAILS_ENV=development bundle exec ruby daemons/user_service_subscriber_control.rb start
$ RAILS_ENV=development bundle exec ruby daemons/user_service_subscriber_control.rb stop

生产者

在 config/initializers/ 目录下添加初始化文件,比如 ons_on_rails.rb

# 注意,第一个参数应当与 config/ons_on_rails.yml 中的配置保持一致
$user_service_publisher = OnsOnRails.create_publisher(:user_service_publisher, backend: :tcp)

调用 OnsOnRails::Publisher#publish 方法

$user_service_publisher.publish(operate: :create, user: { name: '123456lkjhgf' })

测试相关

设置 OnsOnRails::Publisher 的 backend 为 :test 方法即可,这样生产者会将消息保存到 OnsOnRails::Publisher.deliveries 数组中