【问题标题】:AWS SQS with a single worker?AWS SQS 与单个工作人员?
【发布时间】:2019-04-22 15:30:48
【问题描述】:

我正在努力在 AWS 环境中建立一个队列,其中任务由 一个 Lambda / worker 使用。

AWS Lambda automatically scales 但我不希望这样。问题是该函数对数据库进行了一些复杂的更改,并且可能存在竞争条件。不幸的是,这超出了我的控制范围。

因此更容易确保有一个工人,而不是解决复杂的 SQL 问题。所以我想要的是每当队列中有消息时,单个工作人员接收消息并按顺序完成任务。顺序无关紧要。

【问题讨论】:

  • 理论上,SQS 消息只被一个消费者消费,不是吗?
  • 当我将它连接到我的 lambda 时,它只是水平缩放并且消息同时处理......还是并行处理?这会给我带来竞争条件。

标签: amazon-web-services aws-lambda amazon-sqs serverless


【解决方案1】:

将 Lambda 函数上的 concurrency limit 设置为 1

【讨论】:

  • 好点 - 虽然我一直明白,如果你这样做,SQS 仍然会以 5 次/时间发送消息,其中 4 个将失败并被重新驱动,这(取决于你的配置)最终会被转储到 DLQ 中(参考:jeremydaly.com/…
【解决方案2】:

正如您所注意到的,“内置”SQS 从至少 5 个工作人员开始并逐步扩大。

不过,我有两个建议给你:

  • 如果您只有一个分片,那么 kinesis(批量大小为一项)将确保按顺序执行。这是因为 Kinesis 是由分片并行的(一个分片每秒可以处理 1000 条记录,所以只有一个可能没问题!)并且内置的 lambda 触发器采用可自定义的批量大小(可以是 1)并等待在下一批之前完成。
  • 如果您需要使用 SQS,那么“旧”集成方式(在 SQS 触发器之前)将为您提供“最有可能”的顺序执行。这是您实际上Scheduled CloudWatch Event 上触发 lambda 的时候,它允许您有一个 lambda 每 X(由您配置)检查队列。这里的挑战是,如果 X 比处理消息所需的时间短,那么第二个 lambda 将并行运行(有一些模式,例如让 X = lambda 的超时,并且只让你的 lambda 运行5 分钟通过队列,一次一条消息)。

【讨论】:

  • 谢谢,我现在正在研究 Kinesis Data Stream。我的另一个问题是如何避免流中的重复记录?
  • 顺便说一句,lambda 可能需要一个大批量来逐个处理,因为我认为这比每个触发 lambda 执行的任务更好。 Lambda 的 15 分钟超时对于预期的典型工作负载应该绰绰有余。
  • 这取决于您(总和执行时间不可能有太大变化,因此成本)-但您应该注意到 Kinesis 无法“确认”,因此您可以重试(或转储)整个批次错误;这使得 1-by-1 听起来更适合我对您的用例的理解。
  • 至于重复 - 如果您需要去重,可能最好的模式(注意 SNS 或 SQS 都不会这样做)是使用 DynamoDb。鉴于任务可以由 id 唯一标识,您可以将任务写入 DDb,然后在 dynamo 流上使用“INSERT”事务(即忽略 UPDATE/DELETE),这只会在唯一任务 id 第一次发生时发生被调用。
  • 无需为此从 SQS 切换到 Kinesis,也无需停止使用内置的 SQS/Lambda 集成。您只需在 Lambda 函数的设置中将并发限制设置为 1
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 2021-08-22
  • 2017-02-23
  • 2023-03-09
  • 2021-01-11
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多