将AWS SQS和Lambda作为使用方的优先级队列

时间:2019-04-25 11:11:54

标签: amazon-web-services aws-lambda amazon-sqs

我有一个消息传递用例问题。

截至目前,我们在AWS SQS中有一个队列,例如 origQueue ,并且在该队列上即用即用基于lambda的消息消耗队列。

现在要满足基于优先级(高,中,低)的消息消费的一个特定功能(基于消息内设置的“优先级”数字),我正在考虑具有一组3个队列,其中每个队列都属于不同的优先级。在最高优先级队列上,基于lambda的即用型消息消费将继续发生。批处理过程将在5分钟的间隔内保持运行。每个都从中优先级和低优先级队列提升一些消息。目前尚未考虑到此批处理过程的逻辑,但是可以是任何事情,例如,拾取10个中度优先级消息和5个低优先级消息,它们均老化1小时以上并将它们提升为高优先级队列,以便它们可以通过上述基于开箱即用的基于lambda的消息消费来消费。

因此,在那之前,我只是想收集其他潜在的想法。是否有任何现成的AWS功能或任何模式可解决此基于优先级的消息使用问题?

P.S。

我想到的另一种(未选择)的方法是考虑优先级将队列中的项目“插入”,这将使队列始终按优先级排序。但是这种“运行时动态插入”似乎不可行,因为传入消息流始终处于打开状态。

2 个答案:

答案 0 :(得分:1)

AWS建议的方法是如您首先建议的,具有3个单独的SQS队列,即每个优先级一个。请参阅页面底部的suggestion here。无论消耗什么,每个队列都必须分别进行协调,因为没有一个队列会“知道”其固有的优先级。

答案 1 :(得分:1)

现在有用于 FIFO(先进先出)SQS 队列的消息组概念。这允许您使用特定 ID 向 SQS 队列发送消息,队列将按照接收新项目的顺序自动为您分组。

交互代码可以使用消息组参数查询整个 SQS 队列,并将接收回该队列中的任何消息。使用 ReceiveMessage (Node.js link provided) 之类的东西,可以提供参数“MessageGroupId”,然后该参数将获取一条或多条消息(按照收到的顺序)与匹配的“MessageGroupId”。

一个基本的高级概念是让代码始终检查高优先级消息组,直到确定它为空,然后移动到中等(然后是低)优先级队列以处理那里的工作,直到出现新条目在更高优先级的队列中找到。