十万行 Excel 导入为什么不能让页面一直等?
运营提交大文件,解析和写入需要几分钟。
同步请求可能超时,浏览器关闭后结果也难以找回。
接口立即创建异步任务并返回 Job ID,后台继续处理,前端轮询或接收推送更新状态。
设计任务中心、排队、处理中、进度、取消、失败和完成通知。
理解为什么系统不会让所有任务都在当前请求里完成。
文件与 Excel、消息与通知、异步任务、订单与支付
异步系统把耗时或可延后任务交给队列、Worker 或事件订阅者处理。
它可以缩短用户等待、吸收流量高峰,并让多个业务能力松散协作。
连接后端服务、后台任务和外部处理系统。
Message Queue、Producer、Consumer、Event、Pub/Sub、Job、Worker、Retry 和 Idempotency。
发送通知、生成报告、解析文件、同步搜索索引和数据分析经常异步执行。
同步流程等待结果,异步流程先接受任务,再在后台完成。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
运营提交大文件,解析和写入需要几分钟。
同步请求可能超时,浏览器关闭后结果也难以找回。
接口立即创建异步任务并返回 Job ID,后台继续处理,前端轮询或接收推送更新状态。
设计任务中心、排队、处理中、进度、取消、失败和完成通知。
保存一条简单记录可以在请求中同步完成。生成大报告、发送大量邮件或解析视频可能耗时很长,继续占用请求会导致超时和差体验。
异步接口常先返回任务 ID,前端通过轮询、SSE 或 WebSocket观察状态。系统要设计排队中、处理中、成功、失败和取消。
看到“生成中”时,需要区分任务已提交、真正开始、处理进度和最终结果。
队列把任务发送方和执行方解耦。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
订单创建成功后还要发短信、邮件、积分和数据统计。
这些附加任务串行执行会增加下单延迟,某个通知故障还可能影响核心订单。
订单服务作为 Producer 写入 Message Queue,多个 Consumer 分别处理通知和积分;Backlog 表示待处理积压。
核心成功先反馈,附加任务可显示“通知发送中”或后台完成,避免让用户重复下单。
Producer 把消息写入队列,Consumer 从队列读取并处理。双方不必同时在线,消费者也可以按能力稳定消费。
流量高峰时队列临时积压,避免所有请求直接压垮下游。队列深度和处理延迟需要监控。
任务中心的“排队人数”和预计等待,与队列积压和消费者处理速度有关。
不同消息系统在路由、吞吐、持久化和消费模型上各有侧重。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
一个系统需要可靠分发导入任务,另一个系统需要保存海量点击事件供多方消费。
两类场景对顺序、吞吐、保留时间和消费方式要求不同。
RabbitMQ 常用于任务路由与确认;Kafka 通过 Topic 保存高吞吐事件流并支持多个消费组。
产品侧要明确任务可否取消、是否需要顺序、是否允许延迟和是否需要重放。
RabbitMQ 常用于灵活路由和任务分发,Kafka 常用于高吞吐事件流和可重放日志。云平台也提供托管队列和 Pub/Sub。
选择取决于消息量、顺序、重放、延迟、消费组和运维能力。学习全景时重点理解它们都位于服务之间。
技术名称影响不大时,先问:这是任务队列、事件流,还是简单定时任务?
命令要求执行动作,事件描述已经发生的事实。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
用户提交订单后,库存、积分和通知系统需要协作。
把要求执行的动作和已经发生的事实混在一起,会导致责任边界不清。
CreateOrder 是 Command,由明确接收者处理;OrderCreated 是 Event,通过 Pub/Sub 通知多个订阅者。
状态文案和操作按钮应区分“正在执行”与“事实已发生”。
GenerateReport 是命令,目标执行者明确;ReportGenerated 是事件,多个订阅者可以据此发送通知、更新统计或同步索引。
Pub/Sub 让发布者无需知道所有订阅者。新增分析服务时,只需订阅已有事件,原业务服务不必直接调用它。
事件名称适合用过去式表达事实;产品状态也需要反映事件处理可能存在延迟。
消息系统默认要面对失败和重复。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
消费者处理完成后确认消息时网络中断,队列再次投递同一消息。
At-least-once 保证消息尽量不丢,但可能重复执行扣款、发券或加积分。
消费者通过业务唯一键实现幂等;成功后发送 Acknowledgement;多次失败进入 Dead Letter Queue。
后台需要展示失败任务、重试次数和人工处理入口,用户侧避免重复权益。
消费者可能处理到一半崩溃,消息可能再次投递。网络错误也会触发重试。处理逻辑需要幂等,避免重复扣款、重复发券或创建多条记录。
持续失败的消息可以进入死信队列,等待人工或专门流程处理。重试要设置间隔和上限,避免故障放大。
页面的“重试”要区分前端重新请求、服务端任务重试和人工重新执行。
异步协作意味着不同系统不会在同一时刻完成更新。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
支付服务先更新订单,积分服务通过事件异步处理。
分布式系统无法保证所有服务同一瞬间成功,可能出现 Partial Failure。
系统接受短暂 Eventual Consistency;持续失败时执行 Compensation 或人工修复。
界面明确区分核心结果与附加结果,使用“积分发放中”而非错误提示。
订单创建后,库存、通知、积分和分析可能在几秒内陆续完成。系统最终达到一致状态,但短时间内不同页面可能看到不同结果。
产品需要表达处理中、同步延迟、局部失败和可恢复操作。对用户承诺“已提交”与“已完成”要清楚区分。
对异步任务使用准确文案:已提交、排队中、处理中、正在同步、部分失败、已完成。
把“上传 Excel 并导入 10 万条数据”设计成异步流程,列出所有用户可见状态和后台消息。