Azure WebJobs:如何强制函数按时 运行

Azure WebJobs: how to force a function to run on schedule

我有一个连续的网络作业,其中包含一个函数,其 TimerTrigger 配置为每分钟 运行:

public static async Task TestFunction([TimerTrigger("0 * * * * *")] TimerInfo info)
{
    Console.WriteLine($"{DateTime.UtcNow:s}: beginning to process the function...");

    // Imitate a long processing
    await Task.Delay(75 * 1000);

    Console.WriteLine($"{DateTime.UtcNow:s}: finished processing the function");
}

假设第一次调用是在 00:00:00。 然后,由于函数 运行 超过一分钟,下一次调用已过期并在 00:01:15 触发。下一个在 00:02:30 等等

我希望该函数能够按计划准确调用,即使它会导致两个函数 运行 并行调用。
Multiple instances section 在 WebJobs SDK 文档中指出:

"The timer trigger automatically ensures that only one instance of the timer runs, so you don't get more than one function instance running at a given scheduled time"

有什么办法可以改变这种行为吗?
或者我应该使用其他东西来实现所需的行为吗? (计划的 WebJob、Azure Function 或其他一些服务?)

我已经通过引入队列并将函数拆分为两个:生产者和消费者解决了这个问题。

第一个函数按计划触发,只是将消息放入队列:

public static async Task TestProducer([TimerTrigger("0 * * * * *")] TimerInfo info)
{
    var startTime = DateTime.UtcNow;
    var message = new BrokeredMessage(startTime);
    var queueClient = QueueClient.CreateFromConnectionString("ServiceBusConnString", "queue-name");
    await queueClient.SendAsync(message);
}

第二个函数执行实际工作:

public static async Task TestConsumer([ServiceBusTrigger("queue-name")] DateTime startTime)
{
    Console.WriteLine($"{DateTime.UtcNow:s}: beginning to process the function for startTime={startTime}");

    // Imitate a long processing that depends on a startTime
    await Task.Delay(75 * 1000);

    Console.WriteLine($"{DateTime.UtcNow:s}: finished processing the function for startTime={startTime}");
}

当第一个函数将新消息加入队列而第二个函数仍在工作时,将调用第二个函数的新实例。