使用 amazon SNS 向多个用户端点发送推送通知

问题描述 投票:0回答:2

我有一个功能,可以获取设备端点列表,并且需要向该列表中的所有设备发送推送通知。该列表是动态的,因为它可以包含我的用户群中任意数量的用户。此外,列表的大小可以在 1 到 10000+ 之间变化,因此效率变得很重要。

我已经阅读了 SNS 文档并在互联网上进行了搜索,但我所能找到的只是循环所有端点并单独发布消息(这对于我的用例来说效率非常低),或者一些关于创建主题和发布到该主题,以便所有订阅者都会收到消息(不能这样做,因为我的用户列表会不断变化)。

也许我在这里遗漏了一些东西,或者也许我缺乏我的研究。任何帮助或见解表示赞赏。

amazon-web-services push-notification amazon-sns
2个回答
0
投票

创建单独的 SNS 主题向订阅者发布消息是正确的方法,因为它将发布者与订阅者解耦。这样,您可以轻松添加或删除订阅者,而不会影响发布过程。

就您而言,用户列表似乎会经常更改,因此您必须构建专门的服务来处理订阅和取消订阅。当用户想要订阅事件时,服务应该为他们创建特定主题的订阅。同样,如果用户想要取消订阅通知,该服务可以帮助他们“取消订阅”。


0
投票

这个想法是创建一个 SNS 主题,并使用独特的

过滤策略

将我的所有用户订阅到该主题,以便我可以根据需要定位用户。 每当我的 api 收到用户的移动设备端点时,我都会使用用户的 ID 作为过滤策略将其订阅到我的主题,该策略始终是唯一的。它看起来像这样 -

{ target:[user-1234] }

1234 是该用户的 ID。此外,只要该用户不再活跃,我就会从主题中取消订阅该端点。

向一组用户发送消息时,我使用 

消息属性

来定位用户。消息属性将以字符串数组的形式添加,如下所示 [\user-1111\, \user-2222\, \user-3333\]。这只会将消息发布给这 3 个用户。

根据我的测试,向 1000 个用户发送消息大约需要 3 秒。它的表现不是很好,但比我们预期的要好得多。

这是我用来测试这一点的

poc

注意事项

根据 aws 文档,每个主题的服务配额限制为 200 个过滤器策略。由于此解决方案对 1 个用户使用 1 个过滤策略,因此这只适用于 200 个活动用户。可以向 aws 请求延长配额,但他们对于是否批准该请求拥有完全的自主权。我为每个主题增加了 1000 个过滤器策略,所以它现在可以工作,但它会使我们未来的扩展计划失败。

最后,我实现了一个解决方案,使用 Parallel.ForEach 循环向各个设备端点发送消息。这种方法大约需要 12 秒才能向 1000 个用户发布一条消息(更糟糕)。最初的想法是使用单独的服务来发送推送通知,但由于时间紧迫而未能实现;我们可能会在下一阶段实施。

注意:@codeninja.sj 提供的答案比我在这里讨论的解决方案要优雅得多,而且我觉得它的扩展性也会更好。不幸的是,我无法说服我的团队实施这个解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.