[英]How to render efficiently few hundreds of angular highcharts in the browser without crashing?
[英]How do I use RxJS to process hundreds of requests without crashing?
我需要處理400多個員工對象,其中涉及為每個對象調用一種可觀察的服務方法。
我需要知道何時所有員工都已得到處理,並且我需要找到一種方法來做到這一點,而這不會導致我的客戶端或服務器同時請求而導致超載-這就是目前的情況。
我想將每個員工的處理結果收集到一個數組中,以便從該數組進一步處理數據(我正在創建導出文件)。
我一直在嘗試RxJS concat和forkjoin,但似乎仍然有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.