Cancel on timeouts
It's possible to force runs to cancel if they take too long to start, or if the runs execute for too long. The timeouts
configuration property allows you to automatically cancel functions based off of two timeout properties:
timeouts.start
, which controls how long a function can stay unstarted in the queuetimeouts.finish
, which controls how long a function can execute once started
In the following examples, we'll explore how to configure the timeout property and how this works.
timeouts.start
- Adding timeouts to unstarted runs
Runs may stay in the queue waiting to start due to concurrency backlogs, throttling configurations, or other delays. You can cancel functions automatically if they stay unstarted for too long.
The timeouts.start
configuration property controls this timeout. This example forces runs to cancel if it takes over 10 seconds to successfully start the first step of a run:
inngest/function.ts
const scheduleReminder = inngest.createFunction(
{
id: "schedule-reminder",
timeouts: {
// If the run takes longer than 10s to start, cancel the run.
start: "10s",
},
}
{ event: "tasks/reminder.created" },
async ({ event, step }) => {
await step.run('send-reminder-push', async () => {
await pushNotificationService.push(event.data.reminder)
})
}
// ...
);
timeouts.finish
- Adding timeouts to executing runs
You may want to limit the overall duration of a run after the run starts executing. You can cancel functions automatically if they're executing for too long.
The timeouts.finish
configuration property controls this timeout. This example forces runs to cancel if it takes over 30 seconds to finish, once started:
inngest/function.ts
const scheduleReminder = inngest.createFunction(
{
id: "schedule-reminder",
timeouts: {
// If the run takes longer than 10s to start, cancel the run.
start: "10s",
// And if the run takes longer than 30s to finish after starting, cancel the run.
finish: "30s",
},
}
{ event: "tasks/reminder.created" },
async ({ event, step }) => {
await step.run('send-reminder-push', async () => {
await pushNotificationService.push(event.data.reminder)
})
}
// ...
);
Tips
- The
timeouts.start
duration limits how long a run waits in the queue for the first step to start - Once the first attempt of a step begins, the
timeouts.start
property no longer applies. Instead, thetimeouts.finish
duration begins. - Once started, the
timeouts.finish
duration limits how long a run can execute - Both properties can be stacked to control the overall length of a function run