如何配置Azure服务总线主题订阅函数仅单实例运行?
解决Azure服务总线订阅函数并发重复写入数据库的问题
方案1:限制函数为单实例运行
可以直接通过Azure门户配置函数应用的缩放规则,强制仅运行单个实例:
- 进入目标函数应用的配置页面,切换到常规设置标签
- 将缩放模式改为「手动」,然后把实例计数设为1
- 这样所有消息都会被同一个实例处理,不会出现同ID消息并发执行的情况
注意:这种方式会牺牲处理吞吐量,如果消息量较大,容易造成消息堆积,仅适合低负载场景。
方案2:数据库层面加唯一性约束(推荐)
从根源上避免重复写入,最可靠的方式是在数据库表上针对消息ID字段添加唯一约束或设为主键:
- 当第二条同ID消息尝试写入时,数据库会直接抛出唯一性冲突异常
- 在函数代码中捕获该异常,根据业务需求选择:丢弃重复消息、标记消息处理失败,或者将插入逻辑改为更新逻辑(如果业务是要更新现有记录)
这种方法不影响函数的并发能力,同时从数据层面保证了唯一性,是生产环境的首选方案。
方案3:利用服务总线会话锁(需协调发送方)
如果需要保证同ID消息的处理顺序,且能协调发送方修改消息发送逻辑,可以给主题订阅启用会话:
- 在Azure服务总线的主题订阅设置中开启「会话支持」
- 让发送方将消息的
SessionId设置为消息中的ID值 - 此时服务总线会将同SessionId的消息按顺序投递,同一时间只有一个实例能处理该会话下的消息,避免同ID消息并发处理
但由于你无法控制发送方,这个方案的适用性有限。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

