【问题标题】:Routing messages from Amazon SNS to SQS with filtering使用过滤将消息从 Amazon SNS 路由到 SQS
【发布时间】:2014-03-05 11:49:30
【问题描述】:

在 RabbitMQ 中,可以创建一个交换器,然后将其绑定到多个队列,每个队列都有一个路由键。这支持这样的消息传递架构:

           message_x
         /    |     \
foo-msg_q  bar-msg_q  msg-logger_q

客户端将消息发布到message_x 交换器,该交换器将 带有路由键“foo”的消息路由到foo-msg_q 队列, 带有路由键的消息"bar" 到 bar-msg_q 队列,所有 消息到 msg-logger_q 队列。

我无法弄清楚如何在 AWS 中执行此操作。我的第一个想法是在各个队列上设置权限以根据主题接受消息,但权限条件的唯一可用字段是:

  • aws:CurrentTime
  • aws:EpochTime
  • aws:MultiFactorAuthAge
  • aws:principaltype
  • aws:SecureTransport
  • aws:SourceArn
  • aws:SourceIp
  • aws:UserAgent
  • aws:userid
  • aws:用户名

这些似乎都不会受到我发布到message_x 主题的任何消息的影响。

当使用 Amazon Simple Notification Service 分散到多个 Simple Queue Service 队列时,是否可以这样做,每个队列接收发布到主题的消息子集?

【问题讨论】:

  • @OlivierAlbertini 这不是很有帮助。如果您在上面注意到,我提到这是您可以在 RabbitMQ 中执行的操作,所以我知道还有其他平台具有此功能。我专门询问了 SNS / SQS。
  • 你有没有找到任何优雅的方法来解决你的问题?
  • 如上所述的 SNS 过滤现在可用...请参阅下面@puji 的回答
  • 这个博客很有用:medium.com/better-programming/…

标签: amazon-web-services amazon-sqs amazon-sns


【解决方案1】:

这可以通过在 SNS 中使用消息属性过滤来实现。将不同的 SQS 队列订阅到 SNS 主题后,您可以使用 SNS API SetSubscriptionAttributes 指定要过滤的属性。这将允许具有不同属性的消息路由到正确的 SQS 队列。

这也不仅限于 SQS 队列,还包括 SNS 主题上的任何订阅源。例如,单个 SNS 主题可以将一组消息发布到 Lambda,而将另一组消息发布到 SQS。

SDK 参考: http://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html

此处通过示例提供了更多详细信息: https://aws.amazon.com/blogs/compute/simplify-pubsub-messaging-with-amazon-sns-message-filtering/

【讨论】:

    【解决方案2】:

    编辑

    我无法删除已接受的答案,因此请参阅 the answer below 以获取自此功能发布以来的正确答案。

    原始(现在不正确)答案(供后代使用):

    不,这是不可能的。对他们来说将是一个很棒的功能 不过。

    我知道的唯一选择是为每个路由规则创建一个主题 然后发布到正确的主题。它不漂亮,但它 完成任务。如果你有很多规则,你可能需要 超过他们允许的 3000 个主题。您可以要求增加 按照说明在其网站上从 AWS 获得主题限制 这里 http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ses_quota.

    【讨论】:

    • 我现在的解决方案是(defn send-message [routing-key msg]),它首先将消息发布到主题,因此任何订阅的队列都会收到它,然后发送到routing-key命名的队列。所以订阅全局主题的队列有一个模拟路由键“*”。
    • @JoshGlover 我没有得到你的解决方案,如果你有时间,请你再解释一次。
    • SNS 最近在stackoverflow.com/a/47479409/179138987654323@下面发布了这个功能作为普吉的回答
    【解决方案3】:

    AWS 现在支持过滤 SNS 订阅者。每个订阅者都可以设置它的策略来过滤它需要的消息并丢弃其他消息。如果您没有对订阅者设置任何策略,它将收到所有消息。请参阅下文 https://aws.amazon.com/getting-started/hands-on/filter-messages-published-to-topics/

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多