如何避免Azure HTTP触发函数并发执行导致重复记录?
解决Azure Function并发重复写入Google Sheet的方案
以下几个简单方案可以解决你的问题:
强制Function单实例运行
直接在Azure Portal里找到你的Function App,进入「配置」-「应用程序设置」,添加或修改WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT参数,值设为1。这样不管外部发多少请求,Function只会启动一个实例处理,所有请求都会串行执行,从根源避免并发检查的问题。这个方案零代码改动,适合快速解决问题。用Azure Blob实现分布式锁
针对每个请求的查询参数,生成唯一的锁标识(比如用参数哈希值当Blob名称)。处理请求前,先尝试获取这个Blob的租赁(Lease),租赁有效期设成你处理请求的最长耗时(比如30秒)。只有成功拿到租赁的请求才继续执行检查和写入操作,没拿到的直接返回「请求已在处理中」或者稍作重试。这种方式不会影响不同查询参数的请求并发,比单实例更灵活,代码改动也不大。转用队列触发串行处理
修改HTTP触发的Function,不要直接处理写入逻辑,而是把请求的查询参数写入Azure Storage Queue。然后新建一个Queue触发的Function,在host.json里配置extensions.queues.batchSize和extensions.queues.newBatchThreshold为1,限制它的并发数为1。Queue触发的Function会逐个取出消息处理,天然串行,而且还能自动重试失败的请求,避免丢数据。
内容的提问来源于stack exchange,提问作者Hawos
相关产品推荐
相关产品推荐

