JDK 提供的有 ExecutorService
和 ScheduledExecutorService
提供异步和调度任务,但是存在一些弊病:
基于内存。应用宕机任务丢失
只支持单机,或者是单 JVM 实例。不支持集群,存在单点问题。如果应用是集群部署,存在任务重复执行问题
缺少重试。任务异常后,任务无法通过重试自愈,重新执行
限流。通过限流保护应用不会因为压力过大宕机
生命周期管理。任务无法启动、停止
动态调整。无法调整任务参数、执行频率
不支持高级任务。任务分片,MapReduce 类型
任务上下游依赖。
监控告警、任务日志查看
关键特性
周期性执行任务。如固定频率、固定延迟、CRON
嵌入式
中间件
DAG
执行数据下载、导入任务时,往往采用异步任务执行这些长耗时任务。但是对于缺乏重试、监控的 ExecutorService
,任务异常时无法重新执行,缺少容错性。如何保证异步任务执行的可靠性就成了这些长耗时任务的关注点。
除此之外还要考虑异步任务性能,为支持数以百万的异步任务执行,需支持异步任务在集群其他节点的执行。
Python 语言的 Celery、Ruby 语言的 sidekiq,提供了简单、高性能、功能齐全的异步任务,只需要简单配置,就可以像在本地调用异步一样,实现集群异步任务。
Python
Ruby
Go
Java
Celery 实现
Sidekiq 实现
Resque 实现
其他