【问题标题】:Can we filter messages from Amazon SQS queue by message attributes?我们可以按消息属性过滤来自 Amazon SQS 队列的消息吗?
【发布时间】:2021-04-05 12:59:03
【问题描述】:

现在我尝试根据消息属性名称 =“类”过滤消息。正如您在下面的代码中看到的那样

//Specify attribute list
        List<string> AttributesList = new List<string>();
        AttributesList.Add("Class");
        receiveMessageRequest.MessageAttributeNames = AttributesList;
        receiveMessageRequest.QueueUrl = urlSQS;
        receiveMessageRequest.MaxNumberOfMessages = 10;
        ReceiveMessageResponse receiveMessageResponse = objClient.ReceiveMessage(receiveMessageRequest);

但是没有根据提供的 MessageAttributeName = "class" 过滤消息。

【问题讨论】:

  • 不,您不能过滤基于属性值的消息

标签: c# amazon-web-services amazon-sqs


【解决方案1】:
receiveMessageRequest.MessageAttributeNames = AttributesList;

这告诉 SQS 您希望它与消息一起返回哪些消息属性如果消息中存在这些属性。它不是消息过滤器。如果属性不存在,则不会发生任何事情。

但是您的困惑似乎是可以理解的——实际上并不明显为什么 API 甚至具有此功能,尽管它可能是 SQS 仅支持比现在更小的消息时的保留,或者它可能是为了避免花费任何时候从您将最终丢弃的响应中解析信息。我几乎总是只要求All

【讨论】:

    【解决方案2】:

    请注意有关 AWS 上的消息传递服务

    SQS:不支持过滤(在接收消息时)

    SNS:支持基于属性的过滤:订阅者可以设置订阅属性(订阅过滤策略),该属性应用于传入的消息,只有相关的消息才能发送给订阅者。

    EventBridge:Amazon EventBridge 支持使用事件模式的声明式过滤。通过事件模式内容过滤,您可以编写仅在非常特定的条件下触发的复杂规则。例如,您可能需要一个规则,仅当事件的字段在特定数字范围内、事件来自特定 IP 地址或仅当事件 JSON 中不存在特定字段时才会触发。

    有关 AWS 上主要消息传递框架之间的详细区别,请参阅我的文章。

    https://www.linkedin.com/pulse/mastering-art-decoupling-application-architecture-aws-amit-meena/

    【讨论】:

      【解决方案3】:

      这取决于相关消息如何进入队列。如果您通过 SNS 推送消息,那么是的,您可以过滤消息; https://docs.aws.amazon.com/sns/latest/dg/message-filtering.html

      目前不存在任何其他过滤机制。

      希望有帮助!

      【讨论】:

        【解决方案4】:

        按照AWS SDK的方法,我们可以使用下面的代码来做过滤。

         ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest("QUEUE URL" );        
            receiveMessageRequest.setMaxNumberOfMessages(Integer.valueOf(1));
        private static AmazonSQS sqs;   
        List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("Attribute Name")).getMessages();
        

        如果您想要所有消息,请使用给定的代码

            ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest("QUEUE URL" );        
            receiveMessageRequest.setMaxNumberOfMessages(Integer.valueOf(1));
        private static AmazonSQS sqs;   
        List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("All")).getMessages();
        

        【讨论】:

        • 此 API 不过滤消息,它只声明将接收哪些属性。
        猜你喜欢
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 2010-09-09
        相关资源
        最近更新 更多