Project

qyu

0.01
No commit activity in last 3 years
No release in over 3 years
Qyu makes use of a message queue and a state store to provide a reliable distributed task execution system for complex workflows
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 1.16
~> 0.1
~> 2.0
~> 0.11
~> 1.0
~> 12.0
~> 3.5
~> 2.0
~> 0.9

Runtime

 Project Readme

Qyu 九

Gem Version Build Status Maintainability codecov Press

Requirements:

  • Ruby 2.4.0 or newer

Installation

Add this line to your application's Gemfile:

gem 'qyu'

And then execute:

$ bundle

Or install it yourself as:

$ gem install qyu

Configuration

To start using Qyu; you need a queue configuration and a state store configuration. Here's an example:

Qyu.configure(
  queue: {
    type: :memory
  },
  store: {
    type: :memory,
    lease_period: 60
  },
  # optional Defaults to STDOUT
  logger: Logger.new(STDOUT)
)

Usage

[1] Connect all instances to the same state store and message queue
[2] Create a workflow
[3] Initialize a worker as follows

w = Qyu::Worker.new do
  # callbacks
  callback :execute, :before do
    Qyu.logger.info 'Waiting for task..'
  end

  callback :execute, :after do
    Qyu.logger.info 'Done'
  end

  # payload validation
  validates :times, presence: true, type: :integer

  # failure queue
  failure_queue false

  # timeout in seconds for each task processed by the worker
  timeout 120
end

w.work('queue-name') do |task|
  # to get the payload passed to the task
  task.payload
  # = { 'param_1' => true, 'param_2': [10, 11, 12], 'param_3' => 2 }

  # get the job
  task.job

  # to manually start a task
  task.job.create_task(task, 'next-task-name', payload)
rescue StandardError => ex
  # If you rescue the error for debugging or reporting purposes, you have to raise it at the end
  #
  # do something
  #
  raise ex
end

[4] Start worker
[5] Start creating Jobs using the previously created workflow

Plugins

The memory queue and store is just for testing purposes. For production; use one of the following:

Stores

ActiveRecord: https://github.com/QyuTeam/qyu-store-activerecord
Redis: https://github.com/QyuTeam/qyu-store-redis

Queues

Amazon SQS: https://github.com/QyuTeam/qyu-queue-sqs
Redis: https://github.com/QyuTeam/qyu-queue-redis

Glossary

Workflow

The workflow specifies the entry points (starts), the tasks, their order, eventual dependencies between them, and synchronisation conditions.

Job

A job is essentially a collection of tasks and an initial JSON payload.

Task

A task is one unit of work. It is an instance of an entry from a workflow. You can think of it as the workflow's entries define the classes, while a task is a materialised instance of it, saved in the state store and enqueued on the message queue.

In the state store a task has:

  • id
  • name - it appears as the key in the workflow's tasks
  • queue_name - the queue where the task was enqueued on creation
  • payload - the entry/input parameters for the particular task
  • parent_task_id - the ID of the task which created/enqueued the current task

When a task is created (saved & enqueued) then its id is put in a JSON message { task_id: task.id} and enqueued on the specified task's message queue. When a worker picks up the message from the queue, decodes the task id, and retrieves it from the state store.

Worker

A worker is sitting on a queue, waiting for something.

Sync Worker

A worker waiting for other workers to finish

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/QyuTeam/qyu.