Azure函数:编排器和活动最佳实践



你好,

我的问题主要是关于使用"活动"one_answers"编排器"函数的最佳实践。这里没有找到答案-微软文档

简而言之-我有一个简单的协调器:

  • 从API检索一些对象列表(使用"活动"(
  • 处理这些项目(筛选和排序((直接在Orchestrator中(
  • 将已处理的项目发送到另一个API(使用"活动"(

问题:Orchestrator中的两个API调用(等待上下文.CallActivityAsync(((都是异步的,执行需要一些时间。函数框架从内存中卸载编排器(我正在执行消耗计划(,并从头开始回放(这是意料之中的(。每个重播编排器都会从上下文中获取vars上的保存状态(如果已经执行(。CallActivityAsync((调用,但不是来自本地变量(例如下面示例中的对象StartWithA、对象StartWithB和filteredObjects(。它不会破坏任何东西,但在每次回放(如果有的话(时都会一遍又一遍地做同样的事情。我是否需要将所有业务逻辑提取到Activities并使用等待上下文调用它们。调用ActivityAsync((?

namespace Demo.Functions
{
public class FunctionClass
{
public const string FunctionName = "Function1";
private readonly ILogger<FunctionClass> _logger;
public FunctionClass(
ILogger<FunctionClass> logger)
{
_logger = logger;
}
[FunctionName(FunctionName)]
public async Task ExecuteAsync([OrchestrationTrigger] IDurableOrchestrationContext context)
{
var logger = context.CreateReplaySafeLogger(_logger);
logger.LogInformation("Process started");
var someObjects =
(await context.CallActivityAsync<IEnumerable<ApiObject>>("GetApiObjectsAsync", null)).ToList();
var objectsStartWithA =
someObjects
.Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith("a", StringComparison.OrdinalIgnoreCase))
.OrderBy(x => x.Name)
.ToList();
var objectsStartWithB =
someObjects
.Where(x => !string.IsNullOrEmpty(x.Name) && x.Name.StartsWith("b", StringComparison.OrdinalIgnoreCase))
.OrderBy(x => x.Name)
.ToList();
var objectsToCompare = objectsStartWithA.Union(objectsStartWithB);

//Long-running api request
var someOtherObjects =
(await context.CallActivityAsync<IEnumerable<ApiObject>>("GetOtherApiObjectsAsync", null)).ToList();
var filteredObjects =
someOtherObjects
.Where(x => objectsToCompare.All(z => z.Id != z.Id))
.OrderBy(x => x.Id)
.ToList();

//Saving
await context.CallActivityAsync("SaveObjects", filteredObjects);
logger.LogInformation("Process finished");
}
}
public class ApiObject
{
public int Id { get; set; }
public string Name { get; set; }
}
}

谢谢!

我会把它们推到一个"活动"中,并让编排器纯粹协调各种活动。在您给出的示例中,我只想更改GetApiObjectsAsync活动以返回所需的过滤形式的数据,而不是引入另一个活动tbh。IMHO,这只会在编排工作流中产生额外/不必要的步骤&不需要的状态存储。

也许你的例子被简化了,但看起来你只关心objectsToCompare——它是以"a"或"b"开头的对象。因此,在返回之前,在现有的活动函数中应用一个过滤器就可以完成任务。

最新更新