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 可以处理手。与多个单租户通道相比,单个多租户队列在架构和成本方面将 扩展 好得多。
我需要一个消息服务,允许我为每个用户创建一个频道,以便于实时通知。如果我有 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 可以处理手。与多个单租户通道相比,单个多租户队列在架构和成本方面将 扩展 好得多。