Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
85 lines (59 sloc) 2.97 KB

presque is a small message queue service build on top of redis and Tatsumaki. It's heavily inspired by RestMQ and resque.

  • Communications are done in JSON over HTTP
  • Queues and messages are organized as REST resources
  • A worker can be writen in any language that make a HTTP request and read JSON
  • Thanks to redis, the queues are persistent

Overview

resque need a configuration file, writen in YAML that contains the host and port for the Redis server.

    redis:
        host: 127.0.0.1
        port: 6379

Let's start the server:

    % plackup app.psgi --port 5000

The applications provides some HTTP routes:

  • /: a basic HTML page with some information about the queues
  • q: REST API to get and post job to a queue
  • j: REST API to get some information about a queue
  • control: REST API to control a queue (start or stop consumers)
  • stats: REST API to fetch some stats (displayed on the index page)

Queues are created on the fly, when a job for an unknown queue is inserted. When a new job is created, the JSON send in the POST will be stored "as is". There is no restriction on the schema or the content of the JSON.

Creating a new job simply consist to :

    % curl -X POST "http://localhost:5000/q/foo" -d '{"foo":"bar", "foo2":"bar" }'

and fetching the job:

    % curl "http://localhost:5000/q/foo"

When a job is fetched, it's removed from the queue.

A basic worker

I've also pushed presque::worker. It's based on AnyEvent::HTTP and Moose. Let's write a basic worker using this class:

    use strict;
    use warnings;
    use 5.012;    # w00t

    package simple::worker;
    use Moose;
    extends 'presque::worker';

    sub work {
        my ($self, $job) = @_;
        say "job's done";
        ...;      # yadda yadda!
        return;
    }

    package main;
    use AnyEvent;

    my $worker =
        simple::worker->new(base_uri => 'http://localhost:5000', queue => 'foo');

    AnyEvent->condvar->recv;

A worker have to extends the presque::worker class, and implement the method work. When the object is created, the class check if this method is avalaible. You can also provide a fail method, which will be called when an error occur.

The future

I plan to add support for websocket, and probably XMPP. More functionalities to the worker too: logging, forking, handling many queues, ... I would like to add priorities to queue also, and maybe scheluding job for a given date (not sure if it's feasable with Redis).