问题描述
我有一个 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 分钟延迟不会算作活动时间,因此您不会用完这些分钟的消费计划。