resque VS sidekiq & AMQP - RabbitMQ 消息处理
2016-01-18 11:37
381 查看
resque & sidekiq
resque 一个 worker 通过 fork 方式来产生多个 worker 处理多个任务
fork 一个进程,操作系统会建立一个独立分开的地址空间,并且从父进程复制所有的内存片段到这个地址里面去。 这就意味着对于操作系统来说,对于 fork 的进程切换上下文,因为需要保存和加载所有数据,所以代价更大。 而且如果父进程死掉了,这些 fork 的子进程没有退出的话,将会变成僵尸进程。sidekiq 一个 worker 使用的 Thread 方式产生多个线程 处理多个任务。
thread 多线程的话是共享地址空间,内存并且多线程之间的交互也比较方便。而且你也不用担心僵尸进程的问题,一旦进程死掉, 所有的线程会自动被杀掉。但这种方式也有缺点,你必须保证代码是线程安全的,不然可能会引起麻烦resque 比 sidekiq 更消耗内存
resque 的 worker 不需要考虑线程安全问题,sidekiq 必须考虑
resque 实现
安装Redis
安装redis-namespace
安装Resque
gem install redis redis-namespace resque、dalli
配置resque信息
config/initializers/load_resque.rb
require 'resque' Resque.redis = 'localhost:6379' Resque.redis.namespace = "webtails:resque" Resque.redis.expire "key", 100 #设置数据在redis中的有效期 Resque::Plugins::Status::Hash.expire_in = (24 * 60 * 60) # 24hrs in seconds
5.配置workers
require "resque/tasks" task "resque:setup" => :environment
6.编写Task类
class SendEmailTask @queue = "demo_task" def self.perform(target_email) result = sendEmail(target_email) Resque.redis[target_email] = result end end
7.启动
VVERBOSE=1 COUNT=5 QUEUE=demo_task rake environment resque:workers PIDFILE=./tmp/pids/demo_task.pid BACKGROUND=yes QUEUE=demo_task rake resque:work >> /srv/rorapps/demo/log/demo_task.log &
8.web routes.rb
mount Resque::Server, at: ‘/resque’
sidekiq 实现
安装Redis
安装redis-namespace
安装Sidekiq
gem install redis redis-namespace sidekiq
配置sidekiq信息
config/secrets.yml
redis: &redis redis_server: 'localhost' redis_port: 6379 redis_db_num: 15 redis_namespace: 'demo_sidekiq' development: <<: *redis
config/initializers/load_sidekiq.rb
redis_server = Rails.application.secrets.redis_server redis_port = Rails.application.secrets.redis_port redis_db_num = Rails.application.secrets.redis_db_num redis_namespace = Rails.application.secrets.redis_namespace Sidekiq.configure_server do |config| p redis_server config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace } end Sidekiq.configure_client do |config| config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace } end
5.启动配置文件 config/sidekiq.yml
bundle exec sidekiq –help
--- :concurrency: 5 :pidfile: ./tmp/pids/sidekiq.pid development: :concurrency: 5 test: :concurrency: 5 production: :concurrency: 5 :queues: - default - cloud_watch - healthy - sync_order
6.配置workers
class CloudWatchWorker include Sidekiq::Worker sidekiq_options queue: :cloud_watch, retry: false, backtrace: true def perform(name, options = {}) #do something end end
7.启动Sidekiq
bundle exec sidekiq -C config/sidekiq.yml
or use capistrano
RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 ~/.rbenv/bin/rbenv exec bundle exec sidekiq –index 0 –pidfile /srv/rorapps/demo/shared/tmp/pids/sidekiq.pid –environment production –logfile /srv/rorapps/demo/shared/log/sidekiq.log –queue sms, notification –concurrency 10 –daemon
8.测试调用
CloudWatchWorker.perform_async ‘SuccessOrder’, {OrderRecord.last}
9.gem capistrano-sidekiq
bundle exec cap install
run
cap -vT
set :sidekiq_config, “#{current_path}/config/sidekiq.yml”
关于capistrano http://www.rails365.net/articles/shi-yong-capistrano-bu-shu-rails-ying-yong
10.gem ‘sinatra’ 监控页面
require ‘sidekiq/web’
mount Sidekiq::Web => ‘/sidekiq’
AMQP & RabbitMQ 还在摸索阶段
AMQP 高级消息队列协议是一个异步消息传递所使用的应用层协议规范
RabbitMQ 是AMQP的一种基于erlang的实现
http://www.infoq.com/cn/articles/AMQP-RabbitMQhttp://codemacro.com/2013/04/11/rabbitmq-erlang/
相关文章推荐
- easyui 页签
- Mockplus原型交互跟我做之3 - 认识“链接点”
- APUE之fork两次与僵尸进程的问题
- UITextView 限制输入文本长度
- Mockplus原型交互跟我做之2- 旋转的风车
- Mockplus原型交互跟我做之1 - 30秒做一个自动消失的消息框(Toast)
- chain.doFilter(request,response)含义
- UILabel + 导入字体
- iOS开发系列--UITableView全面解析
- Intelligence emp generator the best one
- StringBuilder、StringBuffer和String三者的联系和区别
- UITableView刷新数据reLoadData
- IOS开发UI-------button
- iOS开发技巧(系列十三:UIRefreshControl下拉刷新)
- 2016.01.04 视图控制器UIViewController
- UIRefreshControl系统下拉刷新
- UIlabel:自动换行
- 【FAQ】Jenkins上,xcpretty编译报错:invalid byte sequence in US-ASCII (ArgumentError)
- 【js】数据的轮播展示(模拟Marquee,无间断滚动内容)
- 嵌入式操作系统 《ARM System Developer's Guide》