Sni*_*192 4 amazon-sqs amazon-web-services aws-lambda
我知道 Amazon SQS 有自己的内部最大传输消息数。但有没有办法自己把这个数字设置得更小呢?例如,假设我不希望同时处理超过 10 条消息。
\n\n有哪些方法可以实现这一目标?shovelling我相信RabbitMQ 中的方法类似于, 。我可以有 2 个队列,A& B。所有消息将首先发送到A。然后,如果消息中的飞行消息少于 10 条,B则消息将发送至B. 然后消费者将从 进行消费B。
A然后我必须解决何时将消息从 传输到的问题B。理想情况下,这将是一个无服务器解决方案。我有几个想法,例如:
CloudWatch Events - 使用 CloudWatch,我可以触发 Lambda 函数(我们可以这样称呼它ShoveLambda)来移动消息,因为B. 但最短轮询时间为 CloudWatch 设置的最小间隔 60 秒。
SNS 主题\n除了执行1之外,我还可以有一个 SNS 主题,该主题在新发布时会触发ShoveLambda移动消息。当消息被B处理时,消费者也会向SNS发布一个Notification,这会触发ShoveLambda,(我也可以让消费者ShoveLambda直接调用a,想法?)。A这意味着在最坏的情况下,从到铲取消息之间会有 60 秒的延迟B,但大多数时候,由于在 中处理消息,无论如何都会有固定数量的铲子B。
关于这种方法的任何想法和想法都会很棒。这种方法好不好?我应该将并发执行数限制ShoveLambda为 1 吗?就好像同时执行两个执行一样,我会铲除我想要的两倍,即使我限制了执行,我想仍然可能存在并发问题,但我不太担心是否铲除太多消息,B只要它在所需最大飞行消息或某个上限的 30% 以内。
但当我写这篇文章时,我担心这种方法存在漏洞。
\n\n更多信息\n我们可能有一些这样做的用例,例如限制客户一次只能运行 10 个作业。但允许服务器独立扩展。执行不同类型的处理。
\n\n但我们的主要情况是我们有一个处理文件的工作流程,并且该工作流程的一个阶段涉及一个我们可以\xe2\x80\x99t 扩展的整体 Windows 服务器应用程序。我们通过 SOAP API 请求进行交互。它本身以某种方式对作业进行排队,其 SQL 数据库作为应用程序的一部分运行。
\n\n这是我们流程中的瓶颈,但我们不希望它堆积数百个作业。我们有处理管道其他部分并与此 SOAP API 交互的容器。它们应该根据传入的文件进行扩展,但我们不希望 Windows 机器上的作业数量超过一次 10 个。
\n\n我希望这能提供足够的背景信息。
\n如果您想限制传输消息的数量,那么就不要从队列中获取更多消息。当您想要更多的飞行信息时,请从队列中获取更多消息。如果您想限制正在处理的消息数量,您的应用程序应该在抓取消息之前应用该逻辑。
但是,如果您将 AWS Lambda 函数配置为处理来自 SQS 队列的消息,则可以对 Lambda 函数设置并发限制以限制同时执行的数量。
请参阅:为 Lambda 函数保留并发性 - AWS Lambda
如果您花费大量时间等待外部服务才能处理消息,那么 AWS Lambda 可能不是该架构的最佳选择。这是因为您需要为 Lambda 函数付费,即使它只是在等待外部服务。
| 归档时间: |
|
| 查看次数: |
11846 次 |
| 最近记录: |