During myTask performance optimization, I realized that currently the read implementation of 5 expanded nodes: Userstatus, document history, document item, attachment etc are done sequentially.
如果看看現在 Java8的parallelStream 的一些sample code, 再來review task offline 5個node的讀取, 發現它們也滿足并行計算的三要素:
(1) 可重入
(2) Immutable state
(3) Read only data access
是以我們可以考慮把每個node 資料的讀取分别放到一個"新線程"(用ABAP術語來講,應該是新的internal session )來做,這樣就和gateway 背景實作batch操作的設計完全一緻了。Gateway在SPRO裡有個配置控制batch request是串行還是并行實作,預設是并行。
理論上假設5個node 分别消耗的時間是1,2,3,4,5秒. 現在的串行實作,最後的時間是sum(1,2,3,4,5) = 15秒,改成并行處理後是max(1,2,3,4,5) 約等于5秒(加上少許線程同步的時間)
具體的測試report參考AG3 report ZATTACHMENT_SEQUEN_VS_PARALL:

測試結果
AG3上取440個attachment,一次用串行的方式執行,另一次分成4個線程分别執行,每個線程裡仍然call的未優化的代碼。用代碼比較確定兩次執行傳回的結果完全一緻。
詳細測試資料如下: