在SQS中查找某些消息

iLe*_*ing 18 amazon-sqs amazon-web-services

我知道SQS不是为此而构建的,但我很好奇是否可以在符合某些条件的队列中查找消息?

我可以在循环中提取消息,在消息体中搜索某些模式(甚至不反序列化它们),并过滤我需要的消息.但是有可能最终得到一个无限循环 - 我读到的第一个消息将在我到达队列末尾时返回队列...

扩展消息的可见性,但我如何确切地知道扫描整个队列需要多长时间,以及我应该延长可见性多长时间?如果我在那里有一万条消息怎么办?

这里有解决方法吗?我需要扫描队列中的某些消息,然后删除那些消息......

Rya*_*man 17

简答:不.

队列专为任务而设计.机器从队列中获取新任务(即消息),执行任务,然后删除任务.

如果您正在尝试搜索邮件以过滤它们,我不禁想知道您是否使用了错误的工具来完成工作......

  • 在您看来,什么工具既适合发布和订阅,又具有过滤消息的功能? (2认同)

mcg*_*256 5

我认为短期或长期答案都不是“否”。

这是两个对策解决方案,它们是“是”。

  1. 遍历队列,维护访问列表
  2. 使用企业集成模式(消息路由)根据条件将消息拆分为下游

1.遍历队列,维护访问列表

考虑带有N消息的队列的情况,其中没有添加或删除消息。如果没有其他信息(例如,如果您知道应该符合条件的邮件数量),则需要遍历所有N邮件。

这里的重点是知道何时遍历所有N消息。这里有一些问题。

  1. 要确切知道,您必须跟踪添加到队列中的消息
  2. 要大致了解,您可以获取ApproximateNumberOfMessages队列的属性
  3. 或者,您可以循环接收消息,维护访问列表,并假设您最终将从队列中分担的每台服务器中采样并耗尽消息。

为了维护访问列表,当您收到消息并评估匹配标准时,可以存储message_id所有访问消息的。

消息ID 几乎是唯一的。看到这个线程

https://forums.aws.amazon.com/message.jspa?messageID=76119

如果使用(3),则无法确定要耗尽队列需要多少次迭代。但是,如果无限期地执行此操作,则只要保证SQS分片服务器上的加权随机分布使它们全都为非零概率,就可以保证消除队列。

2.使用企业集成模式(消息路由)根据条件将消息拆分为下游

如果您可以控制消息传递体系结构,则可以将消息路由器用作“前端”消息处理器,该处理器根据条件将消息分发给各个收件人。

特别是您将使用基于内容的路由器:

http://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentBasedRouter.html

  • 答对了。对于 #2 的示例,只需查看 Google 任务队列(在其 App Engine 平台上)即可。您可以在创建时标记消息,并在从队列中拉取时轮询特定标记。 (2认同)