【问题标题】:Amazon SQS, Is it possible to fetch messages from SQS on basis of Sender IDAmazon SQS,是否可以根据发件人 ID 从 SQS 获取消息
【发布时间】:2016-01-08 10:42:07
【问题描述】:

我们有多个 Amazon 用户,它们将消息发送到同一个 SQS 队列,那么是否可以根据发件人 ID 从队列中获取消息?表示根据 Sender ID 返回特定的消息列表。

【问题讨论】:

    标签: amazon-web-services amazon-sqs


    【解决方案1】:

    不,您不能在 senderid 上过滤您的消息获取请求,您需要阅读所有消息并“丢弃”(返回)不匹配的消息,但这不是最好的方法去做吧——你将为所有这些读取请求付费并抛出大量消息(即将它们返回到队列中)。

    虽然所有“错误”的消费者都在这样做,但真正想要/需要分配给他们的消息的消费者将被阻止实际获取他们自己的消息 - 可能会持续很长时间。

    不确定您的意图,但听起来您最好使用多个队列,每个发送者 ID 一个,如果您希望这样使用消息 - 创建额外队列不会产生额外费用。

    【讨论】:

      【解决方案2】:

      我假设在过滤操作完成后需要处理队列项 [entities]。虽然多个队列肯定会有所帮助,但更强大的方法是执行完成的预处理,然后在我看来 [如按发件人 id 过滤] 是一种优雅的方式。

      随着 AWS Lambda 的发布,您当然可以卸载过滤或预处理,然后将其推送/放置在适当的位置。

      如果您的用户将项目推送到队列,请尝试以下方法。

      您可以尝试使用 2 个 Lambda 函数 [Feeder & Worker]。

      Feeder 将是 scheduled lambda function,其工作是取走物品 来自 SQS(如果有)并将其作为 SNS 主题推送(并永远继续这样做)

      Worker 将被链接以监听 SNS 主题,该主题将执行 data filtering [取决于发件人 ID]。传递的项目可以移动到一个全新的队列,其余的可以报废。

      更好的方法是让您的用户将实体直接推送到 SNS 主题,而 lambda 函数可以直接执行过滤。

      【讨论】:

        【解决方案3】:

        是的,这是可能的。 从消息属性中读取 SenderId 将为您提供发件人的 ID。这将帮助您唯一识别将消息放入队列的用户。

        你可以这样做:

        Message sqsMessage = <your_SQS_message>;
        String senderId = sqsMessage.getAttributes().get("SenderId");
        

        根据 senderid 添加过滤器效率低下,但您可以执行业务逻辑,您可以在其中添加指标或根据 senderId 将任务委托给工作人员。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 2021-06-16
          • 2022-01-09
          相关资源
          最近更新 更多