Azure Durable Function Activity 似乎运行多次且未完成
Posted
技术标签:
【中文标题】Azure Durable Function Activity 似乎运行多次且未完成【英文标题】:Azure Durable Function Activity seems to run multiple times and not complete 【发布时间】:2020-05-29 14:26:52 【问题描述】:我有一个耐用的功能扇出和输入模式,它似乎不能可靠地工作。 Orchestration 每 10 分钟从 Timer 函数调用一次,但此后增加到 20。 Activity 函数使用 context.CallActivityAsync 调用并返回一个整数(处理的行数)。目前,传入的 workItems 应该只包含 2 个要处理的项目。第一项处理所有行并在日志中显示完整。第二项有时会显示正在处理的行,但在某些时候它只是停止了......没有其他活动被识别,并且“完成”永远不会出现在日志中。此外,第二个活动有时会显示它同时运行多次...... 我已经在我的开发机器上使用相同的数据尝试了这个确切的代码,它处理完成的时间不超过 5 分钟。我还将 hosts.json 文件设置为
"version": "2.0",
"functionTimeout": "00:10:00",
"extensions":
"queues":
"maxPollingInterval": "00:00:05"
编排:
public static async void RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
log.LogInformation($"************** Fanning out ********************");
var parallelTasks = new List<Task<int>>();
//object[] workBatch = await context.CallActivityAsync<object[]>("GETVendors", null);
object[] workBatch = GETVendors(log); //work batch only has 2 items
for (int i = 0; i<workBatch.Length; i++)
Task<int> task = context.CallActivityAsync<int>("SynchVendor", workBatch[i]);
parallelTasks.Add(task);
log.LogInformation($"************** 'Waiting' for parallel results ********************");
await Task.WhenAll(parallelTasks);
log.LogInformation($"************** All activity functions complete ********************");
log.LogInformation($"************** fanning in ********************");
int cnt = 0;
foreach (var completedParallelActivity in parallelTasks)
cnt += completedParallelActivity.Result;
log.LogInformation($"Total Records Converted across all tasks = cnt");
//return outputs;
活动功能
public static async Task<int> SynchVendor([ActivityTrigger] string vendor, ILogger log)
log.LogInformation($"SynchVendor vendor");
string sqlStr = Environment.GetEnvironmentVariable("Sqldb_Connection");
bool dev = Convert.ToBoolean(Environment.GetEnvironmentVariable("Dev"));
int totalCount = 0;
using (SqlConnection conn = new SqlConnection(sqlStr))
conn.Open();
// lets synch the vendor
Int32 limit = 200;
bool initialLoad = false;
int offset = 0;
bool done = false;
do
//synch logic...
// if there are rows found to have changed then send them to a queue for further processing
while (!done);
// we are done syncing a vendor write out the vendorinfo
conn.Close();
log.LogInformation($"SynchVendor vendor Complete");
return totalCount;
【问题讨论】:
【参考方案1】:对于额外的日志记录,你需要在你的 log.Log*** 操作前添加这个:
if (!context.IsReplaying)
更多信息请参见https://docs.microsoft.com/en-us/sandbox/functions-recipes/durable-diagnostics#logging-in-orchestrator-functions。
对于你永远看不到完成的问题,你可以做一些事情:
-
您没有错误处理。如果您的活动函数抛出异常会发生什么?您应该使用带有日志的 Try/Catch 来让您知道什么时候失败了。
功能日志显示什么?请注意,我不是在谈论 customDimensions.Category=="User" 的日志(即您的日志条目),而是在 Functions 运行时执行的日志。在您的 appinsights 日志中,在适当的时间范围内运行“联合跟踪 | 联合异常”,以查看 Functions 运行时在做什么。
尝试添加一个超时任务,这样即使您的其中一项任务没有完成,您的协调器也能完成。见https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-error-handling?tabs=csharp#function-timeouts。
【讨论】:
谢谢 kwill,我确实有 Try/Catch 错误处理,在捕获时会创建一个带有 e.message 的日志。迄今为止,我没有收到任何错误日志。对日志的检查显示没有异常,但在处理重复条目的地方有大量跟踪:处理了 SynchVendor 800,毫秒后处理了 SynchVendor 800 ... 然后处理了另一组 SynchVendor 1000,处理了 SynchVendor 1000 ... 它应该大约5000 但它永远不会超过 1400 然后停止。 (它也不应该与相同的供应商 ID 并行运行)。以上是关于Azure Durable Function Activity 似乎运行多次且未完成的主要内容,如果未能解决你的问题,请参考以下文章