n8n Agents:让 AI 决定下一步,让工作流规定怎样执行
n8n 是连接应用和业务流程的自动化工具。Agents 让团队用目标驱动跨工具任务,再用明确的工作流、审批和执行记录控制实际动作。
先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。
01
代码思考进阶
审批面板怎样重放重复、乱序与冲突事件?
练习场景
审批页从服务端接收动作进度消息,用这些消息显示“待批准、正在执行、待确认结果”等状态。网络可能把消息重复发送或打乱到达顺序。你要设计事件归约器:把一批事件按规则变成可信显示状态。“归约”只计算状态;它不会替用户发送消息,也不会重做外部动作。
已知条件与要求
为自己的审批面板设计事件归约器,只计算显示状态,不负责发送外部请求,也不推断 n8n 内部实现。
- 每次拟执行动作有唯一非空 operationId;动作的具体内容叫作 payload,例如要发送到哪里、发送什么文字;这些内容已由可信上游固定下来。内容改变就生成新 operationId。服务给每个操作独立产生从1开始连续递增的序号 seq。
- 事件类型只有 proposed、approved、rejected、started、succeeded、failed、unknown、reconciled_success、reconciled_failure。proposed必须是seq=1;合法路径为proposed→approved或rejected;approved→started;started→succeeded、failed或unknown;unknown→reconciled_success或reconciled_failure。其余转移无效,末态不能再变化。failed只表示已确认未发生外部作用;超时归unknown。
- 页面可能乱序收到事件。相同 operationId、seq 与内容重复应去重;同键不同内容要将该操作标记冲突,之后不再给它输出可信业务状态。首次发现冲突前可能已显示过旧状态,需要明确撤销其可信标记。
- 对缺号事件先缓存;只按连续序号前进。非法转移标记冲突,不跳过错误继续归约;其他操作不受影响。重建时从空状态重放同一批事件,应得到同样的最终结果。
- 假定整批最多 100,000 条事件,所有字段已经完成类型和大小校验。只处理实际收到的消息,不能从 1 逐个遍历到收到的最大 seq。例如只收到 seq=10 亿时,应先缓存它并等待缺失消息,而不是循环检查前面的 10 亿个序号。
- 请说明数据结构、提交显示状态的时机、时间空间复杂度及至少三个最小反例,不写完整实现。
用这个情境检查你的方案
同一 operationId 按到达顺序收到 seq=3 started、seq=1 proposed、seq=2 approved,之后 seq=2 approved 又到一次。请说明每次页面可显示什么。再加入迟到的 seq=2 rejected:这不是普通重复,而是同一序号内容冲突,需要让用户知道旧显示已不可信。
需要交付什么
交付每个操作保存的状态、事件处理流程、允许转移表和逐事件推演。解释如何区分“还在等缺失消息”“真实结果未知”“记录冲突”;不要通过重新发送外部动作来修复显示状态。
查看思路
- 按操作隔离记录。 为每个operationId保留已见seq对应的完整规范化事件、下一条需要处理的序号、业务状态与冲突标记。保留已经处理过的事件身份,才能发现迟到的同键异内容;只保存最后序号会漏检。
- 先查重复与冲突。 同键同内容不改变状态;同键异内容将整个操作置为冲突并撤销可信标记。一旦发现冲突,后来的“成功”消息也不能把该操作重新标为可信;不同operationId继续独立处理。
- 只消费连续前缀。 将新序号放入映射,从nextSeq向前取已存在事件;每个事件最多消费一次。不要遍历从1到收到的最大序号。seq1不是proposed或遇到不允许的状态转移时,停止该操作并标冲突。
- 将未知保持为未知。 started后收到unknown,只显示待确认;只有reconciled_success或reconciled_failure能离开这个状态。不能因为页面卸载、超时或拒绝按钮被点过,就改写外部动作的真实结果。
- 手工推演最小序列。 同一操作先收seq3 started,再收seq1 proposed、seq2 approved:前两次显示待补齐或proposed,最后连续消费到started;随后seq4 unknown、seq5 reconciled_success得到确认成功。重复seq2 approved不重复推进。若迟到另一条seq2 rejected,必须从成功撤销可信标记为冲突。另一个操作的seq2 started在seq1 proposed之后到达是非法转移,同样冲突,不影响其他操作。
- 给出复杂度前提。 事件大小已受限且哈希表操作按摊还常数计,N个事件总处理O(N),保留身份与未消费事件O(N)空间;重复消息也计入N。重放顺序改变可能改变中间显示,但完整事件集合的最终状态相同。这个归约器不保证服务端恰好执行一次,执行幂等需要另外的协议。