SQS 能否为单个账户扩展至 1,000,000 个队列?

Can SQS scale up to 1,000,000 queues for a single account?

我需要一个消息服务,允许我为每个用户创建一个频道,以便于实时通知。如果我有 100,000 到 100 万用户,为每个用户创建一个 SQS 队列是否有意义?

根据 SQS pricing documentation 创建 100 万个队列只需花费 0.40 美元,但我 运行 会遇到扩展问题吗?

另外,有没有办法在队列上设置到期日期?如果用户删除了他们的帐户,那么他们的队列将不再存在。

创建队列在这里不是问题。轮询甚至长时间轮询队列对您来说真的很昂贵。为了处理实时通知,您需要轮询每个队列,假设每 5 秒轮询 1M。

基于 SQS 定价,免费套餐后每 100 万个请求的价格为每个请求 0.00000040 美元。

这意味着您将调用 ReceiveMessage API 大约:

1000000 queues * 17280 (1 day in seconds / 5 seconds) = 17280000000 times.

对于最坏的情况,这大约是每天 6912.00 美元

您需要以更好的方式构建解决方案。

大多数 AWS 资源量都是有限的,虽然我没有发现任何关于队列数量的帐户限制,但我可能没有注意到它或者它可能只是没有发布。如果我的同事把它带给我,我绝对不会对你在这里推销的每个通知目标架构的队列感到兴奋。我会担心将相同通知放入所有听众队列,然后将它们读回的成本。

您所描述的听起来更像是 pub sub。或者,如果您想要更好的交付保证,也许可以使用像 kinesis 或 kafka 这样的流。我还听说有人使用 Redis 来实现这种事情。

"a channel for each user in order to facilitate real-time notifications" - 您不需要为此为每个用户设置一个专用队列 - 您可以使用一个主消息队列来完成此操作,具体取决于您的流量模式,可能有几个溢出队列来处理超高流量的用户。

"One queue"你说呢? "How on earth will that scale to 1M users?"

用户数量无关紧要。重要的是您的消息 consumption 可以跟上 message production(每秒传入消息)。如果你能做到这一点,它对你的用户来说就像是实时的。

  • 消息消费可以扩展到您愿意花费的那么多 - 只需生成一个线程来处理每条传入消息(使用线程池!)
    • 当然,您需要将每个主机限制为 X 个处理线程,具体取决于它可以处理的数量(因此“尽可能多”)
    • 溢出队列是为了控制成本——如果你被扩展为每秒处理 10K 条消息,你不希望用户出现并每秒向你发送 1M 条消息,从而导致你的服务中断,并且您的其他客户 - 将他们限​​制在某个合理的限度内,并以较低的优先级处理其余的消息。

"But... millions." - 是的。 SQS 可以处理。与多个单租户通道相比,单个多租户队列在架构和成本方面将 扩展 好得多。