# Best practices for parallel nodes (fanouts)

**URL:** <https://forum.langchain.com/t/best-practices-for-parallel-nodes-fanouts/1900>\
**Category:** LangGraph\
**Tags:** python-help\
**Created:** [October 22, 2025, 3:13pm UTC](https://forum.langchain.com/t/best-practices-for-parallel-nodes-fanouts/1900 "2025-10-22T15:13:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![rkauf](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/rkauf/32/1171_2.png) [@rkauf](https://forum.langchain.com/u/rkauf)\
**Post date:** [October 22, 2025, 3:13pm UTC](https://forum.langchain.com/t/best-practices-for-parallel-nodes-fanouts/1900/1 "2025-10-22T15:13:39Z")

</div>

Hello,

Our workflow heavily uses fanout/map-reduce style graphs. A single thread might have 70 parallel nodes. We expect to have multiple concurrent threads in production, so we would like to understand any limitations of LangGraph’s parallel execution model, as well as associated best practices. Thanks!

---

<div class="post-metadata">

**Author:** ![pawel-twardziak](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/pawel-twardziak/32/960_2.png) [@pawel-twardziak](https://forum.langchain.com/u/pawel-twardziak)\
**Post date:** [October 22, 2025, 4:52pm UTC](https://forum.langchain.com/t/best-practices-for-parallel-nodes-fanouts/1900/2 "2025-10-22T16:52:11Z")

</div>

Hi @rkauf

as for me, I go by these rules:

- **Understand the execution model (super-steps)**

- **Use `Send` for dynamic fan-out, `Command` for update+route**

- **Define reducers for any keys written from parallel branches**

- **Control concurrency with `max_concurrency`**

- **Use retries at the node level (especially for LLM/tool calls)**

- **Aggregate on a dedicated key and avoid cross-branch mutation**

- **Prefer `Send` over imperative subgraph calls inside a single node**

- **Mind recursion and loops**

- **Performance and resource tips**

- **Testing and observability**

* * *

## Hopefully, other users of the forum can help improve/expand this best practices list 🙂

---

<div class="post-metadata">

**Author:** ![rkauf](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/rkauf/32/1171_2.png) [@rkauf](https://forum.langchain.com/u/rkauf)\
**Post date:** [October 24, 2025, 10:46am UTC](https://forum.langchain.com/t/best-practices-for-parallel-nodes-fanouts/1900/3 "2025-10-24T10:46:59Z")

</div>

Thanks Pawel, this is super helpful! On the `recursion_limit` question: Do you happen to know how to increase that limit when running using langgraph.json, as opposed to `client.runs.stream`? See [this question](https://forum.langchain.com/t/increasing-recursion-limit-on-deployment/1887) 🙂

---

<div class="post-metadata">

**Author:** ![pawel-twardziak](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/pawel-twardziak/32/960_2.png) [@pawel-twardziak](https://forum.langchain.com/u/pawel-twardziak)\
**Post date:** [November 27, 2025, 9:41pm UTC](https://forum.langchain.com/t/best-practices-for-parallel-nodes-fanouts/1900/4 "2025-11-27T21:41:34Z")

</div>

Hi @rkauf  
Actually I know nothing about that passibility - I think you can’t use langgraph.json for now to modify the limit, can you? 🙂  
And honestly, why would that be useful if you can still use the context to modify it? 🙂

Remember that you can still set the default value vie `.env` or environment variables in your deployment platform: `DEFAULT_RECURSION_LIMIT = int(getenv("LANGGRAPH_DEFAULT_RECURSION_LIMIT", "25"))` → [langgraph/libs/langgraph/langgraph/\_internal/\_config.py at main · langchain-ai/langgraph · GitHub](https://github.com/langchain-ai/langgraph/blob/main/libs/langgraph/langgraph/_internal/_config.py#L31)
