异步是构建可扩展和响应式系统的关键架构模式,它允许耗时操作独立于主应用程序流进行处理。本页涵盖异步处理技术、它们的实现以及何时在系统设计中应用它们。
有关可与异步系统一起使用的通信协议的信息,请参阅通信。
异步工作流有助于减少昂贵操作的请求时间,这些操作否则将在线执行。它们还可以提供一种机制,用于调度周期性批处理作业以收集数据。
消息队列在系统组件之间接收、存储和传递消息。它们充当生产者和消费者之间的缓冲区,实现服务间的异步通信。
当进程在请求中内联执行速度过慢时,您可以使用消息队列,其工作流如下:
用户不会被阻塞,作业在后台处理。在此期间,客户端可以选择进行少量处理,使其看起来任务已完成。
| 技术 | 特性 | 用例 |
|---|---|---|
| Redis | 简单的消息代理,可能丢失消息 | 一些消息丢失可以接受的简单用例 |
| RabbitMQ | 功能齐全,AMQP协议,需要专用节点 | 复杂路由,保证交付 |
| Amazon SQS | 托管服务,延迟较高,可能重复交付 | 无服务器架构,AWS集成 |
| Kafka | 高吞吐量,分布式提交日志 | 日志数据,事件流,实时分析 |
任务队列接收任务及其相关数据,运行它们并交付结果。它们支持调度,并能处理长时间运行的后台作业。
与只传输消息的消息队列不同,任务队列提供
Celery 是一个流行的任务队列实现,它支持调度并与 Python 深度集成。
当队列过大时,内存使用可能会超出容量,导致频繁进行磁盘交换并降低性能。背压是一种通过限制队列大小来缓解此问题的策略。
采用背压时
当用户在社交平台发布内容时,内容可能立即出现在自己的动态中,但实际向关注者分发的过程是异步进行的
照片共享服务可能异步处理图像上传
| 场景 | 建议 |
|---|---|
| 长时间运行的操作 | 使用异步处理 |
| 计算密集型任务 | 使用带工作进程池的任务队列 |
| 可能失败并需要重试的操作 | 使用带重试逻辑的消息队列 |
| 实时/交互式要求 | 考虑使用同步处理 |
| 轻量级操作 | 为简单起见保持同步 |
| 批处理要求 | 通过任务队列进行调度 |
在实现异步处理时,请考虑