如何扇出 SQS
How to Fan-Out SQS
我有多个源正在将原始数据推送到 S3。我已经在我的 S3 存储桶上配置了 SQS 事件通知。
问题是滞后和限制。
我预计在不久的将来会有更多的来源,并且由于我们只能从 SQS 的一次轮询中获得 10 条消息,我认为在不久的将来会有更多的来源将数据推送到 S3 , 那么 SQS 将充满数千条消息,我将无法更快地处理它们。
我正在考虑通过将消息从我的主 SQS 队列传播到更多 SQS 队列来扇出 SQS,以便我的处理层可以轮询多个队列,例如:5 个队列并处理更多消息。
可能的方法应该是什么?
将消息扇出到多个 sqs 队列的典型方法是使用 SNS。
s3 事件通知将转到 SNS 而不是 SQS,并且 SNS 将负责将这些消息散布到任意数量的队列中。
也就是说,我不确定我是否理解为什么您认为使用多个消息队列可以更快地处理消息。
由多个处理客户端轮询的单个队列 SQS 队列或使用多线程的单个客户端可能都是提高处理速度的更好方法,而不是简单地引入更多队列。
"... since we can get only 10 Messages in a single poll from SQS...I am thinking to fan-out sqs like spreading the message to more SQS queues from my master SQS queue, so that my processing layer can poll multiple queues eg : 5 queues and process more messages."
简短回答:不要这样做。
原因如下:
是的,一次投票最多可以检索 10 条消息。但是,您可以让 多个线程和多个主机都轮询一个队列 。让您的消费者并行 运行 是这里的关键,因为处理队列条目将是您的瓶颈 - 而不是从队列中检索条目。单个 SQS 队列可以处理大量轮询线程。
您提出的多队列扇出有很多缺点:
- 编码和操作更复杂
- 较慢 - 项目将不得不经历从您的主队列(或 SNS,如果您使用它)传输到消费队列的开销
- 更贵 - 每条消息的 SQS 费用。 SNS 按每条消息收费。
- 您必须自己处理重复 - 对于单个队列,SQS 内置的可见性超时将主要阻止其他消费者处理相同的项目。对于多个队列,您必须想出自己的重复数据删除策略
- 只需使用一个队列。以后你会感谢我的。
我有多个源正在将原始数据推送到 S3。我已经在我的 S3 存储桶上配置了 SQS 事件通知。 问题是滞后和限制。
我预计在不久的将来会有更多的来源,并且由于我们只能从 SQS 的一次轮询中获得 10 条消息,我认为在不久的将来会有更多的来源将数据推送到 S3 , 那么 SQS 将充满数千条消息,我将无法更快地处理它们。
我正在考虑通过将消息从我的主 SQS 队列传播到更多 SQS 队列来扇出 SQS,以便我的处理层可以轮询多个队列,例如:5 个队列并处理更多消息。 可能的方法应该是什么?
将消息扇出到多个 sqs 队列的典型方法是使用 SNS。
s3 事件通知将转到 SNS 而不是 SQS,并且 SNS 将负责将这些消息散布到任意数量的队列中。
也就是说,我不确定我是否理解为什么您认为使用多个消息队列可以更快地处理消息。
由多个处理客户端轮询的单个队列 SQS 队列或使用多线程的单个客户端可能都是提高处理速度的更好方法,而不是简单地引入更多队列。
"... since we can get only 10 Messages in a single poll from SQS...I am thinking to fan-out sqs like spreading the message to more SQS queues from my master SQS queue, so that my processing layer can poll multiple queues eg : 5 queues and process more messages."
简短回答:不要这样做。
原因如下:
是的,一次投票最多可以检索 10 条消息。但是,您可以让 多个线程和多个主机都轮询一个队列 。让您的消费者并行 运行 是这里的关键,因为处理队列条目将是您的瓶颈 - 而不是从队列中检索条目。单个 SQS 队列可以处理大量轮询线程。
您提出的多队列扇出有很多缺点:
- 编码和操作更复杂
- 较慢 - 项目将不得不经历从您的主队列(或 SNS,如果您使用它)传输到消费队列的开销
- 更贵 - 每条消息的 SQS 费用。 SNS 按每条消息收费。
- 您必须自己处理重复 - 对于单个队列,SQS 内置的可见性超时将主要阻止其他消费者处理相同的项目。对于多个队列,您必须想出自己的重复数据删除策略
- 只需使用一个队列。以后你会感谢我的。