有没有办法在 Azure Durable Functions 的 Durable Entities 中安排 "Reminders"?

Is there a way to schedule "Reminders" in Durable Entities of Azure Durable Functions?

我在一个研究项目中使用 Azure Durable Functions,我想验证在 Durable Entities 中实现 Timers/Reminders 概念的最佳方法是什么。

在 Service Fabric 中,Actor 可以安排 'durable timer' 以便框架调用 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。

下面的代码将使用 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 由实体本身安排工作。