Amazon SQS,是否可以根据发件人 ID 从 SQS 获取消息

Amazon SQS, Is it possible to fetch messages from SQS on basis of Sender ID

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

不,您不能在 senderid 上过滤您的消息获取请求,您需要阅读所有消息和 'throw out' (return) 不匹配的消息,但是这不是解决它的最佳方法 - 您将为所有这些读取请求付费并丢弃大量消息(即 return 将它们放入队列)。

虽然所有 'wrong' 消费者都在这样做,但实际上 wants/needs 分配给他们的消息的消费者将被阻止实际获取自己的消息 - 可能会持续很长时间.

不确定您的意图,但听起来您最好使用多个队列,每个 senderid 一个,如果这是您想要使用消息的方式 - 创建额外队列不会产生额外费用。

我假设在过滤操作完成后需要处理队列项目 [entities]。虽然多个队列当然可以提供帮助,但更可靠的方法是执行 pre-processing 完成,然后在我看来 [像按发件人 ID 过滤] 是一种优雅的方式。

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

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

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

Feeder would be scheduled lambda function whose job is to take items from SQS (if any) and push it as an SNS topic (and continue doing it forever)

Worker would be linked to listen the SNS topic which would do the data filtering [depending on the sender ID]. The passed items can be move to a brand new queue and the rest can be scrapped.

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

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

你可以这样做:

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

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