我们有多个亚马逊用户,他们正在将消息发送到相同的SQS队列中,那么是否可以在发件人ID的基础上从队列中获取消息?表示根据发件人ID返回特定邮件列表。
答案 0 :(得分:7)
不,你不能在senderid上过滤你的消息获取请求,你需要阅读所有消息并“扔掉”(返回)那些不匹配的消息,但这不是最好的方法去吧 - 你将支付所有这些读取请求并丢弃大量消息(即将它们返回队列)。
虽然所有“错误”的消费者都在这样做,但实际上想要/需要分配给他们的消息的消费者将被阻止实际收到他们自己的消息 - 可能很长一段时间。
不确定你的意图,但听起来你最好使用多个队列,每个发送者一个,如果你想要消费这些消息 - 创建额外队列没有额外的成本。
答案 1 :(得分:2)
我假设在过滤操作完成后需要处理队列项[实体]。虽然多个队列当然可以提供帮助,但是执行预处理的方式更加健壮,然后在我看来,像发送者ID过滤一样优雅。
随着AWS Lambda的发布,您当然可以卸载过滤或预处理,然后将其推送/放置在适当的位置。
如果您的用户将项目推送到队列,请尝试以下方法。
你可以试试2个Lambda函数[Feeder&工人]。
Feedder 将是
将链接scheduled lambda function
,他的工作是拿走物品 来自SQS(如果有的话)并将其作为SNS主题推送(并继续永久地完成)工作人员以侦听将执行
data filtering
[取决于发件人ID]的SNS主题。传递的项目可以移动到一个全新的队列,其余的可以报废。
更好的方法是让您的用户将实体直接推送到SNS主题,而lambda函数可以直接执行过滤。
答案 2 :(得分:0)
是的,那是可能的。 从message属性读取SenderId将为您提供发送者的ID。这将帮助您唯一地标识将消息放入队列中的用户。
您可以执行以下操作:
Message sqsMessage = <your_SQS_message>;
String senderId = sqsMessage.getAttributes().get("SenderId");
添加基于senderid的过滤器效率低下,但是您可以执行业务逻辑,在其中可以添加度量标准或基于senderId将任务委派给工作人员。