我在SQS队列和一些工作人员中有一批n
条消息。这些工作程序从队列中获取消息,处理它们,然后在成功时删除它们。一旦所有工作人员完成了这批n
条消息,我想执行其他操作。唯一的问题是弄清楚批次何时完成。
执行此操作的一种方法是检查队列是否为空。当我看一下SQS API时,唯一看起来很接近的是从ApproximateNumberOfMessages
获得的GetQueueAttributes
属性。但是,"近似"表明它并不是出于我的想法,而且其目的更多的是根据队列中大约有多少消息来扩大和缩小工作人员数量。
实现我想要的标准方法是什么?或者SQS不适合这个目的?
答案 0 :(得分:1)
SQS并没有真正的内置机制来分组消息。此外,SQS不保证特定邮件不会被多次处理 [1] ,因此您无法简单地计算处理的邮件数量
相反,您可能需要在外部数据存储区中单独跟踪每条消息,然后在处理完每条消息后,检查是否有剩余消息。
例如:
通过此设置,您可以同时在系统中运行多个不相关的批次。
答案 1 :(得分:0)
您可以考虑向您的工作进程添加一些代码,当它要求处理消息并且什么都不返回时,它会启动某种类型的计时器;如果你的工作人员要求消息,处理消息然后删除消息,正如你所说'批处理'只是一个同时收到的消息集合,那么大概是5分钟(或其他一些用户定义的时期)过去并且在重复请求后不会返回任何新消息,您可以启动“批量处理”过程。如果您可以在到达队列末尾时将工作进程缩小到一个(这样您就可以确定其他节点仍未处理),这将更准确。
这绝不是完美的 - 并且将取决于您的消息的流程/时间以及定义属于“批处理”的内容的重要性以及什么不是。
或者,如果在前端您知道批量邮件的准确数量,您可以倒计算已处理邮件的数量,并在您降到零时知道自己已关闭。