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.startduration 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.startproperty no longer applies. Instead, thetimeouts.finishduration begins. - Once started, the
timeouts.finishduration limits how long a run can execute - Both properties can be stacked to control the overall length of a function run