At a high level, Faktory is a work server. It is the repository for background jobs within your application. Jobs have a type and a set of arguments and are placed into queues for workers to fetch and execute.
You can use this server to distribute jobs to one or hundreds of machines. Jobs can be executed with any language by clients using the Faktory API to fetch a job from a queue.
Faktory 最大的卖点应该就是支持异构系统,并且保留了从 Sidekiq 积累下的一些好用的特性。下面来实现一个 用 Ruby 做 生产者,Python 做 消费者 的队列:
#!/usr/bin/env ruby
require 'pry'
require 'faktory_worker_ruby'
Faktory.server { |s| s.push(:jobtype => "HelloJob", :jid => "111111111111", :args => [1, 2]) }
#!/usr/bin/env python
from faktory import Worker
def your_function(x, y):
print(x + y)
w = Worker(queues=['default'], concurrency=1)
w.register('HelloJob', your_function)
w.run()
当 执行 ruby client 的时候 python server 端会打出 3.
Faktory 的接口格式其实很简单,核心是 queue、jobtype 和 args,相对于 HTTP 协议就是 domain、path 和 body,但相对于 HTTP 的好处其实很多:
缺点呢,从目前来说相对不成熟,国内的云服务商短时间内不会提供服务。虽然去掉了 redis 这个依赖,但 redis 已经成了云服务商的标配,然而 faktory server 本身其实需要自己去运维的。