Azure Durable Function raise-event内存缓冲区存储时长及相关疑问
内部来说,"raise-event" API 会将消息排入队列,由等待中的编排器函数拾取。如果实例并未在等待指定的事件名称,事件消息会被添加到内存缓冲区中。如果编排实例之后开始监听该事件名称,它会检查缓冲区中的事件消息并触发等待该事件的任务。
疑问与解答
疑问1:当实例未处于等待状态时,事件存入内存缓冲区是否意味着未持久化?若未持久化,系统重启或崩溃时事件是否会丢失?
答:这里的"内存缓冲区"是逻辑概念,并非进程内的临时内存。Durable Functions 底层依赖后端持久化存储(默认是Azure Storage)保存所有事件消息,所以即使系统重启或崩溃,事件也不会丢失,后续实例恢复后仍能读取到这些事件。疑问2:若事件已持久化,其存储位置及保留时长是多少?
答:事件会持久化到你配置的Durable Functions后端存储中,默认是Azure Storage的队列和控制表:未被处理的事件先进入队列,若未被及时拾取,会转移到控制表留存。
保留时长可配置:Azure Storage队列默认消息保留期为7天(最长可设7天);控制表中的事件记录默认随编排实例留存90天,可通过DurableTask:StorageProvider:RetentionDays等配置项调整留存周期。疑问3:我的场景为主编排器尚未调用
WaitForExternalEvent函数,而子编排器已调用RaiseEventAsync,请问主编排器是否会无限期处于等待状态?
答:不会。首先要明确:子编排器调用RaiseEventAsync如果是给主编排器发事件,这个事件会被持久化存储;但主编排器只有在调用对应事件名的WaitForExternalEvent时才会进入等待状态——如果调用时存储里已有该事件,会立即触发处理;如果主编排器永远不调用这个函数,它不会进入等待状态,事件会一直存在于存储中直到过期被清理。
内容的提问来源于stack exchange,提问作者Sam

