簡體   English   中英

如何使用RxJS處理數百個請求而不會崩潰?

[英]How do I use RxJS to process hundreds of requests without crashing?

我需要處理400多個員工對象,其中涉及為每個對象調用一種可觀察的服務方法。

我需要知道何時所有員工都已得到處理,並且我需要找到一種方法來做到這一點,而這不會導致我的客戶端或服務器同時請求而導致超載-這就是目前的情況。

我想將每個員工的處理結果收集到一個數組中,以便從該數組進一步處理數據(我正在創建導出文件)。

我一直在嘗試RxJS concatforkjoin,但似乎仍然有400多個任務同時啟動。

我讀過有關concat的 頁面該頁面建議一次處理一次(就像ATM上的隊列一樣),但我不敢相信-我的瀏覽器再次掛起,建議的網絡請求數全部對我來說是同一時間。

如果我能一次處理一個雇員的代碼,然后在處理列表中的下一個雇員之前完成代碼,那就很好了。

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
        }
    );
}

但我不確定這是個好模式。

您可以使用.mergeMap重載,該重載將concurreny設置為對您的服務合理(例如20req並發)。 這樣一來,您就可以優化最大吞吐量,而不會造成服務器擁擠。

如果我正確理解這個問題,最近我遇到了類似的問題。

我有成千上萬的請求要並行處理。 這個數字太高了,整個事情都崩潰了。

然后有人指出我要結合使用bufferCount()concatMap()運算符來實現我想要的。

  • bufferCount()將原始流分成多個塊,所有塊均包含相同數量的元素
  • concatMap()通過作為參數傳遞的函數詳細說明第一個塊(並行)-該函數返回一個Observable-當Observable完成時,則獲取第二個塊,依此類推

也許這種方法會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM