blob: f26b4ccbe1c6494c5493e898d654ea7d62dec58f [file] [view]
Long-running Services
=====================
Jobs that are always restart on completion, whether successful or unsuccessful,
are called services. This is useful for long-running processes
such as webservices that should always be running, unless stopped explicitly.
Service Specification
---------------------
A job is identified as a service by the presence of the flag
``service=True` in the [`Job`](../reference/configuration.md#job-objects) object.
The `Service` alias can be used as shorthand for `Job` with `service=True`.
Example (available in the [Vagrant environment](../getting-started/vagrant.md)):
$ cat /vagrant/examples/jobs/hello_world.aurora
hello = Process(
name = 'hello',
cmdline = """
while true; do
echo hello world
sleep 10
done
""")
task = SequentialTask(
processes = [hello],
resources = Resources(cpu = 1.0, ram = 128*MB, disk = 128*MB)
)
jobs = [
Service(
task = task,
cluster = 'devcluster',
role = 'www-data',
environment = 'prod',
name = 'hello'
)
]
Jobs without the service bit set only restart up to `max_task_failures` times and only if they
terminated unsuccessfully either due to human error or machine failure (see the
[`Job`](../reference/configuration.md#job-objects) object for details).
Ports
-----
In order to be useful, most services have to bind to one or more ports. Aurora enables this
usecase via the [`thermos.ports` namespace](../reference/configuration.md#thermos-namespace) that
allows to request arbitrarily named ports:
nginx = Process(
name = 'nginx',
cmdline = './run_nginx.sh -port {{thermos.ports[http]}}'
)
When this process is included in a job, the job will be allocated a port, and the command line
will be replaced with something like:
./run_nginx.sh -port 42816
Where 42816 happens to be the allocated port.
For details on how to enable clients to discover this dynamically assigned port, see our
[Service Discovery](service-discovery.md) documentation.
Health Checking
---------------
Typically, the Thermos executor monitors processes within a task only by liveness of the forked
process. In addition to that, Aurora has support for rudimentary health checking: Either via HTTP
via custom shell scripts.
For example, simply by requesting a `health` port, a process can request to be health checked
via repeated calls to the `/health` endpoint:
nginx = Process(
name = 'nginx',
cmdline = './run_nginx.sh -port {{thermos.ports[health]}}'
)
Please see the
[configuration reference](../reference/configuration.md#user-content-healthcheckconfig-objects)
for configuration options for this feature.
Starting with the 0.17.0 release, job updates rely only on task health-checks by introducing
a `min_consecutive_successes` parameter on the HealthCheckConfig object. This parameter represents
the number of successful health checks needed before a task is moved into the `RUNNING` state. Tasks
that do not have enough successful health checks within the first `n` attempts, are moved to the
`FAILED` state, where `n = ceil(initial_interval_secs/interval_secs) + max_consecutive_failures +
min_consecutive_successes`. In order to accommodate variability during task warm up, `initial_interval_secs`
will act as a grace period. Any health-check failures during the first `m` attempts are ignored and
do not count towards `max_consecutive_failures`, where `m = ceil(initial_interval_secs/interval_secs)`.
As [job updates](job-updates.md) are based only on health-checks, it is not necessary to set
`watch_secs` to the worst-case update time, it can instead be set to 0. The scheduler considers a
task that is in the `RUNNING` to be healthy and proceeds to updating the next batch of instances.
For details on how to control health checks, please see the
[HealthCheckConfig](../reference/configuration.md#healthcheckconfig-objects) configuration object.
Existing jobs that do not configure a health-check can fall-back to using `watch_secs` to
monitor a task before considering it healthy.
You can pause health checking by touching a file inside of your sandbox, named `.healthchecksnooze`.
As long as that file is present, health checks will be disabled, enabling users to gather core
dumps or other performance measurements without worrying about Aurora's health check killing
their process.
WARNING: Remember to remove this when you are done, otherwise your instance will have permanently
disabled health checks.