Azure 函数,延迟

问题描述

我有一个 CRM 系统,当添加联系人时,我想将他们添加到会计系统。

我在 CRM 系统中设置了一个 webhook,将联系人传递给 Azure 函数。 Azure 函数连接到会计系统 API 并在那里创建它们。

在将用户添加到会计系统之前,我还需要进行一些其他处理。

我需要在收到 webhook 后延迟大约 5 分钟才能将用户添加到会计系统。

我宁愿不在 Azure Function 中添加 pause 或 delay 语句,因为有超时限制,而且它是一个消耗计划,所以我希望每个函数都能快速行动。

我正在使用 Powershell 内核。

服务总线队列是实现此目的的最佳方式吗?

解决方法

服务总线队列是实现此目的的最佳方式吗?

您可以使用它,但 Azure Storage Queue 更适合您的方案。

您可以做的是创建一个时间触发函数 (* */5 * * * *) 并检查队列中的消息。如果执行和消息创建的时间间隔大于分钟,则处理并完成该消息,否则不完成该消息,它将返回队列以供下次执行。

,

您可以为此使用 Timer in a Durable Function。那么您将不需要像队列这样的额外组件。您只需要一个 Durable Function。例如(警告:未编译):

注意:Durable Functions do support powershell 但我没有 ;-) 所以下面的代码是为了理解这个概念。

[FunctionName("Orchestration_HttpStart")]
public static async Task<HttpResponseMessage> HttpStart(
  [HttpTrigger(AuthorizationLevel.Anonymous,"get","post")] HttpRequestMessage req,[DurableClient] IDurableOrchestrationClient starter,ILogger log)
{
  // Function input comes from the request content.
  string content = await req.Content.ReadAsStringAsync();
  string instanceId = await starter.StartNewAsync("Orchestration",content);

  log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
  return starter.CreateCheckStatusResponse(req,instanceId);
}

[FunctionName("Orchestration")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var requestContent = context.GetInput<string>();

    DateTime waitAWhile = context.CurrentUtcDateTime.Add(TimeSpan.FromMinutes(5));
    await context.CreateTimer(waitAWhile,CancellationToken.None);
    await context.CallActivityAsync("ProcessEvent",requestContent);
}

[FunctionName("ProcessEvent")]
public static string ProcessEvent([ActivityTrigger] string requestContent,ILogger log)
{
  // Do something here with requestContent

  return "Done!";
}

我宁愿不在 Azure Function 中添加 pause 或 delay 语句,因为有超时限制,而且它是一个消耗计划,所以我希望每个函数都能快速行动。

计时器引入的 5 分钟延迟不会算作活动时间,因此您不会用完这些分钟的消费计划。