Azure Logic App并行处理Blob写入丢消息问题咨询
问题分析与解决方案
现有实现的问题
你的流程Receive from queue (auto complete) -> Get Blob Content -> Update Blob (append)存在竞态条件,这是高并发下丢消息的核心原因:
- 多个Logic App实例会同时执行
Get Blob Content,拿到的是同一版本的Blob内容 - 后续每个实例基于自己获取到的旧内容执行
Update Blob (append),会覆盖其他实例刚刚写入的内容,最终导致部分消息丢失 - 调整Concurrency Control无法解决这个问题,因为控制的是Logic App的并发实例数,但只要有多个实例同时处理并执行这套读写分离的操作,冲突就无法避免
正确的实现方式
直接使用Append to blob动作(而非先Get再Update),跳过Get Blob Content步骤:
- 将Service Bus消息的内容直接作为追加内容传入
Append to blob动作 - Azure Append Blob的追加操作是原子性的,存储服务会自动处理并发请求,确保每个消息内容都被追加到Blob末尾,不会出现覆盖或丢失的情况
- 流程简化为:
Receive from queue (auto complete) -> Append to blob
测试并发实例写入的方法
- 记录Logic App实例ID:在流程中添加
Log to Azure Monitor步骤,每次处理消息时记录当前实例的ID(可通过@workflow().run.id获取),查看日志就能知道是否有多个实例同时写入同一个Blob - 查看存储账户事务日志:在Azure门户的存储账户中,进入“监控”->“日志”,筛选
AppendBlob类型的操作,查看操作的请求ID、时间和发起方,判断是否存在并发写入 - 检查Blob属性:使用Azure Storage Explorer打开目标Blob,查看“属性”中的“最近修改时间”和“块列表”,如果有多个块在极短时间内被添加,说明存在并发写入操作
内容的提问来源于stack exchange,提问作者Damo
相关产品推荐
相关产品推荐

