无法将AWS Lambda并发限制设置为1?求解决方案
解决Lambda处理S3事件时的字典数据竞态问题
先搞定Lambda并发限制:把并发设为1的正确操作
你说在编辑界面没法设置并发为1,应该是没找对配置入口。正确操作步骤是:
- 打开目标Lambda函数的控制台页面
- 切到配置标签,选择左侧菜单里的并发选项
- 在「预留并发」板块点「编辑」,输入
1后保存就行
这么设置后,这个Lambda同一时间只会跑一个实例,从根儿上避免多实例同时读写字典的竞态问题
要是并发设置搞不定,换分布式锁方案
如果预留并发设置有障碍(比如账号权限不够、配额限制),直接用分布式锁来保护字典读写更靠谱,比如用AWS DynamoDB做锁:
- 别把字典存在Lambda本地内存里,转存到DynamoDB的一张单条记录表中
- 每次更新字典前,用DynamoDB的条件表达式做锁校验,确保同一时间只有一个操作能修改
- 举个Python代码例子:
import boto3 dynamodb = boto3.resource('dynamodb') dict_table = dynamodb.Table('your-dictionary-store') def update_dict(key, value): try: response = dict_table.update_item( Key={'record_id': 'global-dictionary'}, UpdateExpression='SET #key = :val', ExpressionAttributeNames={'#key': key}, ExpressionAttributeValues={':val': value}, # 条件表达式:要么没锁,要么锁已释放 ConditionExpression='attribute_not_exists(lock) OR lock = :unlocked', ExpressionAttributeValues={':val': value, ':unlocked': False}, ReturnValues='UPDATED_NEW' ) return response except dynamodb.meta.client.exceptions.ConditionalCheckFailedException: # 锁被占用,重试或返回失败 raise Exception("Dictionary is being updated by another process")
还有个备选:调整S3事件触发方式
如果你的文件上传频率不高,可以让S3攒一批事件再触发Lambda,同时确保事件按顺序处理:
- 在S3事件通知设置里,调大「批量大小」或者设置「批量间隔」,减少触发次数
- 要是用EventBridge中转S3事件,开启事件排序功能,保证Lambda按事件产生顺序执行
内容的提问来源于stack exchange,提问作者BaoLocPham
相关产品推荐
相关产品推荐

