C# Azure功能问题

C# Azure功能问题,c#,azure-functions,C#,Azure Functions,因此,一位同事离开了我工作的企业,我不得不接受他负责的一些项目。 有一个项目是基于Azure功能(v1)的,但我并不完全理解它 该项目的重点是每晚在数据库上运行一些代码(统计、重建索引等) 所以它是这样组织的 RunTimerTrigger([TimerTrigger("0 30 0 * * *")]TimerInfo myTimer, [OrchestrationClient] DurableOrchestrationClient starter, ILogger log) For e

因此,一位同事离开了我工作的企业,我不得不接受他负责的一些项目。 有一个项目是基于Azure功能(v1)的,但我并不完全理解它

该项目的重点是每晚在数据库上运行一些代码(统计、重建索引等)

所以它是这样组织的

RunTimerTrigger([TimerTrigger("0 30 0 * * *")]TimerInfo myTimer, [OrchestrationClient] DurableOrchestrationClient starter, ILogger log)
    For each database: starter.StartNewAsync(DurableTenantFunction, tenantInfo);

[FunctionName(DurableTenantFunction)]
RunOrchestrator([OrchestrationTrigger] DurableOrchestrationContextBase context,
            [Queue(FunctionConstants.DurableMidnightScriptQueue, Connection = "ServerFunctionsStorage")]
    Call activity 1 (context.CallActivityAsync)
    Call activity 2
    Call activity 3
    //Put message in queue to start trigger the scripts for the DB
    await outputQueue.AddAsync(tenantInfo);

RunOrchestratorClient([QueueTrigger(FunctionConstants.DurableMidnightScriptQueue)] TenantInfo tenantInfo,
        [OrchestrationClient] DurableOrchestrationClient starter
    Call activity 4
    Call activity 5
    Call activity 6
所以我们有一个计时器,每晚0:30开火。它获取我们必须更新的数据库,然后运行orchestrator。编排器调用一些活动,然后在队列中添加消息。 此队列触发另一个OrchestratorClient,该OrchestratorClient触发三个以上的活动。(Orchestrator 1主要用于更新统计数据,Orchestrator 2主要用于优化数据库(休眠会话、索引等)

我们注意到在午夜脚本的行为中有一些奇怪的东西(我们称之为这部分代码的名称),所以我添加了一些日志来检查行为

//Log start activity 1 for database x
start activity 1
// Log end activity 1 for database x
// Log start activity 2 for database x
...
根据日志,计时器每天晚上都会像预期的那样触发,但是在orchestrator中有非常奇怪的行为,我们有大约100个开始活动1,但没有那么多结束活动1。在我们最大的数据库中,活动4、5、6不会像一晚超过两晚那样到达

你们知道发生了什么吗?你们有没有关于更好的体系结构的线索,使用函数每天晚上在数据库上运行一些代码

如果你还有其他问题,尽管问吧


非常感谢

是的。登录持久功能可能会很奇怪

当业务流程函数有更多的工作要做时(例如,收到响应消息或持久计时器过期),业务流程器将从一开始就唤醒并重新执行整个函数以重建本地状态。在重播期间,如果代码尝试调用某个函数(或执行任何其他异步工作),持久任务框架将查阅当前业务流程的执行历史记录。如果发现“活动”函数已执行并产生结果,则将重播该函数的结果,并且业务流程代码将继续运行。重播将继续,直到功能代码完成或已安排新的异步工作

此“重播”行为对日志记录有一些影响。特别是,如果orchestrator函数发出日志消息,重播行为可能会导致发出重复的日志消息。请快速阅读


因此,很可能您看到了重复的日志消息。

是的。登录持久功能可能会很奇怪。引用

当业务流程函数有更多的工作要做时(例如,收到响应消息或持久计时器过期),业务流程器将从一开始就唤醒并重新执行整个函数以重建本地状态。在重播期间,如果代码尝试调用某个函数(或执行任何其他异步工作),持久任务框架将查阅当前业务流程的执行历史记录。如果发现“活动”函数已执行并产生结果,则将重播该函数的结果,并且业务流程代码将继续运行。重播将继续,直到功能代码完成或已安排新的异步工作

此“重播”行为对日志记录有一些影响。特别是,如果orchestrator函数发出日志消息,重播行为可能会导致发出重复的日志消息。请快速阅读


很可能正是由于此原因,您看到了重复的日志消息。

我认为这是一种很好的方法。谈到目前的问题,我认为RunOrchestratorClient应该启动其他编排器,而不是活动函数。对吗?另外,要了解发生了什么,您可以尝试检查查看发生了什么。我认为这是一种很好的方法。谈到手头的问题,我认为
RunOrchestratorClient
应该启动其他编排器,而不是活动功能。对吗?此外,要了解更多关于发生了什么的信息,您可以尝试检查以查看发生了什么。