npm package: @qwe8652591/abap-recursive-query
Description: ABAP Recursive Query Tool - SAP ABAP object extraction library
Author: 824000672@qq.com
Latest version: 1.1.0

# AI Build Download - Redis 队列系统

基于 Redis 队列 + 生产者-消费者模式的 ABAP 递归查询下载系统。

## 🎯 核心特性

- ✅ **高性能**: 查询次数减少50%，速度提升3-10倍，过滤规则性能提升20倍
- ✅ **可扩展**: 支持水平扩展，100+并发消费者，优化的连接管理
- ✅ **可靠性**: 任务持久化，自动重试，断点续传
- ✅ **零硬编码**: 通用设计，适用于任何 SAP GUI 程序
- ✅ **资源优化**: Redis连接减少99%，内存占用大幅降低

## 📁 项目结构

```
src/
├── common/          # 通用组件（类型、配置、队列管理、工具函数）
├── producer/        # 生产者（并发递归查询，内存队列）
├── consumer/        # 消费者（文件下载，Redis队列）
└── cli/             # CLI 工具
    ├── query-object.ts    # 单体模式（推荐）
    ├── producer-cli.ts    # 只启动生产者
    └── consumer-cli.ts    # 只启动消费者
```

## 🚀 快速开始

### 1. 环境准备

```bash
# 安装 Redis
docker run -d --name redis -p 6379:6379 redis:latest

# 安装依赖
pnpm install
```

### 2. 配置环境变量

复制 `env.example` 到 `.env` 并修改：

```bash
cp env.example .env
```

最少配置（`.env`）：

```env
# SAP 连接（必需）
SAP_URL=https://your-sap-system.com:8000
SAP_USERNAME=your_username
SAP_PASSWORD=your_password
SAP_CLIENT=100

# Redis 连接
REDIS_HOST=localhost
REDIS_PORT=6379
```

更多配置选项请参考 `env.example` 文件。

### 3. 使用

#### 方式一：单体模式（推荐）

```bash
pnpm build
pnpm query -- PROGRAM SAPLMEGUI -d 3

# 带过滤规则
pnpm query -- CLASS CL_MY_CLASS -d 5 -e Z_OLD -x "*_TEST"
```

#### 方式二：分离模式（高性能）

```bash
# 终端1：启动生产者
pnpm build
pnpm producer -- PROGRAM SAPLMEGUI -d 3
# 输出: Job ID: abc-123-def

# 终端2：启动消费者
pnpm consumer -- --job-id abc-123-def -c 50

# 或启动多个消费者进程实现水平扩展
pnpm consumer -- -c 50  # 进程1
pnpm consumer -- -c 50  # 进程2
pnpm consumer -- -c 50  # 进程3
```

## 🏗️ 架构说明

### 工作流程

```
用户请求
   ↓
Producer（生产者）
├─ 并发递归查询（10并发，内存队列）
├─ 提取依赖关系
├─ 缓存对象数据（gzip压缩）
└─ 生成任务 → Redis 队列
   ↓
Consumers（消费者集群）
├─ 从 Redis 拉取任务
├─ 读取缓存数据
├─ 下载源代码
└─ 处理附加数据（Include、结构体、屏幕等）
```

### 核心组件

- **common/RedisQueueManager**: 队列和缓存管理
- **producer/RecursiveQueryProducer**: 递归查询（内存队列）
- **consumer/FileDownloadConsumer**: 文件下载（Redis队列）

## 📊 性能对比

| 指标 | 旧实现 | 新实现（10消费者） | 新实现（150消费者） | 提升 |
|------|--------|------------------|-------------------|------|
| 150对象耗时 | 22.5秒 | 7.5秒 | 2秒 | 最高10倍 |
| 查询次数 | 300次 | 150次 | 150次 | 减少50% |
| 并发能力 | 20 | 100+ | 100+ | 5倍+ |

## 📦 API 使用

```typescript
import { 
    RedisQueueManager,
    RecursiveQueryProducer,
    FileDownloadConsumer 
} from '@qwe8652591/ai-build-download';

// 创建组件
const queueManager = new RedisQueueManager();
const producer = new RecursiveQueryProducer(queueManager);

// 提交查询
const jobId = await producer.submitQuery('PROGRAM', 'SAPLMEGUI', config);

// 启动消费者
const consumer = new FileDownloadConsumer(queueManager, './downloads', [jobId]);
await consumer.start([jobId]);

// 等待完成
await producer.waitForCompletion(jobId);
```

## ⚙️ 环境变量

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `REDIS_HOST` | localhost | Redis 服务器地址 |
| `REDIS_PORT` | 6379 | Redis 端口 |
| `PRODUCER_CONCURRENCY` | 10 | 生产者并发查询数 |
| `CONCURRENT_CONSUMERS` | 10 | 默认消费者数量 |
| `QUEUE_MAX_SIZE` | 40 | 队列背压阈值 |
| `MAX_RETRIES` | 3 | 最大重试次数 |
| `CACHE_EXPIRY` | 1800 | 缓存过期时间（秒） |
| `ENABLE_COMPRESSION` | true | 启用 gzip 压缩 |

## 🎮 CLI 命令

### 单体模式

```bash
# 基本查询
pnpm query -- PROGRAM SAPLMEGUI

# 带参数
pnpm query -- -t CLASS -n CL_MY_CLASS -d 5 -c 20

# 带过滤规则
pnpm query -- PROGRAM Z_PROG -e Z_OLD -x "*_TEST" -x "*_TMP"

# 完整帮助
pnpm query -- --help
```

### 分离模式

```bash
# 生产者
pnpm producer -- PROGRAM SAPLMEGUI -d 3

# 消费者（处理特定 Job）
pnpm consumer -- --job-id <job-id> -c 50

# 消费者（处理所有活跃 Job）
pnpm consumer -- -c 20
```

## 🐛 故障排查

### Redis 连接失败

```bash
# 检查 Redis 是否运行
redis-cli ping
# 应该返回: PONG
```

### 查看队列状态

```bash
redis-cli

# 查看所有 Job
ZRANGE abap:job:index 0 -1

# 查看队列大小
GET abap:queue:size:<job-id>
```

## 📚 技术文档

详细的技术设计和实现说明请参考：
- [技术设计文档](../../docs/RECURSIVE_QUERY_REFACTOR_TECHNICAL_DESIGN.md)
- [优化总结](./OPTIMIZATION_SUMMARY.md) - 最新的性能优化详情

## 📄 License

MIT