描述問題/錯誤/疑問
我在自託管 Ubuntu VPS 上執行 n8n(Docker + SQLite 資料庫),今天遇到了 Google Sheets 配額和執行堆積的問題。
背景
n8n 2.21.x in Docker Compose,SQLite 資料庫掛載在磁碟卷上。
“經典” 模式(無外部佇列),N8N_CONCURRENCY_PRODUCTION_LIMIT 現在設定為
已啟用 Runners(N8N_RUNNERS_ENABLED=true)。
已停用 Insights/診斷(N8N_INSIGHTS_ENABLED=false、N8N_DIAGNOSTICS_ENABLED=false)以避免額外的 SQLite 錯誤。
工作流程架構
-
Webhook 工作流程(建立請求)
HTTP Webhook 接收結構化的客服請求。
“標準化承載量” Code 節點,對欄位進行對應和清理(類別、子類別、電子郵件、訊息、附件、請求 ID 等)。
“按類別路由” Switch,將其發送到三個分支(例如 LED 燈帶 / 電源供應 / 外殼)。
每個分支都會執行 Google Sheets → 附加到同一檔案的專用工作表(每個請求一行,初始狀態和決定設為 “待審批”)。
此工作流程運作良好。 -
計劃工作流程(處理待審批行)
這是有問題的工作流程。
Schedule Trigger 設定為 1 分鐘(在 JSON 匯出中)。
Get row(s) in sheet v4.7:
Resource:Sheet Within Document。
Operation:Get Row(s)。
Document:By ID(Google Sheet 的 ID)。
Sheet:By ID(工作表 ID)。
Range:I1:I100 或 I1:I1000(具有標頭的狀態欄)。
Filter:Status 欄 = en_attente_validation。
已啟用選項:“Return only First Matching Row”,以便每次執行只處理一行。
“準備 - LED 燈帶” Code:
檢索該行(決定、狀態、顏色、電子郵件等),
如果決定為空 / “待審批”,或如果狀態 ≠ en_attente_validation,或決定未被識別,則忽略,
計算促銷代碼 + 產品連結,
輸出結構化 JSON(包含行索引),隨後用於 Gorgias 和更新工作表。
根據決定,工作流程的其餘部分:
透過 Gorgias 傳送票證/回應,
更新工作表中的狀態(根據情況使用多個 Update row in sheet 節點),
必要時更新其他工作表。
觀察到的問題
A. “Starting soon / Queued” 狀態的執行激增
在 Executions 標籤中,我經常看到:
一系列 “Starting soon / Queued at HH:MM:SS” 執行具有相同的時間戳,
儘管界面顯示 “No active executions”。
在停用 insights 之前,日誌還顯示了與內部指標相關的重複 SQLite 錯誤(“Error while saving insights metadata and raw data”,SQLITE_ERROR: ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint)。新增 N8N_INSIGHTS_ENABLED=false 並重新啟動後,這些錯誤消失了。
B. Google Sheets 429 / 超過配額的錯誤
Get row(s) in sheet 節點最終總是失敗,錯誤訊息為:
The service is receiving too many requests from you
Quota exceeded for quota metric ‘Read requests’ and limit ‘Read requests per minute per user’ of service ‘sheets.googleapis.com’(配額為 60 次讀取/分鐘)。
查看 Google Cloud 端的指標時,我看到的 GetSpreadsheet / read_requests 數量遠超我對簡單 “get rows” 的預期,該操作每 1–2 分鐘執行一次,特別是在啟用新的 “Return only First Matching Row” 選項之後。
已經嘗試過的方法
n8n 方面:並發量降低到 1(N8N_CONCURRENCY_PRODUCTION_LIMIT=1)。
已停用 Insights/診斷以消除 SQLite 雜訊。
Sheets v4.7 節點方面:將 Document / Sheet 從 “From list” 改為 By ID。
明確的範圍 I1:I1000 包括第 1 行(標頭),否則 n8n 找不到 Status 欄。
Filter Status = en_attente_validation。
已啟用 “Return only First Matching Row” 選項,以便每次執行只處理一行。
“準備 - LED 燈帶” Code 方面:
新增防護:如果輸入為空(items.length === 0),返回 以停止工作流程,
在將任何內容傳送到 Gorgias 或 Update 節點之前篩選所有不相關的行。
我也在考慮:
減少 Schedule Trigger 的頻率(從 1 分鐘改為 5 分鐘),
驗證沒有其他 n8n 工作流程使用同一帳戶存取相同的 Sheets。
我期望得到的回饋
有沒有其他人在使用 Google Sheets “Get row(s) in sheet” 節點版本 4.7(Sheet Within Document、By ID)時注意到讀取請求量非常高,即使在 “Return only First Matching Row” + 受限範圍的模式下?
您有用於定期處理 Google Sheets 行的 “安全” 模式嗎,同時遵守 ReadRequestsPerMinutePerUser = 60 的配額?
例如:每次執行讀取一行,確保不會在所有分支中重複讀取同一工作表等。
您會建議:
保留 v4.7 但採用其他配置,
為此用例恢復到較舊的節點(4.5),
完全從 Google Sheets 中移出此邏輯(Apps Script、專用資料庫等)?
我很樂意聽取經驗分享 / 最佳實踐,特別是對於:
限制重複的 GetSpreadsheet,
避免 “Starting soon / Queued” 執行激增,
並在不完全改變架構的情況下保持穩定。
錯誤訊息是什麼(如果有的話)?
請分享您的工作流程
(在您的畫布上選擇節點,並使用鍵盤快捷鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 複製和貼上工作流程。)
分享最後一個節點傳回的輸出
您的 n8n 設定相關資訊
- n8n 版本:
- 資料庫(預設值:SQLite):
- n8n EXECUTIONS_PROCESS 設定(預設值:own、main):
- 透過以下方式執行 n8n(Docker、npm、n8n cloud、桌面應用):
- 作業系統: