【发布时间】:2016-01-08 10:42:07
【问题描述】:
我们有多个 Amazon 用户,它们将消息发送到同一个 SQS 队列,那么是否可以根据发件人 ID 从队列中获取消息?表示根据 Sender ID 返回特定的消息列表。
【问题讨论】:
标签: amazon-web-services amazon-sqs
我们有多个 Amazon 用户,它们将消息发送到同一个 SQS 队列,那么是否可以根据发件人 ID 从队列中获取消息?表示根据 Sender ID 返回特定的消息列表。
【问题讨论】:
标签: amazon-web-services amazon-sqs
不,您不能在 senderid 上过滤您的消息获取请求,您需要阅读所有消息并“丢弃”(返回)不匹配的消息,但这不是最好的方法去做吧——你将为所有这些读取请求付费并抛出大量消息(即将它们返回到队列中)。
虽然所有“错误”的消费者都在这样做,但真正想要/需要分配给他们的消息的消费者将被阻止实际获取他们自己的消息 - 可能会持续很长时间。
不确定您的意图,但听起来您最好使用多个队列,每个发送者 ID 一个,如果您希望这样使用消息 - 创建额外队列不会产生额外费用。
【讨论】:
我假设在过滤操作完成后需要处理队列项 [entities]。虽然多个队列肯定会有所帮助,但更强大的方法是执行完成的预处理,然后在我看来 [如按发件人 id 过滤] 是一种优雅的方式。
随着 AWS Lambda 的发布,您当然可以卸载过滤或预处理,然后将其推送/放置在适当的位置。
如果您的用户将项目推送到队列,请尝试以下方法。
您可以尝试使用 2 个 Lambda 函数 [Feeder & Worker]。
Feeder 将是
scheduled lambda function,其工作是取走物品 来自 SQS(如果有)并将其作为 SNS 主题推送(并永远继续这样做)Worker 将被链接以监听 SNS 主题,该主题将执行
data filtering[取决于发件人 ID]。传递的项目可以移动到一个全新的队列,其余的可以报废。
更好的方法是让您的用户将实体直接推送到 SNS 主题,而 lambda 函数可以直接执行过滤。
【讨论】:
是的,这是可能的。 从消息属性中读取 SenderId 将为您提供发件人的 ID。这将帮助您唯一识别将消息放入队列的用户。
你可以这样做:
Message sqsMessage = <your_SQS_message>;
String senderId = sqsMessage.getAttributes().get("SenderId");
根据 senderid 添加过滤器效率低下,但您可以执行业务逻辑,您可以在其中添加指标或根据 senderId 将任务委托给工作人员。
【讨论】: