Azure持久函数是否要持久化状态?

x8diyxa7  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(103)

我正在尝试执行以下任务:

  • 如果在过去24小时内未成功执行该操作,则执行该操作存储结果(成功/失败和时间)
  • 在15分钟内重复(永远)

理想情况下,我不想使用外部存储(节省成本),因为我需要存储的只是运行之间的字符串。但是,我确实需要保证状态(每次运行返回的字符串)在运行之间保持不变。
我有两个问题:

  1. Azure耐久函数是否适合此任务?
    1.如果没有,我的选择是什么?
    1.如果是的话,下面的代码是否可以做到这一点(以“正确”的方式)?
[FunctionName("MyOrchestratorFunction")]
public static async Task<string> RunOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context)
{
    // Get the state from the context
    string state = "some intitial value";

    // Perform some action
    string result = await context.CallActivityAsync<string>("MyActivityFunction", state);

    // Store the result in the state
    state = result;

    // Wait for 15 minutes
    await context.CreateTimer(context.CurrentUtcDateTime.AddMinutes(15), CancellationToken.None);

    // Call the orchestrator function again with the updated state
    return await context.CallActivityAsync<string>("MyOrchestratorFunction", state);
}

[FunctionName("MyActivityFunction")]
public static string RunActivity(
    [ActivityTrigger] string state)
{
    // Perform some action using the state

    return result;
}
tct7dpnv

tct7dpnv1#

回答哈维关于持久实体的第二个问题:

实体函数Orchestrator Data.cs

public class OrchestrationData : IOrchestrationData
{
    [JsonProperty("orchestrationId")]
    public string OrchestrationId { get; set; }

    public void SetOrchestrationId(string orchestrationId)
    {
        OrchestrationId = orchestrationId;
    }

    [FunctionName(nameof(OrchestrationData))]
    public static Task Run([EntityTrigger] IDurableEntityContext context)
        => context.DispatchAsync<OrchestrationData>();
}

协调器

...
    EntityId entityId = new EntityId(nameof(OrchestrationData),
    IOrchestrationData proxy = context.CreateEntityProxy<IOrchestrationData>(entityId);
    proxy.SetOrchestrationId("a1b2c3");
...

请注意,您的状态属性是正确的可序列化对象。我在使用string[]这样的基元数组时遇到了问题。

相关问题