2017-01-14 2 views
1

次の機能は、sqsから複数のメッセージを受信します。各メッセージは処理されなければならず、データベースはそれに応じて更新されなければならない。SQSからの複数のメッセージをどのように処理しますか?

モジュールからpull関数を呼び出すことで、1つのメッセージを処理できます。しかし、どのように複数のメッセージに対処するには? workerモジュールのpullメソッドをループ内で呼び出し続けることはできません。なぜならスレッドをブロックするからです。ここで可能な最良の方法は何ですか? Workerモジュールから

function checkMessage(){ 
    var params = { 
       QueueUrl : Constant.QUEUE_URL, 
       VisibilityTimeout: 0, 
       WaitTimeSeconds: 20, 
       MaxNumberOfMessages: 10 
      } 
    sqs.receiveMessage(params,(err,data) => { 
     if(data){ 
      var workerId = uuidV4(); 
      // Now worker will pull the message for processing 
      // The worker response is returned in the callback function 
      Worker.pull(data,workerId,(err,respData) => { 
       if(respData){ 
        // If the message was successfully processed 
        // set the final job status to complete and 
        // progress to 100% 
       }else{ 
        // If the processing failed set the final 
        // job status to error 
       } 
      }); 
     } 
    }); 
} 

Pull方法:

function pull(messageObject,workerId,cb){ 
    if(messageObject){ 
     var messageProcessed = true; 
     /* 
     * Process the message as required. Before starting the processing 
     * set the job status to processing. 
     */ 

     /** 
     * After the message has been processed, call the callback function 
     * inside monitor module. 
     */ 
     var callbackObject = {jobid : jobId, serverid : workerId}; 
     if(messageProcessed){ 
      return cb(null,callbackObject); 
     }else { 
      return cb(new Error('Failed to process messgae'),callbackObject); 
     } 
    } 
} 
+0

プルをスリープ状態にしたときに/何かメッセージがないときにいつか待つときの問題は何ですか? – mootmoot

答えて

1

示すコードのどれが同期またはCPU集約的ではありません。だから私はあなたが実際にその問題を抱えているかどうかテストします。 のコードがの同期またはCPUを使用していない場合は、ループがあるかどうかに問題がある可能性があります。したがって、別のスレッドをwebworker-threadsまたは別のプロセスで使用することができます。 npms.ioで 'queue'を検索するだけで処理する必要がある場合。

関連する問題