# ez-worker **Repository Path**: tojsp/ez-worker ## Basic Information - **Project Name**: ez-worker - **Description**: EZ-WORKER - 是基于EZ-JOB的专为重型爬虫和长时间任务设计的分布式调度执行端,目前已经集成了Playwright. 调度端:https://gitee.com/tojsp/ez-job,需要搭配使用。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/tojsp/ez-work - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-02-07 - **Last Updated**: 2026-05-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, playwright, Maven, SpringBoot, Spider ## README # EZ-Worker ## 项目简介 EZ-Worker 是基于 XXL-JOB 二次开发的分布式任务调度平台,专为 **重型资源密集型任务** 设计,特别适配 Playwright、Selenium 等网络爬虫框架的长时间运行场景。 ## 项目背景 ### XXL-JOB 的优势与局限 **✅ XXL-JOB 的优势:** - 轻量级、易上手、开箱即用 - 非常适合短平快的调度任务(秒级、毫秒级) - 强大的任务编排和调度能力 - 成熟的分布式调度架构 **❌ XXL-JOB 在重型任务场景的局限:** - 对于耗时数十秒甚至数分钟的长时间运行任务支持不足 - 缺乏针对资源密集型任务的资源管理机制 - 无法有效控制 Playwright/Selenium 等浏览器实例的并发数量 - 容易导致执行器资源耗尽(内存溢出、CPU 饱和) ### EZ-Worker 的设计初衷 在网络爬虫、自动化测试等场景中,任务往往具有以下特点: - **高资源消耗**: 每个浏览器实例占用大量内存(100-500MB) - **长时间运行**: 单个任务耗时数十秒到数分钟 - **并发敏感**: 过多并发会导致资源争抢,反而降低整体效率 **EZ-Worker 通过引入执行端任务队列机制,实现了调度与执行的解耦:** - **调度中心**: 负责任务分发和调度策略 - **执行端**: 自主管理资源队列,控制实际并发执行数量 - **最大化资源利用率**: 在资源约束下达到最优吞吐量 ## 核心特性 ### 🎯 资源队列管理 - 执行端内置任务队列,支持动态调整并发数 - 自动感知系统资源使用情况,避免过载 - 支持任务优先级和超时控制 ### 🚀 高性能执行 - 针对 Playwright/Selenium 优化的浏览器实例池 - 支持浏览器实例复用,减少启动开销 - 智能任务调度,避免资源争抢 ### 📊 实时监控 - 任务队列状态监控 - 资源使用情况可视化 - 执行性能指标统计 ### 🔧 开箱即用 - 继承 XXL-JOB 的简单易用特性 - 提供完整的示例代码 - 支持快速集成到现有项目 ## 适用场景 ✅ **适合使用 EZ-Worker 的场景:** - 网络爬虫任务(Playwright、Selenium) - Web 自动化测试 - 需要浏览器渲染的数据采集 - 其他资源密集型、长时间运行的任务 - **轻量级快速任务与重型任务混合调度**(框架自动识别) ⚠️ **不适合的场景:** - 对实时性要求极高的任务(毫秒级响应) - 纯计算密集型任务(无 I/O 等待) # 技术架构 ### 整体架构 ``` 调度中心(XXL-JOB Admin) | | 任务分发 ↓ 执行端(EZ-Worker Executor) | ├→ 任务队列管理器 ├→ 浏览器实例池 ├→ 资源监控器 └→ 任务执行器 ``` ### 详细调度流程 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 1. 应用启动 - 资源预热阶段 │ └─────────────────────────────────────────────────────────────────┘ | v ┌──────────────────┐ │ 初始化配置加载 │ │ - 队列容量配置 │ │ - 并发线程数配置 │ │ - 浏览器参数配置 │ └────────┬─────────┘ | v ┌──────────────────┐ │ Playwright 预热 │ │ - 安装浏览器驱动 │ │ - 预创建实例池 │ │ - 初始化上下文 │ └────────┬─────────┘ | v ┌──────────────────┐ │ 队列管理器初始化 │ │ - 创建任务队列 │ │ - 启动消费线程池 │ │ - 注册监控指标 │ └────────┬─────────┘ | ┌────────────────────────────┴────────────────────────────┐ │ 2. 运行时 - 任务调度阶段 │ └─────────────────────────────────────────────────────────┘ | v ┌───────────────────────────────────┐ │ XXL-JOB 调度中心触发任务 │ │ (可配置路由策略: 轮询/随机等) │ └──────────────┬────────────────────┘ | v ┌──────────────────────────────────┐ │ 执行端接收任务(智能路由) │ │ - 轻量级任务: 立即返回 SUCCESS │ │ - 重型任务: 返回 RUNNING │ │ - 任务参数封装为 Task 对象 │ │ - 提交到 BlockingQueue │ └──────────────┬───────────────────┘ | v ┌──────────────────────────────────┐ │ 任务队列缓冲区 │ │ ┌────────────────────────────┐ │ │ │ Task1 → Task2 → Task3 → .. │ │ │ └────────────────────────────┘ │ │ 容量: 可配置(默认 1000) │ └──────────────┬───────────────────┘ | ┌───────────────────────┴─────────────────────────┐ │ 3. 执行层 - 资源协调阶段 │ └─────────────────────────────────────────────────┘ | v ┌──────────────────────────────────┐ │ 消费线程池(固定线程数) │ │ Thread-1 Thread-2 Thread-N │ │ ↓ ↓ ↓ │ └──────────────┬───────────────────┘ | v ┌──────────────────────────────────┐ │ 从队列阻塞获取任务(take) │ │ - 队列空时线程等待不占用CPU │ │ - 有任务时立即唤醒执行 │ └──────────────┬───────────────────┘ | v ┌──────────────────────────────────┐ │ 从浏览器实例池获取资源(租借) │ │ - 池中有空闲实例: 立即返回 │ │ - 池已满: 阻塞等待或创建新实例 │ └──────────────┬───────────────────┘ | v ┌──────────────────────────────────┐ │ 执行爬虫业务逻辑 │ │ 1. 打开页面(page.goto) │ │ 2. 元素操作(点击/输入) │ │ 3. 数据提取(解析/存储) │ │ 4. 异常处理(重试/告警) │ └──────────────┬───────────────────┘ | v ┌──────────────────────────────────┐ │ 归还浏览器实例到池(释放资源) │ │ - 清理页面上下文 │ │ - 重置浏览器状态 │ │ - 标记实例为可用 │ └──────────────┬───────────────────┘ | v ┌──────────────────────────────────┐ │ 记录执行结果/指标 │ │ - 执行耗时统计 │ │ - 成功/失败计数 │ │ - 队列长度监控 │ └──────────────┬───────────────────┘ | v ┌──────────────────────────────────┐ │ 回调结果到调度中心(重型任务) │ │ - 调用 XXL-JOB 回调接口 │ │ - 上报最终执行状态(SUCCESS/FAIL) │ │ - 传递执行日志/结果数据 │ └──────────────────────────────────┘ | └──→ 循环回到"获取任务" ┌─────────────────────────────────────────────────────────────────┐ │ 关键设计要点 │ ├─────────────────────────────────────────────────────────────────┤ │ ✓ 智能路由: 轻量级任务直接执行返回SUCCESS,重型任务异步执行返回RUNNING │ │ ✓ 异步解耦: 调度端投递即返回,不阻塞调度中心 │ │ ✓ 流量削峰: 队列缓冲突发流量,平滑执行压力 │ │ ✓ 资源复用: 浏览器实例池避免频繁创建/销毁(每次启动耗时 2-5s) │ │ ✓ 并发控制: 固定线程数防止资源耗尽(内存/CPU) │ │ ✓ 背压机制: 队列满时可配置拒绝策略(阻塞/丢弃/告警) │ │ ✓ 状态回调: 重型任务完成后自动回调结果到调度中心 │ └─────────────────────────────────────────────────────────────────┘ ``` ## 快速开始 详细使用文档请参考: - [爬虫使用指南](docs/CRAWLER-USAGE-GUIDE.md) - [任务执行流程](docs/TASK-EXECUTION-FLOW.md) - [架构设计](docs/crawler-architecture-design-v2.md) ## 项目目标 - ✅ 开发迅速: 基于成熟框架二次开发 - ✅ 学习简单: 保持 XXL-JOB 的简洁设计理念 - ✅ 轻量级: 最小化依赖,易于部署 - ✅ 易扩展: 灵活的任务处理器接口 - ✅ 高效率: 针对重型任务优化的资源管理