You can host a serverless function in Azure in two different modes: Consumption plan and Azure App Service plan. The Consumption plan automatically allocates compute power when your code is running. Your app is scaled out when needed to handle load, and scaled down when code is not running. You don’t have to pay for idle VMs or reserve capacity in advance.
The consumption plan is likely the one you opted to use. You get 1 million free executions and 400,000 GB-s of resource consumption per month and pay-as-you-go pricing beyond that. It can also scale massively. The downside of using the consumption plan is that if there is no activity after five minutes (the default), your code will be unloaded by the Azure Functions host. The next time your function is invoked, your function will be loaded from scratch. I’ve experienced start up times ranging from a few seconds to several minutes.
With version 1.x of Azure functions you can raise the unload functiontimeout
to 10 minutes in the host.json settings file.
If you want to keep your functions in memory, you either need to be calling them more frequently than the function timeout setting, or you could create another function in the same app. service plan that gets called periodically using a timer trigger:
using System; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; namespace SQLFrontlineLoaderFunctionApp { public static class KeepAliveTimerFunction { // Timer trigger is in UTC timezone [FunctionName("KeepAliveTimerFunction")] public static void Run([TimerTrigger("0 */9 * * * *")]TimerInfo myTimer, TraceWriter log) { log.Info($"Alive: {DateTime.Now}"); } } }
This empty function will be called every 9 minutes (“0 */9 * * * *”). You could also keep your functions warm during a certain period during the day. This timer trigger cron expression would run every 9 minutes between 4am and 10am (UTC time zone): TimerTrigger(“0 */9 4-10 * * *”)]
Refs.