Rails异步处理之sidekiq

对sidekiq多点了解。

异步处理是什么

google到的结果:

Asynchronous refers to processes that do not depend on each other’s outcome, and can therefore occur on different threads simultaneously. It enables various workflow processes to run at the same time. you are simply running the workflow in the background of the calling application.

简单来说,就是多个进程不依赖于各自的输出结果,可以同时出现在不同的线程中,这种方式使得不同的工作流进程可以同步进行。

在Rails中,可以理解成,当用户送出操作后,Rails 不会立即执行该任务,而是交由另一个进程(process)在背景下进行处理。

使用场景

当任务要执行很久的时候,例如汇出大笔数据、汇入大笔数据等,这时如果不进行异步处理,可能会:

  • 导致用户体验不佳,浏览器卡住,需要等服务器完成任务才有回应
  • 影响服务器效能,用户可能等不及又重新刷,导致任务重头执行,而一个HTTP Request 如果长时间执行,会让 Rails 服务器无法服务其他用户

如何使用

有两个gem可用:delayed_jobSidekiq

这里说说sidekiq的用法。

以一个简单的数据导入为例来说明下如何使用。

  • 安装Redis

    sidekiq需要使用Redis来存储所有的job和操作数据,运行:brew install redis

    新开一个terminal窗口,执行redis-server /usr/local/etc/redis.conf,默认情况下,Sidekiq 会在本地通过端口6379尝试连接Redis。

  • 安装sidekiq

    在gemfile中添加:

    gem 'sidekiq'
    

    执行bundle

  • 添加配置

    编辑config/environments/development.rbconfig/environments/production.rb, 添加:

    config.active_job.queue_adapter = :sidekiq
    

    告知Rails 要用 sidekiq 来做异步处理。

    新建文件config/sidekiq.yml, 添加如下内容:

    :queues:
      - default
    

    重启服务器。

  • 新建一个异步处理任务ImportWorkerJob

    rails g job import_worker
    

    编辑app/jobs/import_worker_job.rb,修改perform部分:

    def perform(import_id)
      import = Import.find(import_id)
      ## do something, eg. import.file!
    end
    
  • 如何调用?

    对于需要异步处理的job,使用ImportWorkerJob.perform_later(@import.id)即可。

Redis与memcache

说到Redis,很容易想到memcache,看看他俩的区别。

一直以为他俩特别像,都是用来做缓存的。但是Google了下发现,相对而言,Redis能做的更多,表现也更好。

memcache小巧,允许你存储key/value这样的一堆堆键值,且对value的字符有限制【up to 1M】。重启memcache, 数据全部清空。Redis可以当作cache来用,memcache能做的,它都能做,但对value字符的限制扩展到了512M。重启redis后,默认情况下,数据并不清空,当然,如果你需要它像memcache一样清空,也没问题。它还具有像其他数据库一样的特性,比如集群等。可以在终端运行:redis-cli info 来一览Redis。

好像我目前都是把redis当缓存服务器来使用的……

参考

Understanding Synchronous and Asynchronous Processing

Memcached vs. Redis?

Monitoring Redis

强烈推荐Mike Perham「maintainer of Sidekiq」 的个人blog, 干货很多,里面对于sidekiq和Redis也有详细的讲解。