I am running some processing in parallel that includes api calls.The result with then populate an interface attended by a user.
I have tried both a!forEach and MNI but for both the performance is not as expected.
By looking at the performance tab in the expression rule, it is clear that the items in the array are running sequentially and not in parallel,
as the total time for the expression rule is the sum of every iteration. As a test I tried to put only a GET api call in the foreach loop and the result is the same.
This is not what I was expecting, is there anything that can be done to enforce the threads to run in parallel to optimize the performance?
Discussion posts and replies are publicly visible
If foreach and MNI both are not helping, you can creating process model using parallel paths for each api call - basically call each api call independent of each other using AND node and a separate path per API. After the calls you can use complex node to ensure process returns to UI only after all the API executions are complete.
The problem is that I do not know how many paths I need, the content of the array depends of a previous api call.
Can you share the code of your expression?
I somehow stumbled on a solution.
The original code was:
a!forEach( items: ri!ofscSlots, expression: rule!FF_processOFSCSlotsBridge( ofscSlot: fv!item, activityType: ri!activityType, postcode: ri!postcode, duration: ri!duration, products: ri!products ) )
Bizarrely the (ugly) code below trigger the parallel evaluation
a!localVariables( local!numberSlots: length( ri!ofscSlots), { if(1<=local!numberSlots, rule!FF_processOFSCSlotsBridge( ofscSlot: ri!ofscSlots[1], activityType: ri!activityType, postcode: ri!postcode, duration: ri!duration, products: ri!products ), {} ), if(2<=local!numberSlots, rule!FF_processOFSCSlotsBridge( ofscSlot: ri!ofscSlots[2], activityType: ri!activityType, postcode: ri!postcode, duration: ri!duration, products: ri!products ), {} ), ---- And so on ------
The expression rule has multiple api calls and some relatively simple data transformation.
Really strange
I hope your list does not have more than a billion items ;-)
Did you read this?
https://docs.appian.com/suite/help/25.2/expressions-parallel-evaluation.html
Yes, it appears to state that a!foreach should do the trick but I have evidence to refute it.
I can set an upper limit just below 100 items, while it looks ugly it works and whatever wizardry Appian is doing behind the scenes I will not be able to change it. There are probably nicer ways to "convince" the Appian engine but I cannot keep experimenting forever due to deadlines.
Peter Lewis , can you help us to better understand how to decouple looping code aiding in automatic parallel execution?