文件上传后通过事件源自动触发lambda或functions:aws用s3事件(如s3:objectcreated:*)绑定桶,azure用blobtrigger绑定容器;需注意权限、超时和内存配置。

文件上传后怎么触发 Lambda 或 Functions 执行
触发靠事件源,不是轮询也不是手动调用。AWS Lambda 通常绑定 S3 事件(如 s3:ObjectCreated:*),Azure Functions 则用 BlobTrigger 绑定存储账户的容器。
- AWS:上传文件到指定
S3桶 → 自动触发 Lambda,事件中带bucket和key,别硬编码路径 - Azure:函数签名必须含
string myBlob参数或Stream,绑定字符串是path/to/container/{name},{name} 会自动注入 - 常见错误:
AccessDenied(Lambda 执行角色没s3:GetObject)、FunctionTimeout(大文件流式读取没设超时或内存不足) - 小文件(MemoryStream;大文件务必用
Stream+ 分块处理,避免OutOfMemoryException
怎么在无服务器环境安全读取和解析文件内容
不能依赖本地路径或 File.OpenRead,所有 I/O 必须走云存储 SDK 提供的异步流接口。
- AWS:用
AmazonS3Client.GetObjectAsync获取GetObjectResponse.ResponseStream,别调Stream.CopyTo到MemoryStream再解析——大 CSV/JSON 会爆内存 - Azure:
BlobClient.DownloadStreamingAsync返回Response<stream></stream>,直接传给StreamReader或JsonSerializer.DeserializeAsync - 编码陷阱:S3 默认不存
Content-Type或Content-Encoding,CSV 文件若含中文,必须显式指定Encoding.UTF8,否则乱码 - 不要用
File.ReadAllText、File.ReadAllBytes—— 这些在无服务器环境会抛UnauthorizedAccessException或找不到路径
如何避免冷启动导致文件处理延迟突增
冷启动本身无法消除,但能减少它对文件处理链路的影响。
- 保持函数常驻:AWS 可启用
Provisioned Concurrency,Azure 开启Always On(仅 Premium 计划支持) - 别在
Startup或构造函数里初始化重对象(如HttpClient实例、大型词典)——改用static readonly或Lazy<t></t> - 日志别打太多:每条
Console.WriteLine或ILogger.Log都会触发 CloudWatch / Application Insights 的 IO,积少成多拖慢首字节响应 - 冷启动时首次解析 JSON 可能慢 300–800ms,用
System.Text.Json而非Newtonsoft.Json,前者冷启动开销低约 40%
错误怎么捕获、重试和通知
无服务器函数失败 ≠ 重试成功,得自己控制语义重试和死信边界。
- AWS:S3 触发默认重试 3 次(含初始执行),失败进
DeadLetterQueue(需手动配 SQS 或 SNS);别依赖自动重试来扛网络抖动,HTTP 调用要用HttpClient+Polly做内部重试 - Azure:BlobTrigger 默认最多 5 次重试,失败进
poison容器(路径为webjobs-blobtrigger-poison),得另写函数监听该容器做告警 - 文件解析失败(如 JSON 格式错)必须
catch并记录原始key和bucket,否则根本不知道哪条数据坏了 - 别在函数里发邮件或调短信 API —— 超时风险高,应写入
EventBridge或Service Bus,由下游服务统一通知
真正难的不是读文件,而是当一个 200MB 的 Excel 上传后,Lambda 内存设 1024MB 仍 OOM,而你发现 EPPlus 库默认把整表加载进内存——这种细节,查文档不如看 GitHub Issues。











