使用过滤将消息从Amazon SNS路由到SQS

20
在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:username

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

在使用Amazon Simple Notification Service进行广播到多个Simple Queue Service队列时,是否有可能做到像这样的事情,每个队列接收到发布到主题的消息子集?


4
@OlivierAlbertini的回答并不是很有帮助。如果你注意到我的前面提到过,我说这是RabbitMQ可以做到的,所以我知道还有其他平台也有这种功能。我特别问了关于SNS/SQS的情况。 - Josh Glover
1
你找到了解决问题的优雅方式吗? - vercin
SNS过滤功能现已可用...请参见@puji的下面回答。 - Mike Atlas
这篇博客非常有用:https://medium.com/better-programming/how-to-fan-out-to-different-sqs-queues-using-sns-message-filtering-84cd23ed9d07 - mealesbia
3个回答

34
这可以通过在 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/

7

编辑

我无法删除已接受的答案,因此请参见下面的答案,因为该功能已经发布。

原始(现在不正确)答案(供后人参考):

不,这是不可能的。虽然这将是一个很好的功能,但他们还没有添加。

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


1
我目前的解决方案是(defn send-message [routing-key msg]),它首先将消息发布到主题中,以便任何已订阅的队列都可以接收到,然后再发送到由routing-key命名的队列。因此,订阅全局主题的队列具有模拟路由键“*”。 - Josh Glover
1
@JoshGlover,我没有理解你的解决方案,请你再讲一遍,如果你有时间的话。 - vercin
2
SNS最近发布了这个功能,正如Puji在下面的https://dev59.com/TmEh5IYBdhLWcg3wpEtF#47479409中所回答的那样。 - Caio Cunha

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接