节点SQS优先级队列

我需要用node.jsSQS实现一个优先级队列。 这是我第一次与SQS所以我想听听你的意见。

我有三个工作重点:p0,p1和p2,p0是最高的。 p2是最频繁的,之后是p0,最后是p1。 在数字上,我可以粗略地说是这样的:

 p2 ~= 5p0 p0 >> p1 

他们都是独立的工作,所以执行这些工作的顺序并不重要。

我想出了两种可能的解决scheme(这些只是草图,并不真正运行)。

两者都是共同的

 var _ = require('lodash'), Promise = require('bluebird'), sqs = require('some-sqs-module'); ... module.exports.getJob = function() { return getJobByQueuePriority(0); // or... return getJobByJobPriority(0); } 

解决scheme1

使用3个队列,每个优先级一个。 根据各自的优先级从每个队列中抽样1份工作

 var Queues = [p0url, p1url, p2url], currentQueueIndex = 0; function getJobByQueuePriority(priority) { return new Promise(function(resolve, reject) { var queueUrl = getNextQueue(priority); if(!_.isEmpty(queueUrl)){ sqs.pullOne(queueUrl) .then(function (job) { // recursive promises??? return job ? resolve(job) : getJobByQueuePriority(priority + 1); }) .catch(function (err) { reject(err); }); } }); } function getNextQueue(index) { return index >= Queues.length ? '' : Queues[index]; } 

解决scheme2

使用1个队列并从中收集k个作业,然后select排名最高的作业。

 var QUEUE_URL = 'some/sqs/url', JOBS_TO_PULL = 10; function getJobByJobPriority (priority) { return new Promise(function (resolve, reject) { sqs.pullMultiple(QUEUE_URL, JOBS_TO_PULL) .then(function (jobs) { var job = getHighestPriorityJob(jobs); resolve(job); }) .catch(function (err) { reject(err); }); }); } function getHighestPriorityJob(jobs) { var highest = jobs[0]; _.each(jobs, function (job) { if(job.priority < highest.priority){ highest = job; } if(highest.priority == HIGHEST_PRIORITY) break; }); return highest; } 

这是我想要的消费者

 var pq = require('my-priority-queue'); function lookForWork() { pq.getJob() .then(function (job) { job ? work(job) : rest(); }); } function work(job) { // do your work... // search for more work lookForWork(); } function rest() { (setTimeout(function () { lookForWork(); }, TIME_TO_REST))(); } 

这些都是草图,所以如果你看到它们,不用担心小故障。

每个优先级的不同队列是更好的方式去imo。 它更具可扩展性(例如,如果您需要,您可以添加更多的消费者,例如只处理P2队列)。

通过一个队列,每当你从队列中取出消息而不使用它们时,就会阻止另一个消费者看到这些消息,直到他们返回。

不知道你的卷是什么,即使SQS很便宜,阅读大量的消息,而不使用它们仍然收取费用。

Interesting Posts