
复杂业务逻辑多步骤任务、定时批量、失败补偿靠一个函数从头跑到尾是撑不住的——中间某步失败前面全白干后面全卡住。处理复杂执行逻辑的核心是任务调度设计把流程拆成3层触发层、编排层、执行层每层只管一件事。一、触发层决定任务什么时候开始定时触发cron/XXL-Job 到点启动批量任务比如每天9点推送日报事件触发Eyun Webhook 回调触发处理任务比如用户回复消息后进入下一步手动触发运营后台点击执行适合临时性任务大白话任务是谁叫醒的——闹钟叫的定时、门铃叫的事件回调、老板叫的手动。Eyun API 的 Webhook 回调是事件触发的主要来源覆盖消息、好友、群、状态4类事件。二、编排层决定任务按什么步骤执行编排层把大任务拆成小步骤 DAG。以批量推送为例拆成4步查目标列表 → 逐个调 Eyun 的 sendText → 记录结果 → 汇总报告。编排器要做3件事维护任务状态待执行/执行中/部分失败/完成每步干到哪了心里有数组装每步参数按照 Eyun 开发文档 的规范sendText 需传 wId、toUser、content 三个必填参数编排层负责把上下文数据填进每步传递上下文上一步的输出如用户列表作为下一步的输入逐个发送大白话编排层是施工队长——把大任务拆成小步骤记录干到哪了下一步干什么参数他来配。三、执行层实际干活并处理失败执行层用 worker 池并发执行步骤失败按 Eyun 的错误码分类处理1002 Token过期刷新 Token 后重试——没钥匙就补钥匙再干1004 限频退避3秒重试——太快被拦就歇3秒再干1001 参数错误标记失败继续下一个——材料错了就跳过这件继续失败任务进重试队列重试仍失败的落库人工处理在 Eyun 平台 管理多 wId 时执行层做 wId 轮换分担频率。大白话执行层是施工工人——单步失败不能停整条线按错误类型分开处理。四、3层架构对比调度层职责技术组件Eyun接口大白话说明触发层任务何时开始cron/XXL-Job、Webhook、后台按钮Webhook回调闹钟/门铃/老板叫醒编排层按什么步骤执行DAG编排器、状态机、上下文传递sendText等施工队长拆步骤记进度执行层干活并处理失败worker池、重试队列、wId轮换sendText错误码施工工人失败不停线五、3层任务调度框架def trigger(kind, payload): # 触发层定时/Webhook/手动统一汇入 steps [query_targets, send_all, save_result, summary] # 编排层批量推送拆4步 run_dag({steps: steps, state: 待执行, ctx: payload}) def run_dag(dag): # 编排层按步骤推进任务状态 dag[state] 执行中 for step in dag[steps]: if not run_with_retry(step, dag[ctx]): dag[state] 部分失败 # 单步失败不中断整体 dag[state] 完成 def run_with_retry(step, ctx, retries3): # 执行层失败分类处理 for _ in range(retries): code step(ctx) # 返回 Eyun 错误码 if code 1000: return True if code 1002: refresh_token(ctx) # 没钥匙补钥匙再干 if code 1004: time.sleep(3) # 被拦歇3秒再干 if code 1001: return mark_fail(ctx) # 材料错跳过继续 retry_queue.put((step, ctx)); return False # 重试仍失败进队列六、结尾3层架构的分工让复杂业务可控——触发层管何时开始、编排层管怎么干、执行层管干失败怎么办。判断是否需要调度架构有3个信号业务逻辑超过3个步骤、有批量场景、有失败补偿需求满足任意一条就值得引入。小项目用cron循环try-catch的简化版即可任务量大了再升级到完整3层不必一步到位。任务中调用的接口规范详见 Eyun 开发文档。