.net - AWS SQS 重新处理正在进行的消息
问题描述
我有一个文件阅读器,可以将 CSV 的每一行放入 SQS;订阅了一个 .Net lambda 函数以接收每一行并单独处理它。
当一个项目完成处理(大约 1-3 秒)时,它会从队列中删除。
一旦处理了一行,它就会向系统的另一个区域发送一个数据包,但我在日志中看到的是我们正在从函数接收重复的数据包。
由于 lambda 函数同时运行;我的工作理论是,当一个函数可用于消费另一个项目时,队列项目仍在运行中 - 因此它会消费一个已经被处理的项目。
由于删除操作最后发生,我的解决方案是将删除操作移到函数的开头。
但是我担心这是否明智,好像函数在处理过程中挂起或超时,我们将完全丢失数据包。另外,如果我从队列中删除该项目;一旦解析了消息中的数据,该函数是否能够继续?
所以我的问题分为两部分
- 订阅 SQS 的 lambda 函数是否有可能在同一函数的另一个实例已经在处理它时接收飞行中的消息?
- 一旦该功能拿起它,我删除队列项目是否有任何潜在问题
解决方案
尽量避免这样的解决方案。您的函数可能会抛出异常或由于 lambda 的 5 分钟限制而被杀死,您将丢失消息
相反,我会尝试根据您的函数处理消息(或消息)所需的时间来调整可见性超时。另一方面,您可以减少听众每次阅读的消息数量(默认为 10)。因此,它会减少处理的总时间,并且处理时间将小于 visibilityTimeout(或默认情况下超时)如果您无法预测需要多少时间来处理消息,您可以在收到消息后调整(延长)visibilityTimeout .
推荐阅读
- apache - .htaccess 没有被使用 XAMPP 读取
- scrape - axesso.de REST API 不提供基于颜色选择的价格,尺寸(如变体)
- c# - SslStream.AuthenticateAsClient 或 SslStream.AuthenticateAsServer 错误:从传输流接收到意外的 EOF 或 0 字节
- javascript - 从列表中获取缺失序列的函数
- python-3.x - 如何在 np.where 中更改 dtype 和应用数学计算?
- swift - 如何使用 Swift 代码 (macOS) 发送电子邮件背景
- laravel - Laravel 依赖注入和参数传递在作业分派时工作是同步的,而在延迟时不工作
- typescript - 如何从描述它的模式创建类型?
- excel - 复制、删除重复项、粘贴 V
- sql-server - ASP.NET Core 5 搜索类别和子类别的最快方法