gpt4 book ai didi

azure - 有没有办法在Azure Durable Functions的持久实体中安排 "Reminders"?

转载 作者:行者123 更新时间:2023-12-02 19:12:04 24 4
gpt4 key购买 nike

我在一个研究项目中使用 Azure Durable Functions,我想验证在持久实体中实现计时器/提醒概念的最佳方法是什么。

在 Service Fabric 中,Actor 可以安排“持久计时器”,以便框架可以调用 Actor 本身的方法。我正在寻找类似的概念。

考虑为我的系统中的每个设备创建一个持久实体。我希望每个参与者都按计划运行功能,并自行安排。 (我想避免使用需要为每个设备安排任务的编排功能,而只是让实体自行运行任务)。

这是允许的、可能的或预见的事情吗?

希望这个问题足够清楚,但很乐意在需要时提供更多背景信息。

最佳答案

来自the docs :

To invoke an operation on an entity, specify the [....] Scheduled time, which is an optional parameter for specifying the delivery time of the operation. For example, an operation can be reliably scheduled to run several days in the future. So there is an option to schedule invocations of the entities

但是,您希望从持久实体内部进行安排。这也可以通过使用 Entity.Current.SignalEntity ( docs ) 实现。此方法作为重载,接受 DateTime,该 DateTime 指定开始操作的时间。

下面的代码将使用 http 触发函数开始递增计数器。在 azure 函数首次启动后,该实体将每 5 秒为自己安排一次操作。

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace FunctionApp3
{
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[DurableClient] IDurableEntityClient client,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");

// Tell the Durable Entity to increase a counter
await client.SignalEntityAsync<ICounter>("aKey", e => e.IncreaseCount(1));

return new OkResult();
}
}

public interface ICounter
{
void IncreaseCount(int amount);
}

[JsonObject(MemberSerialization.OptIn)]
public class Counter : ICounter
{
private readonly ILogger _log;

public Counter(ILogger<Counter> log)
{
_log = log;
}

[JsonProperty("value")]
public int CurrentValue { get; set; }

public void IncreaseCount(int amount)
{
this.CurrentValue += amount;

if(this.CurrentValue) > 10
return;

// Schedule a call to this entity to IncreaseCount after 5 seconds.
// Once the method is called, schedule it again to create the effect of a timer
Entity.Current.SignalEntity<ICounter>(Entity.Current.EntityId, DateTime.Now.AddSeconds(5), e => e.IncreaseCount(1));
_log.LogInformation(this.CurrentValue.ToString());
}

[FunctionName(nameof(Counter))]
public static Task Run([EntityTrigger] IDurableEntityContext ctx)
{
return ctx.DispatchAsync<Counter>();
}
}
}

这只是一个粗略的示例,但要点是使用 Entity.Current.SignalEntity 来安排实体本身的工作。

关于azure - 有没有办法在Azure Durable Functions的持久实体中安排 "Reminders"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64144839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com