2016-11-10 2 views
0

내 앱에서 이벤트가 발생하면 많은 사용자에게 이메일을 보내야합니다. 한 번에 모든 이메일을 보내지 않고 서서히 메일을 보내고 싶습니다. 설명을 명확히하기 위해 10,000 명의 사용자에게 이메일을 보내야한다고 가정 해 보겠습니다.GAA 작업 대기열 및 ETA가 많은 작업

현재 작업 속도는 최대 1 작업/초인 작업 대기열에서 수행합니다. 일괄 작업으로 10,000 개의 작업을 대기열에 넣었으며 이메일은 1 초당 전송됩니다.

작업 대기열을 최대 속도로 제한하는 대신 작업에 대해 ETA를 사용하도록 변경하고 싶습니다. (즉, 작업 제출을 일괄 처리 할 것 제외) 개념적으로는 다음과 같이 될 것이다 :

now = datetime.utcnow() 
for i, email in enumerate(email_list): 
    eta = now + datetime.timedelta(seconds=i) 
    deferred.defer(send_email, email, _eta=eta) 

이 같은 변경 사항을 구현하기 전에, 내가 GAE 효율적으로이 작업을 수행 할 수있는 자신감을 가지고 싶습니다.

작업 대기열에 10,000 개의 작업이 있고 각 작업 시간이 다른 경우 GAE 작업 대기열은 모든 작업을 효율적으로 모니터링하고 대략적인 시간 (정확한 ETA는 중요하지 않음)에서 적절한 시간을 시작할 수 있습니까? ? 나는 구글이 이것을 위해 어떤 알고리즘을 사용하는지 모른다.

편집 : 당신은 하루에 ETA 각을 억 작업을 삽입 한 경우

을 상상해보십시오. GAE가 이러한 작업을 모니터링하여 적시에 해고 될 수 있도록하는 방법은 무엇입니까? 일정 시간 간격 (예 : 매분)마다 모든 작업을 폴링하는 것은 끔찍한 해결책입니다. GAE는 일종의 우선 순위 대기열을 사용합니다. GAE가 ETA를 사용하여 많은 작업을 수행 할 수있는 알고리즘을 구현했다고 확신하는 것이 좋을 것입니다. 명시된 daily quota of 10 billion tasks 하나

답변

1

(그들은 작업 & _eta와 ~ 나 또한 보낸다 나의 현재 프로젝트에서 10,000 이메일 (SendGrid를) 그들 : 10,000

을 처리 할 수 ​​있어야합니다 생각의 일괄 있지만, 2530) ...

+0

많은 작업에서 _eta를 사용하면 잘 작동한다는 것을 알아두면 좋을 것입니다. 다른 작업 대기열이 예상대로 작동하지 않는 것을 발견했습니다. –

1

현재 인프라에서 처리량이 구성된 속도보다 상당히 낮 으면 논리가 조금씩 바뀔 수 있습니다. 대기열은 작업 5s를 미리 준비하지만 주어진 5s 창에 작업이 없으면 처리 속도가 느려질 수 있습니다.

일반적으로 작동해야하지만 최대 20 초 지연이 발생하고 버스트가 발생할 수 있습니다.

총 처리량이 1B 작업/일인 경우 약 300 개의 작업/초/대기열 속도로 40 개의 대기열을 실행하도록 분할하고 싶을 것입니다. 속도가 안정되면 지연이 자주 발생하지 않습니다.