n8n 管道中的子工作流程有數量限制嗎?

描述問題/錯誤/問題

我的管道由多個 webhook 觸發器和多個排程觸發器組成,加上大約 15 個巢狀的子工作流程(通過執行工作流程呼叫)。

最近我想設置一個開發環境。我無法將我的 webhook 指向獨立的開發目標,所以我想到的最佳方案是複製整個管道,並通過 IF 節點和全域變數 dev: on/off 將副本連接到主管道。當 dev 開啟時,每個傳入的承載都會被複製,也會通過 webhook 推送到開發副本。當 dev 關閉時,只有 prod 運行。目的是用相同的真實資料在開發副本上進行測試,一旦某些東西在那裡運行正常,就將其移到 prod。這很重要,因為如我所說,我有大約 15 個巢狀的子工作流程,所以我真的想在推送之前在真實流量上驗證變更。

將開發副本連接到 prod 後,我開始遇到之前從未遇過的奇怪問題:

  • 在主工作流程中明顯已發佈的某些子工作流程開始拋出「未發佈的子工作流程」錯誤。這對我來說沒有意義,它們是已發佈的。
  • 我開始在基本上每個接觸 n8n 資料表/內建資料庫的節點上遇到競態條件問題。

刪除開發管道立即解決了所有這些問題。

所以我有兩個問題:

  1. 如果 n8n 因為大約翻倍了子工作流程和執行的數量而開始出現這種行為(虛假的「未發佈的子工作流程」錯誤和競態條件),我應該擔心隨著時間推移用更多巢狀子工作流程來正常擴展我的 prod 會觸發相同的錯誤嗎?圍繞巢狀子工作流程或在 Pro 方案上併發執行的數量是否存在已知的限制或已知問題?
  2. 在我的情況下,建構開發環境的推薦方法是什麼?我無法輕易地重新指向 webhook,我有許多巢狀的子工作流程,我想測試 prod 接收的相同真實資料。

錯誤訊息是什麼(如果有的話)?

「未發佈的子工作流程」出現在實際已發佈的子工作流程上,加上在使用 n8n 資料表的節點上間歇性的競態條件錯誤。

分享最後一個節點返回的輸出

(失敗的子工作流程呼叫返回「未發佈的子工作流程」錯誤,而不是運行)

關於您的 n8n 設置的資訊

  • n8n 版本:2.25.7
  • 資料庫(預設:SQLite):預設 n8n
  • n8n EXECUTIONS_PROCESS 設置(預設:own、main):預設(n8n Cloud 託管)
  • 通過以下方式運行 n8n(Docker、npm、n8n cloud、桌面應用程式):n8n Cloud
  • 作業系統:n8n Cloud
  • 方案:Pro,大約每月 30,000 次執行

@pohgen

鑑於你有 15 個以上的巢狀工作流程,並且正在看到競態條件,你已經超出了開發環境的「單一實例」方法。

n8n 的黃金標準是為開發環境配置完全獨立的 n8n 實例。由於你無法變更 webhook 來源,請使用你的生產環境實例作為「啞代理」。

  1. 生產環境實例: 接收 webhook → 立即向開發環境實例的 webhook URL 傳送 HTTP 請求 → 繼續執行生產環境邏輯。
  2. 開發環境實例: 一個完全獨立的 n8n Cloud 帳戶/實例。
  3. 為什麼這樣做有效: 開發環境實例有自己的資料庫。資源競爭為零。如果開發環境實例當機或鎖定,對你的生產環境執行沒有任何影響。

@koushikromel

我的開發管道完全如你所提到的:每次觸發時,我都有一個 node if/else 來檢查全域變數(dev: on/off),然後是一個 http POST node 將(傳遞)資料發送到 dev。儘管我理解這個邏輯在理論上不應該過度佔用資源,但我仍然遇到了來自 n8n 的一些意外行為。也許 n8n 在由雲端託管時有資源限制?

hi @pohgen

以下是針對你的具體問題的回答:

  1. 子工作流程沒有文檔記載的硬性限制。你遇到的問題不在於數量,而在於 SQLite 和並發性。你的 Cloud 實例預設使用 SQLite,而 SQLite 有單一寫入鎖。當你加倍你的管道時,生產和開發副本同時寫入同一個 Data Tables,造成寫入爭用。「未發佈的子工作流程」錯誤可能是這種爭用的副作用:當 n8n 在資源壓力下無法快速解析子工作流程參考時,它可能會拋出誤導性的錯誤。所以隨著時間推移擴展你的正常生產環境不會造成相同的問題,除非你同時也在加倍 Data Tables 的並發寫入。
  2. 對於 Cloud 上的開發環境,kjooleng 的獨立實例方法有效。一個更便宜的替代方案,仍保持在一個實例內:與其複製整個管道,不如使用 n8n 的工作流程版本控制。在工作流程中進行變更,保存而不發佈,然後手動測試。生產執行總是使用目前已發佈的版本,所以你的生產環境保持運行最後發佈的版本,而你在保存的草稿上測試變更。驗證後,發佈。這不涵蓋使用實時 webhook 流量的測試,但它完全避免了複製問題。

針對實時流量測試,kjooleng 的代理到獨立實例方法是正確的做法。

希望這有幫助!

@pohgen 好消息:巢狀子工作流程沒有硬限制,生產環境的成長不會觸發此限制。在 Cloud 上,並行數(Pro = 50)只計算 webhook/觸發執行,不計算執行工作流程呼叫,所以更多的巢狀子工作流程不會消耗您的預算。

破壞它的是將管線複製到同一個執行個體:「未發佈的子工作流程」錯誤是生產和開發副本衝突(重複的子工作流程導致執行工作流程命中錯誤的/未發佈的副本),資料表競爭是兩個副本同時存取相同的內建表,而且您加倍了計入 50 上限的 webhook 執行次數。刪除開發副本修復所有問題,這證實了問題是重複,而不是計數。

對於開發環境:使用單獨的 n8n 執行個體及其自有的資料表,這樣就不會與生產環境競爭。若要在不重新指向 webhook 的情況下測試真實資料,請擷取生產環境的負載並將其重新播放到開發環境,而不是即時分流流量。