【问题标题】:Push Messaging with Amazon SNS, SQS and PHP使用 Amazon SNS、SQS 和 PHP 推送消息
【发布时间】:2013-09-13 16:25:26
【问题描述】:

我想使用 Amazon SNS 向 2000 万台设备发送时间紧迫的移动推送通知。每个主题最多可以有 10,000 台设备,我最多可以创建 3,000 个主题。使用 Amazon PHP SDK 意味着以 1 秒的时间发送 2000 个 API 调用,总共需要 33 分钟。这对于时间紧迫的消息没有好处。

我创建了一个 SQS 队列并将其订阅到 SNS 主题。当我将 PUSH 消息发送到 SQS 队列时,它没有被传递 - 它仍然在队列中。

如何使用这些服务更快地发送消息?

谢谢!

【问题讨论】:

  • 我认为您的连接颠倒了。当您将 SQS 队列订阅到 SNS 主题时,该队列将接收发布到该主题的消息,但反之则不然。请参阅documentation 了解更多信息。
  • 我认为你是对的。那么,我将如何构建一个系统来向这么多用户发送 PUSH 通知?
  • 如果您无法从单个 php 线程获得所需的吞吐量,您可能需要考虑使用 SNS->SQS 并使用多个工作人员来消耗队列以推动更高的吞吐量。使用适用于 PHP 的 AWS 开发工具包进行操作的“每个 1 秒”衡量标准是什么?
  • 我基于一些初步测试,显示 CURL 请求需要 0.5-1 秒。无论如何,瓶颈是将请求发送到 SNS 主题,而不是让 SNS 处理 PUSH 通知。因此,我认为 SQS 在我的情况下实际上不会有任何好处——“工人”实际上是 SNS 服务,因为它正在发送 PUSH 消息。我认为更好的解决方案是使用PHP Multicurl 将我的消息批量发送到最多 3,000 个主题。感谢 Bob 和 @felipe-garcia 的帮助和建议。
  • @SteveMc,使用多个线程,您应该能够在一台机器上每秒进行数百次发布,而不会有太大的困难

标签: amazon-web-services push-notification amazon-sqs google-cloud-messaging amazon-sns


【解决方案1】:

您是否检查了队列策略?创建它时,默认情况下它没有策略,只有所有者才能使用它。

检查您通过 API 使用的 IAM 用户,并确保您具有 SQS 向他授予权限的政策。

我过去使用 SNS 每月发送大约 1.5 毫米的通知,我没有遇到任何问题。但我没有按您需要的速度提供可靠的记录或经验。但我建议你看看下面的文章http://www.quora.com/Push-Notifications/Which-is-best-to-use-Amazon-SNS-Google-Cloud-Messaging-or-Parse-Why,它稍微谈到了 SNS x GCM。

希望这会有所帮助。

【讨论】:

  • 首先,我试图让 SNS-SQS 连接通过 AWS 控制台工作。我应该从 SQS 或 SNS 中发送我的 PUSH 消息吗?我可以很好地发布到 SNS 主题,并在我的设备上接收这些主题。但我不确定将消息发布到 SQS 之间的关系。我关注了instructions here,但我只想发布到一个 SQS 队列来处理消息传递,而不是发布到 3000 个 SNS 主题。我的这个概念完全错了吗?
  • 你做对了。要传递消息,您需要每个收件人都订阅 SNS 主题。如果您需要发送推送通知,您应该使用 SNS,如果您需要发送电子邮件,我建议您使用 SES。无论如何,您需要使用后台作业来轮询 SQS 队列并分派消息。您可以做些什么来加快这个过程,即为一个主题订阅多个 SQS 队列并并行处理这些队列。
【解决方案2】:

由于您没有指定通知的完整工作流程,我猜想是您的方法有误。

例如,如果您需要发送 100 个推送通知,并为此一次从您的应用程序创建 100 个 SNS 请求,那么您就增加了不必要的复杂性。只需从您的应用发送 100 次推送并跳过 SNS。

正确的做法是触发单个 SNS 操作,该操作将影响所有工作人员,他们将在获得“订单”时按需完成工作。

希望对您有所帮助。

【讨论】:

  • 他不能这样做,因为目前SNS每个主题最多只能支持10000个订阅(aws.amazon.com/sns/faqs)
  • 正如我所说,方法是错误的。您从您身边启动该过程,第一个 SNS 命中 n 个工作人员,他们完成工作,直到队列为空。一个 SNS 操作就足够了,其余的都是自动化的。
  • 不,不会的。 OP 需要 2000 万扇出。 SNS 最多支持 10,000 扇出。
  • 2000 万扇出可以通过链接它们轻松实现。它不是对称的。阅读我的答案。
  • 您的回答没有提到任何关于将它们“链接”在一起的内容。此外,我认为以一种保证不会丢失消息的方式将它们链接在一起会很困难。
【解决方案3】:

每个主题 10,000 台设备 * 3,000 个主题可让您向 3000 万台设备发送消息。为什么不在所有 3,000 个主题中复制您的主题并将您的消息发布到每个主题?用户将订阅这 3,000 个主题之一。我实际上没有尝试过,但似乎是最直接的方法。

【讨论】:

  • 3000 个主题,每秒 1 个请求 = 50 分钟。这对于时间紧迫的请求没有好处。假设我只需要 2000 万台设备,那就是 2000 个主题,也就是 33 分钟。这种情况下的解决方案是使用 Guzzle 并行发送请求。
【解决方案4】:

使用 Guzzle 并行发送请求。

$client->send(array(
    $client->get('http://www.example.com/foo'),
    $client->get('http://www.example.com/baz'),
    $client->get('http://www.example.com/bar')
));

【讨论】:

  • 截至目前,SNS 为每个主题提供 10 个 Mill 订阅。
猜你喜欢
  • 2012-07-16
  • 2012-06-09
  • 2017-08-22
  • 2012-03-09
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多