我需要一个消息传递服务,允许我为每个用户创建一个频道,以便于实时通知。如果我有大约100,000到100万用户,那么为每个用户创建一个SQS队列是否有意义?
根据SQS pricing documentation,创建100万个队列只需要0.40美元,但是我会遇到扩展问题吗?
另外,有没有办法在队列上设置过期日期?如果用户删除了他们的帐户,则他们的队列不再需要存在。
答案 0 :(得分:5)
创建队列不是问题。轮询或甚至长时间轮询队列对你来说真的很贵。为了处理实时通知,您需要轮询每个队列,其中包含1M个队列,每5秒钟一次。
根据SQS定价,免费套餐后每百万请求的价格为每个请求0.00000040美元。
这意味着您将为about:
调用ReceiveMessage API 1000000 queues * 17280 (1 day in seconds / 5 seconds) = 17280000000 times.
对于最糟糕的情况,这是 $ 6912.00每天。
您需要以更好的方式构建解决方案。
答案 1 :(得分:2)
"每个用户的渠道,以便于实时通知" - 您不需要为每个用户提供专用队列 - 您可以这样做使用一个主消息队列,并根据您的流量模式,可能有一些溢出队列来处理超高流量用户。
"一个队列"你说? "如何扩展到1M用户?"
用户数量无关紧要。重要的是,您的消息消费可以跟上消息生产(每秒传入的消息)。如果你能做到这一点,它对你的用户来说就像是实时的。
"但......数百万。" - 是的SQS可以处理批次。并且单个多租户队列在架构和成本方面将比其他多个单租户通道更好地扩展很多。
答案 2 :(得分:1)
大多数AWS资源量都是有限的,虽然我没有找到任何队列数量的帐户限制,但我可能已经错过了它或者可能没有发布。如果我的同事把它带给我,我肯定不会对你在这里投球的每个通知目标架构的队列感到兴奋。我会担心将相同的通知发送到所有听众的队列,然后将其读回来的成本。
你所描述的内容听起来更像是pub sub。或者,如果你想要更好的交付保证,也许像kinesis或kafka这样的流。我也听说有人用Redis来实现这种事情。