2016-11-16 1 views
0

에 수천 개의 메시지를 추가합니다.내가 <strong>Node.js를</strong>와 함께 <strong>푸른 기능</strong> 내 <strong>푸른 저장 대기열</strong> 약 6000 메시지를 추가하기 위해 노력하고 푸른 저장 큐

나는 지금 내가 Promise에서 QueueService method 포장 약 50 Bluebird를 사용하는 동시성으로 Promise.map을 통해 6000 약속을 확인,이 작업을 수행하는 여러 가지 방법을 시도했습니다.

const addMessages = Promise.map(messages, (msg) => { 
    //returns a promise wrapping the Azure QueueService method 
    return myQueueService.addMessage(msg); 
}, { concurrency: 50 }); 

//this returns a promise that resolves when all promises have resolved. 
//it rejects when one of the promises have rejected. 
addMessages.then((results) => { 
    console.log("SUCCESS"); 
}, (error) => { 
    console.log("ERROR"); 
}); 

My QueueService는 ExponentialRetry 정책으로 생성됩니다.

  • 모든 메시지 내 대기열에 추가됩니다와 약속이 제대로 해결 :


    나는이 전략을 사용하여 혼합 된 결과가 있었다.

  • 모든 메시지가 내 대기열에 추가되고 약속이 해결되지 않거나 거부됩니다.
  • 모든 메시지가 내 대기열에 추가되지 않으며 약속이 해결되지 않거나 거부됩니다.

오전 뭔가 없거나 내 전화가 가끔 해결하기 위해 2 분 소요, 때로는 10 분 이상하는 것이 가능할까요?

앞으로는 약 100.000 개의 메시지를 추가해야 할 것이므로 예상치 못한 결과가 나올지 걱정됩니다.

(푸른 기능에) 노드 에서 많은 수의 메시지를 추가 할 수있는 최선의 전략이 될 것입니다 무엇?


편집 :

을 : 내 저장 대기열 내 메시지를 추가 할 수있는 매우 신뢰할 수있는 방법을이 놓친하지만

방법을 모르는 내 푸른 기능의 결합 큐 출력을 사용하는 것입니다

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#storage-queue-output-binding

내 코드를 훨씬 쉽게 만들 수 있습니다.

for (var i = 0; i < messages.length; i++) { 
    // add each message to queue 
    context.bindings.outputQueue.push(messages[i]); 
} 


EDIT2 : 나는 약 1000의 일괄 내 메시지를 분할하고 푸른 물방울 저장 이러한 배치를 저장하기 위하여려고하고있다

.

또 다른 Azure 함수는 새로운 BLOB가 추가 될 때마다 트리거 될 수 있으며이 함수는 한 번에 1000 개씩 내 메시지 대기열을 처리합니다.

내 출력 바인딩을 통해 대기열에 20.000 개의 메시지를 추가하고 약 15,000 개의 메시지 만 처리 할 수있는 5 분 후에 Azure 함수 시간 초과를 수신 할 때 대기 시간이 훨씬 더 안정적이고 확장 가능해야합니다.

+0

동일한 문제가 있습니다. 마지막 접근 방식이 효과가 있었습니까? 나는 그 아이디어가 마음에 든다. 추가 작업을 멀티 스레딩하는 것은 어떨까요? –

답변

1

어떤 기능을 트리거합니까? 단일 기능을 사용하는 대신 모든 메시지를 추가하는 것이 좋습니다. 이러한 기능을 확장하고 수행 할 작업량을 제한하여 동시성을 효과적으로 활용할 수 있습니다.

나는 위에서 제안한 바와 같이 현재 가지고있는 방아쇠를 다루는 함수를 가지고있어, 실제로 (많은) 함수를 추가하는 실제 작업을 수행하는 다른 함수에 의해 처리되는 작업을 큐업한다. 큐로 보내는 메시지의 수가 적습니다. 워크로드에 따라 잘 작동하는 것을 확인하려면 번호를 사용해야 할 수도 있지만,이 패턴을 사용하면 여러 기능을 통해 (여러 시스템을 포함하여) 더 나은 확장 성을 제공하고 오류를보다 잘 처리하며 안정성과 예측 가능성을 높일 수 있습니다.

예를 들어 대기열에 넣은 메시지의 메시지 수가 작업을 트리거하기 위해 가질 수 있으며 1000 개의 메시지를 최종 출력으로 보내려면 "작업자"기능에 100을 추가하도록 지시하는 10 개의 메시지를 대기시킬 수 있습니다 각 메시지. 또한 함수 당 훨씬 작은 숫자로 재생하는 것이 좋습니다.

도움이 되었기를 바랍니다.

+0

신속하고 정교한 답장을 보내 주셔서 감사합니다. 내 기능은 현재 수동으로 트리거되지만 결국 주기적으로 트리거됩니다. 제 기능에는 수천 개의 메시지 목록이 있습니다. 저장 용량을 저장 대기열에 추가하기 위해이 확장을 제안하는 방법은 무엇입니까? 대기열에 메시지를 추가하려면 대기열이 필요합니다 ... – Schaemelhout

+0

난 그냥 내 기능을 테스트하고 05.00 분에 시간 초과하기 전에 내 큐에 15.000 메시지를 추가 할 수있었습니다 ... – Schaemelhout

+0

나는 여전히 위의 접근 방식을 따르는 것이 좋습니다. 처음에 트리거 된 함수는 적절한 메시지를 필요한 상태로 큐에 넣고 작업 큐를 트리거로 사용하는 작업자 함수는 해당 메시지를 처리합니다. –