Overview

Overview #

Rota is a job scheduler, which means it controls unattended background execution of jobs. Jobs are used for everything that needs to happen asynchronously: generating reports, sending emails, ETL pipelines, and much more.

There are a few key things that make Rota different from similar products:

  • It is language-independent: You can use the same job scheduler with Ruby, Python, Java, and more.
  • It is platform-independent: It plays just as nicely with bare metal servers as it does with the cloud.
  • It is architecture-independent: You can write and invoke tasks in a mix of monoliths and microservices with first class support either way.
  • It supports jobs, not just tasks.

Language-Independent #

Rota is a consists of a language-independent network API that’s easy to implement from a wide variety of programming languages. We currently provide officially supported clients for Python and Go, with more languages on the way.

Platform-Independent #

Rota is not tied to any operating system or cloud platform. It’s designed to work well with a variety of work distribution models from worker services to serverless functions.

Architecture-Independent #

You can define tasks in monolithic worker daemons, serverless functions, or something else. You can even take task invocation logic out of Rota’s hands by hooking it up to a message bus like RabbitMQ or an event store like Kafka.

Jobs not Tasks #

I built Rota to solve a major source of my own agony. At multiple companies I experienced the same thing: the "background job" system we used only handled tasks, and we had to implement the job logic ourself. And we never had time to do it any good.

—Megan Ruggiero, creator of Rota and actively quoting herself

A Job is consists of a series of steps called Tasks. Most job schedulers consider them synonymous and only implement the later. So what’s the difference?

Tasks are scripts of some form, often times a function or a class with an “invoke” method. When you call them, the invocation is scheduled and the job scheduler distributes that work to the program that implements it. A good scheduler gives you the ability to track that invocation from both the calling script and a dashboard.

However, asynchronous work rarely consists of a single task. Let’s take the example of creating an export from an external system. Depending on that system, you’d need tasks to:

  • Request that an export be generated by the external system.
  • Check in regularly to get the current status of that export.
  • Download the export to your internal system.
  • Notify staff that the export completed and is ready for viewing.

Some systems might have less steps, but many systems need even more. It’s not uncommon to need that data to get piped into an analytics product like BigQuery and kick off a whole batch of reports from it.

When this happens, you need some way to track work across tasks. That’s where a Job comes in. Jobs track a request, “run the export and its side effects”, handles dependencies between the tasks that make up that job, and allow you to track progress across the entire suite.

Jobs let you build Workflows: complex graphs of tasks with rules on how to handle exceptional conditions and collect performance statistics.

With other products, you end up having to build all this yourself.

Rota handles jobs, tasks, and more so you don’t have to.