隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?

隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?

文章图片

隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?

文章图片

隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?

文章图片

隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?

文章图片

隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?

文章图片

隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?

文章图片


当我们构建一个应用 , 总是希望它是响应迅速 , 成本低廉的 。 而在实际中 , 我们的系统却面临各种各样的挑战 , 例如不可预测的流量高峰 , 依赖的下游服务变得缓慢 , 少量请求却消耗大量 CPU/内存资源 。 这些因素常常导致整个系统被拖慢 , 甚至不能响应请求 。 为了让应用服务总是响应迅速 , 很多时候不得不预留更多的计算资源 , 但大部分时候 , 这些计算资源都是闲置的 。 一种更好的做法是将耗时缓慢 , 或者需要消耗大量资源的处理逻辑从请求处理主逻辑中剥离出来 , 交给更具资源弹性的系统异步执行 , 不但让请求能够被迅速处理返回给用户 , 也节省了成本 。
一般来说 , 长耗时 , 消耗大量资源 , 或者容易出错的逻辑 , 非常适合从请求主流程中剥离出来 , 异步执行 。 例如新用户注册 , 注册成功后 , 系统通常会发送一封欢迎邮件 。 发送欢迎邮件的动作就可以从注册流程中剥离出来 。 另一个例子是用户上传图片 , 图片上传后通常需要生成不同大小的缩略图 。 但图片处理的过程不必包含在图片上传处理流程中 , 用户上传图片成功后就可以结束流程 , 生成缩略图等处理逻辑可以作为异步任务执行 。 这样应用服务器避免被图片处理等计算密集型任务压垮 , 用户也能更快的得到响应 。 常见的异步执行任务包括:
发送电子邮件/即时消息 检查垃圾邮件 文档处理(转换格式 , 导出 , ……) 音视频 , 图片处理(生成缩略图 , 加水印 , 鉴黄 , 转码 , ……) 调用外部的三方服务 重建搜索索引 导入/导出大量数据 网页爬虫 数据清洗 …… Slack , Pinterest , Facebook 等公司都广泛的使用异步任务 , 实现更好的服务可用性 , 更低的成本 。 根据Dropbox 统计 , 他们的业务场景中一共有超过100种不同类型的异步任务 。 一个功能完备的异步任务处理系统能带来显著的收益:
更快的系统响应时间 。 将长耗时的 , 重资源消耗的逻辑从请求处理流程中剥离 , 在别的地方异步执行 , 能有效的降低请求响应延时 , 带来更好的用户体验 。更好的处理大量突发性请求 。 在电商等很多场景下 , 常常有大量突发性请求对系统造成冲击 。 同样的 , 如果将重资源消耗逻辑从请求处理流程中剥离 , 在别的地方异步执行 , 那么相同资源容量的系统能响应更大峰值的请求流量 。更低的成本 。 异步任务的执行时长通常在数百毫秒到数小时之间 , 根据不同的任务类型 , 合理的选择任务执行时间和更弹性的使用资源 , 就能实现更低的成本 。更完善的重试策略和错误处理能力 。 任务保证被可靠的执行(at-least-once) , 并且按照配置的重试策略进行重试 , 从而实现更好的容错能力 。 例如调用第三方的下游服务 , 如果能变成异步任务 , 设置合理的重试策略 , 即使下游服务偶尔不稳定 , 也不影响任务的成功率 。更快的完成任务处理 。 多个任务的执行是高度并行化的 。 通过伸缩异步任务处理系统的资源 , 海量的任务能够在合理的成本内更快的完成 。更好的任务优先级管理和流控 。 任务根据类型 , 通常按照不同的优先级处理 。 异步任务管理系统能帮助用户更好的隔离不同优先级的任务 , 既让高优先级任务能更快的被处理 , 又让低优先级任务不至于被饿死 。更多样化的任务触发方式 。 任务的触发方式是多种多样的 , 例如通过 API 直接提交任务 , 或是通过事件触发 , 或是定时执行等等 。更好的可观测性 。 异步任务处理系统通常会提供任务日志 , 指标 , 状态查询 , 链路追踪等能力 , 让异步任务更好的被观测、更容易诊断问题 。更高的研发效率 。 用户专注于任务处理逻辑的实现 , 任务调度 , 资源扩缩容 , 高可用 , 流控 , 任务优先级等功能都由任务处理系统完成 , 研发效率大幅提高 。 任务处理系统架构 任务处理系统通常包括三部分:任务 API 和可观测 , 任务分发和任务执行 。 我们首先介绍这三个子系统的功能 , 然后再讨论整个系统面临的技术挑战和解决方案 。