2017-12-05 4 views
1

각각에 대해 관찰 가능한 서비스 메소드를 호출하는 것과 관련된 400 개 이상의 직원 객체를 처리해야합니다.RxJS를 사용하여 충돌없이 수백 건의 요청을 처리하는 방법은 무엇입니까?

모든 직원이 처리 된시기를 알아야하며, 클라이언트 또는 서버에 동시 요청이 과부하되지 않는 방법을 찾아야합니다. 즉, 현재 상황입니다.

각 직원의 처리 결과를 데이터로 작업 할 수있는 배열로 가져 오려고합니다 (내보내기 파일을 만듭니다).

것은 내가 RxJS에게 CONCAT 및 forkjoin 을 시도하고있다하지만, 난 여전히 모두 같은 시간에 떨어져 발사 400+ 작업을 갖고있는 것 같다.

I read this page에 대한 처리가 (현금 인출기에서 큐 등), 한번에 하나씩 처리하지만, 내가 확신 아니에요 제안는 CONCAT - 다시는 내 브라우저가 걸려와 네트워크의 수 요청이 동시에 나에게 제안되었습니다.

한 번에 한 명의 직원을 처리하고 그 목록의 다음 직원을 처리하기 전에 코드를 완성 할 수 있다면 좋을 것입니다.

processEmployees(): AsyncSubject<boolean> { 
    let employeesProcessed: AsyncSubject<boolean> = new AsyncSubject<boolean>(); 
    let listOfProcessesToRun = []; 

    this.employeeProfilesList.forEach(
     (employeeProfile: EmployeeProfile) => { 
      listOfProcessesToRun.push(
       this.annualLeaveCalculationService.startProcess(employeeProfile, this.yearToProcess).delay(2000) 
      ); 
     } 
    ) 

    Observable.concat(listOfProcessesToRun) 
     .finally(() => { 
     }) 
     .subscribe(
     (calculationResults: AnnualLeaveCalculationResults) => { 
      this.calculationResults.push(calculationResults); 
      employeesProcessed.complete(); 
     }, 
     error => { 
     }); 

    return employeesProcessed; 
} 

내가 관찰 가능한 배열을 처리 할 Observable.forkjoin를 사용하여 시도,하지만 난 요청을 병렬로 처리 있다고 생각하고, 그 때문에 거기에 매달려 내 컴퓨터 결과 약 400 명의 직원이 처리해야합니다.

중첩 된 솔루션을 고려했습니다.

processemployee(X) { 
    doServiceCall(this.employees[x]) 
    .subscribe(response => { 
      processemployee(++x); // with a check to detect number of loops 
     } 
    ); 
} 

그러나 나는 그것이 훌륭한 패턴이라고 확신하지 못합니다.

답변

4

.mergeMap 오버로드를 사용하면 concurreny이 걸릴 수 있으며 서비스에 정상적으로 (예 : 20req 동시) 설정할 수 있습니다. 그렇게하면 서버를 침범하지 않고 최대 처리량을 위해 최적화됩니다.

+0

아, 감사합니다. 나는 지금 그것을 시도 할 것이고 나의 결과를 게시 할 것이다. 매우 감사! –

+0

나는 1의 *** 동시 *** 값을 사용해야했다. 그렇지 않으면 반복되는 것처럼 보이는 외부 관찰 가능 출력과 같은 이상한 상황이 발생했다. 의심 할 여지없이 나는 병합 맵이하는 일에 대한 나의 이해를 연마 할 필요가있다. 그렇지 않으면 concurrent 매개 변수의 값이 1로 설정되어 있으므로 원하는대로 작동합니다. –

0

최근에 일종의 유사한 문제가 생겼습니다. 올바르게 이해하면됩니다.

나는 수천 개의 병렬 처리 요청을 받았습니다. 번호가 너무 높았고 모든 것이 무너졌습니다.

나는 원하는 것을 얻기 위해 bufferCount()concatMap() 연산자를 조합하여 사용했습니다.

  • bufferCount() 분할 모든 인수로 전달 함수 통해 소자
  • concatMap()는 (병렬로) 제 청크 부연 동일한 수를 포함 청크 원래 스트림 - 함수는 관측 가능한 반환 - 때 관찰이 완료되면 두 번째 청크가 찍히는 등등

어쩌면이 방법이 도움이 될 수 있습니다.

관련 문제