Skip to content

jcz123/devapiv2

Repository files navigation

DevAPI v2 - 高性能区块链事件索引服务

🚀 项目概述

DevAPI v2 是一个专为高并发场景设计的区块链事件索引与分析服务,能够处理每天300-400万条事件数据。相比原版本,v2版本在性能、可扩展性和稳定性方面都有显著提升。

🎯 核心特性

  • 高性能批处理: 支持每秒处理35-46个事件,峰值可达数百个/秒
  • 智能缓存系统: Redis缓存层,显著提升查询性能
  • 分布式架构: 多工作线程并行处理,充分利用多核CPU
  • 实时监控: Prometheus指标导出,全面的性能监控
  • 数据分区: 按时间分区的数据库表,优化大数据量查询
  • 故障恢复: 自动重试机制和连接恢复
  • 内存优化: 使用mimalloc分配器,减少内存碎片

📊 性能指标

指标 原版本 v2版本 提升
事件处理速度 ~5 events/sec 35-46 events/sec 8-9倍
批处理大小 单条处理 2000条/批次 2000倍
数据库连接 单连接 100连接池 100倍
缓存命中率 无缓存 85%+ 新增
内存使用 标准分配器 mimalloc优化 20%减少

🏗️ 架构设计

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   gRPC Client   │───▶│  Event Parser    │───▶│  Batch Queue    │
│  (Yellowstone)  │    │                  │    │  (Crossbeam)    │
└─────────────────┘    └──────────────────┘    └─────────────────┘
                                                         │
                                                         ▼
┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   API Server    │◀───│  Redis Cache     │◀───│ Batch Processor │
│   (Axum)        │    │                  │    │ (16 Workers)    │
└─────────────────┘    └──────────────────┘    └─────────────────┘
         │                                               │
         ▼                                               ▼
┌─────────────────┐                            ┌─────────────────┐
│  Prometheus     │                            │  PostgreSQL     │
│  Metrics        │                            │  (Partitioned)  │
└─────────────────┘                            └─────────────────┘

🔧 核心组件

  1. gRPC事件订阅: 实时接收Solana区块链事件
  2. 事件解析器: 解析不同类型的pump.fun事件
  3. 批量处理器: 高效的批量数据处理
  4. 缓存层: Redis缓存热点数据
  5. 数据库层: 分区PostgreSQL存储
  6. API服务: RESTful API接口
  7. 监控系统: Prometheus指标导出

🚀 快速开始

环境要求

  • Rust: 1.75+ (推荐使用 rustup 安装)
  • PostgreSQL: 15+ (支持分区表和JSONB)
  • Redis: 7+ (用于缓存和实时计数)
  • Docker: 20.10+ (可选,用于容器化部署)
  • 系统: Linux/macOS (推荐 Ubuntu 20.04+)
  • 硬件: 8GB+ RAM, 4+ CPU核心, 100GB+ 存储

方式一:Docker 部署(推荐)

这是最简单的部署方式,包含完整的监控栈:

# 1. 克隆项目
git clone https://github.com/Fuck-Meme/devapiv2.git
cd devapiv2

# 2. 启动完整服务栈
docker-compose up -d

# 3. 查看服务状态
docker-compose ps

# 4. 查看日志
docker-compose logs -f devapi

服务地址:

方式二:手动部署

步骤1:安装依赖

Ubuntu/Debian:

# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env

# 安装系统依赖
sudo apt update
sudo apt install -y pkg-config libssl-dev libpq-dev postgresql-client redis-tools

# 安装 PostgreSQL 和 Redis
sudo apt install -y postgresql-15 redis-server

CentOS/RHEL:

# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env

# 安装系统依赖
sudo yum install -y pkg-config openssl-devel postgresql-devel postgresql redis

# 启动服务
sudo systemctl start postgresql redis
sudo systemctl enable postgresql redis

步骤2:配置数据库

# 1. 创建数据库用户和数据库
sudo -u postgres psql << EOF
CREATE USER devapi_user WITH PASSWORD 'your_secure_password';
CREATE DATABASE devapi OWNER devapi_user;
GRANT ALL PRIVILEGES ON DATABASE devapi TO devapi_user;
\q
EOF

# 2. 初始化数据库结构
psql -h localhost -U devapi_user -d devapi -f scripts/setup-db.sql

步骤3:配置Redis

# 编辑 Redis 配置
sudo nano /etc/redis/redis.conf

# 添加以下配置
maxmemory 512mb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000

# 重启 Redis
sudo systemctl restart redis

步骤4:配置应用

# 1. 克隆项目
git clone https://github.com/Fuck-Meme/devapiv2.git
cd devapiv2

# 2. 配置环境变量
cp .env.example .env

# 3. 编辑配置文件
nano .env

重要配置项说明:

# 数据库配置
DB_HOST=localhost
DB_PORT=5432
DB_NAME=devapi
DB_USER=devapi_user
DB_PASSWORD=your_secure_password
DB_MAX_CONNECTIONS=50

# Redis配置
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_MAX_CONNECTIONS=20

# gRPC配置(Solana节点)
GRPC_ENDPOINT=https://api.mainnet-beta.solana.com

# 性能配置
BATCH_SIZE=1000          # 批处理大小
BATCH_TIMEOUT_MS=5000    # 批处理超时
WORKER_COUNT=8           # 工作线程数
QUEUE_SIZE=10000         # 队列大小

# 服务配置
API_HOST=0.0.0.0
API_PORT=3000
METRICS_HOST=0.0.0.0
METRICS_PORT=9090

# 日志配置
RUST_LOG=info

步骤5:构建和运行

# 1. 构建项目
cargo build --release

# 2. 运行服务
cargo run --release

# 或者使用部署脚本
chmod +x scripts/deploy.sh
./scripts/deploy.sh

方式三:生产环境部署

使用 systemd 服务

# 1. 创建服务文件
sudo nano /etc/systemd/system/devapi-v2.service
[Unit]
Description=DevAPI v2 高性能区块链事件索引服务
After=network.target postgresql.service redis.service
Requires=postgresql.service redis.service

[Service]
Type=simple
User=devapi
Group=devapi
WorkingDirectory=/opt/devapi-v2
ExecStart=/opt/devapi-v2/target/release/devapi-v2
Restart=always
RestartSec=10
Environment=RUST_LOG=info
EnvironmentFile=/opt/devapi-v2/.env

# 性能优化
LimitNOFILE=65536
LimitNPROC=32768

# 安全设置
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/devapi-v2/logs

[Install]
WantedBy=multi-user.target
# 2. 创建用户和目录
sudo useradd -r -s /bin/false devapi
sudo mkdir -p /opt/devapi-v2/logs
sudo chown -R devapi:devapi /opt/devapi-v2

# 3. 复制文件
sudo cp -r . /opt/devapi-v2/
sudo chown -R devapi:devapi /opt/devapi-v2

# 4. 启动服务
sudo systemctl daemon-reload
sudo systemctl enable devapi-v2
sudo systemctl start devapi-v2

# 5. 查看状态
sudo systemctl status devapi-v2
sudo journalctl -u devapi-v2 -f

Nginx 反向代理

# 安装 Nginx
sudo apt install -y nginx

# 创建配置文件
sudo nano /etc/nginx/sites-available/devapi-v2
server {
    listen 80;
    server_name your-domain.com;

    # API 服务
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # 监控指标
    location /metrics {
        proxy_pass http://127.0.0.1:9090/metrics;
        allow 127.0.0.1;
        allow 10.0.0.0/8;
        deny all;
    }

    # 健康检查
    location /health {
        proxy_pass http://127.0.0.1:3000/health;
        access_log off;
    }
}
# 启用配置
sudo ln -s /etc/nginx/sites-available/devapi-v2 /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

数据迁移

如果你有现有的数据需要迁移:

# 1. 设置数据库连接
export OLD_DATABASE_URL='postgresql://user:pass@host:port/old_db'
export NEW_DATABASE_URL='postgresql://user:pass@host:port/new_db'

# 2. 运行迁移脚本
./scripts/migrate-from-original.sh

# 3. 验证迁移结果
psql $NEW_DATABASE_URL -c "SELECT COUNT(*) FROM blockchain_events;"

📡 API接口

开发者统计

# 获取开发者列表
GET /api/devs?page=1&per_page=100&sort_by=total_creator_profit&order=DESC

# 获取开发者评分
GET /api/devs/scores?page=1&per_page=200

热门数据

# 获取热门代币
GET /api/trending?per_page=50

# 获取顶级交易者
GET /api/traders?per_page=50

系统信息

# 系统统计
GET /api/stats

# 健康检查
GET /api/health

# 批处理状态
GET /api/status

监控指标

# Prometheus指标
GET /metrics

⚙️ 配置说明

批处理优化

# 批次大小 - 影响内存使用和处理延迟
BATCH_SIZE=2000

# 刷新间隔 - 影响实时性
BATCH_FLUSH_INTERVAL_MS=3000

# 工作线程数 - 建议设置为CPU核心数
BATCH_WORKER_COUNT=16

# 队列大小 - 防止内存溢出
BATCH_MAX_QUEUE_SIZE=100000

数据库优化

# 连接池大小
DB_MAX_CONNECTIONS=100
DB_MIN_CONNECTIONS=10

# 超时设置
DB_ACQUIRE_TIMEOUT=30
DB_IDLE_TIMEOUT=600
DB_MAX_LIFETIME=1800

缓存优化

# Redis连接
REDIS_MAX_CONNECTIONS=50
REDIS_CONNECTION_TIMEOUT=5
REDIS_RESPONSE_TIMEOUT=10

📊 性能监控

关键性能指标

  • 事件处理速度: 35-46 事件/秒 (平均), 峰值可达数百/秒
  • 内存使用: < 2GB (正常运行)
  • CPU使用: < 80% (4核心)
  • 数据库连接: 50个连接池
  • Redis缓存命中率: > 90%
  • 日处理量: 300-400万事件

监控端点

# 健康检查
curl http://localhost:3000/health

# Prometheus指标
curl http://localhost:9090/metrics

# 系统统计
curl http://localhost:3000/api/stats

# 实时性能
curl http://localhost:3000/api/performance

Prometheus指标详解

# 事件处理指标
devapi_events_received_total{event_type="create|trade|complete"}
devapi_events_processed_total{event_type="create|trade|complete"}
devapi_events_processing_duration_seconds
devapi_batch_size_histogram
devapi_events_per_second
devapi_queue_size

# 数据库指标
devapi_db_connections_active
devapi_db_connections_idle
devapi_db_query_duration_seconds{operation="insert|select|update"}
devapi_db_pool_size
devapi_db_slow_queries_total

# 缓存指标
devapi_cache_hits_total{cache_type="token|stats|user"}
devapi_cache_misses_total{cache_type="token|stats|user"}
devapi_cache_hit_rate
devapi_cache_memory_usage_bytes
devapi_cache_operations_total{operation="get|set|del"}

# 系统指标
devapi_memory_usage_bytes
devapi_cpu_usage_percent
devapi_goroutines_count
devapi_gc_duration_seconds
devapi_uptime_seconds

Grafana仪表板

推荐监控面板:

  1. 事件处理概览

    • 事件处理速率 (EPS)
    • 累计处理事件数
    • 事件类型分布
    • 处理延迟分布
  2. 系统性能

    • CPU使用率
    • 内存使用情况
    • 磁盘I/O
    • 网络流量
  3. 数据库监控

    • 连接池使用率
    • 查询响应时间
    • 慢查询统计
    • 数据库大小增长
  4. 缓存性能

    • 缓存命中率
    • 缓存内存使用
    • 缓存操作QPS
    • 缓存过期统计
  5. 队列监控

    • 队列积压情况
    • 批处理大小分布
    • 工作线程状态
    • 处理延迟趋势

告警规则

# prometheus-alerts.yml
groups:
  - name: devapi-alerts
    rules:
      # 事件处理速度过低
      - alert: DevAPILowThroughput
        expr: rate(devapi_events_processed_total[5m]) < 20
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "DevAPI 事件处理速度过低"
          description: "过去5分钟平均处理速度 {{ $value }} 事件/秒,低于预期"

      # 内存使用过高
      - alert: DevAPIHighMemory
        expr: devapi_memory_usage_bytes > 2147483648  # 2GB
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "DevAPI 内存使用过高"
          description: "内存使用 {{ $value | humanize1024 }},超过2GB限制"

      # 数据库连接池耗尽
      - alert: DevAPIDBPoolExhausted
        expr: devapi_db_connections_active / devapi_db_pool_size > 0.9
        for: 30s
        labels:
          severity: critical
        annotations:
          summary: "数据库连接池即将耗尽"
          description: "连接池使用率 {{ $value | humanizePercentage }},接近上限"

      # 缓存命中率过低
      - alert: DevAPILowCacheHitRate
        expr: devapi_cache_hit_rate < 0.8
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Redis 缓存命中率过低"
          description: "缓存命中率 {{ $value | humanizePercentage }},低于80%"

      # 队列积压严重
      - alert: DevAPIQueueBacklog
        expr: devapi_queue_size > 50000
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "事件队列积压严重"
          description: "当前队列大小 {{ $value }},处理能力不足"

      # 服务不可用
      - alert: DevAPIDown
        expr: up{job="devapi-v2"} == 0
        for: 30s
        labels:
          severity: critical
        annotations:
          summary: "DevAPI 服务不可用"
          description: "DevAPI 服务已停止响应"

🔧 运维指南

性能调优

  1. 批处理大小调优

    • 增大批次可提高吞吐量,但会增加延迟
    • 建议根据内存和延迟要求调整
  2. 工作线程调优

    • 设置为CPU核心数的1-2倍
    • 监控CPU使用率避免过载
  3. 数据库连接池调优

    • 根据并发查询数量调整
    • 监控连接池使用率
  4. 缓存策略调优

    • 调整TTL时间平衡实时性和性能
    • 监控缓存命中率

故障排查

1. 队列积压问题

症状: 队列大小持续增长,事件处理延迟增加

排查步骤:

# 检查队列状态
curl http://localhost:9090/metrics | grep devapi_queue_size

# 检查数据库性能
psql $DATABASE_URL -c "
SELECT query, mean_time, calls, total_time 
FROM pg_stat_statements 
ORDER BY mean_time DESC LIMIT 10;"

# 检查系统资源
top -p $(pgrep devapi-v2)
iostat -x 1 5

解决方案:

  • 增加工作线程数: WORKER_COUNT=16
  • 优化批处理大小: BATCH_SIZE=2000
  • 检查数据库索引和查询优化
  • 考虑水平扩展

2. 内存使用过高

症状: 内存使用超过2GB,可能出现OOM

排查步骤:

# 检查内存使用
ps aux | grep devapi-v2
cat /proc/$(pgrep devapi-v2)/status | grep -E "VmRSS|VmSize"

# 检查内存指标
curl http://localhost:9090/metrics | grep devapi_memory

# 分析内存分布
pmap -x $(pgrep devapi-v2)

解决方案:

  • 减少批次大小: BATCH_SIZE=500
  • 调整队列大小: QUEUE_SIZE=5000
  • 检查内存泄漏
  • 重启服务释放内存

3. 数据库连接问题

症状: 连接池耗尽,数据库查询失败

排查步骤:

# 检查连接池状态
curl http://localhost:9090/metrics | grep devapi_db_connections

# 检查数据库连接
psql $DATABASE_URL -c "
SELECT state, count(*) 
FROM pg_stat_activity 
WHERE datname = 'devapi' 
GROUP BY state;"

# 检查慢查询
psql $DATABASE_URL -c "
SELECT query, mean_time, calls 
FROM pg_stat_statements 
WHERE mean_time > 1000 
ORDER BY mean_time DESC;"

解决方案:

  • 增加连接池大小: DB_MAX_CONNECTIONS=100
  • 优化慢查询和索引
  • 检查长时间运行的事务
  • 调整连接超时设置

4. 缓存性能问题

症状: 缓存命中率低,响应时间增加

排查步骤:

# 检查缓存指标
curl http://localhost:9090/metrics | grep devapi_cache

# 检查Redis状态
redis-cli info memory
redis-cli info stats
redis-cli slowlog get 10

# 分析缓存键分布
redis-cli --bigkeys

解决方案:

  • 调整缓存TTL策略
  • 增加Redis内存: maxmemory 1gb
  • 优化缓存键设计
  • 检查缓存预热策略

5. gRPC连接问题

症状: 无法接收Solana事件,连接频繁断开

排查步骤:

# 检查网络连接
netstat -an | grep :443
ping api.mainnet-beta.solana.com

# 检查gRPC日志
journalctl -u devapi-v2 | grep -i grpc

# 测试gRPC端点
grpcurl -plaintext api.mainnet-beta.solana.com:443 list

解决方案:

  • 检查网络防火墙设置
  • 更换gRPC端点
  • 增加重连机制
  • 检查API密钥和权限

运维脚本

健康检查脚本

#!/bin/bash
# health-check.sh

API_URL="http://localhost:3000"
METRICS_URL="http://localhost:9090/metrics"

echo "=== DevAPI v2 健康检查 ==="

# 检查API服务
if curl -f -s "$API_URL/health" > /dev/null; then
    echo "✅ API服务正常"
else
    echo "❌ API服务异常"
    exit 1
fi

# 检查指标服务
if curl -f -s "$METRICS_URL" > /dev/null; then
    echo "✅ 指标服务正常"
else
    echo "❌ 指标服务异常"
fi

# 检查事件处理速率
eps=$(curl -s "$METRICS_URL" | grep "devapi_events_per_second" | tail -1 | awk '{print $2}')
if (( $(echo "$eps > 10" | bc -l) )); then
    echo "✅ 事件处理速率正常: ${eps} EPS"
else
    echo "⚠️  事件处理速率较低: ${eps} EPS"
fi

# 检查内存使用
memory=$(curl -s "$METRICS_URL" | grep "devapi_memory_usage_bytes" | awk '{print $2}')
memory_gb=$(echo "scale=2; $memory / 1024 / 1024 / 1024" | bc)
if (( $(echo "$memory_gb < 2" | bc -l) )); then
    echo "✅ 内存使用正常: ${memory_gb}GB"
else
    echo "⚠️  内存使用较高: ${memory_gb}GB"
fi

echo "=== 检查完成 ==="

性能监控脚本

#!/bin/bash
# performance-monitor.sh

METRICS_URL="http://localhost:9090/metrics"

while true; do
    clear
    echo "=== DevAPI v2 实时性能监控 ==="
    echo "时间: $(date)"
    echo ""
    
    # 事件处理速率
    eps=$(curl -s "$METRICS_URL" | grep "devapi_events_per_second" | tail -1 | awk '{print $2}')
    echo "事件处理速率: ${eps} EPS"
    
    # 队列大小
    queue_size=$(curl -s "$METRICS_URL" | grep "devapi_queue_size" | awk '{print $2}')
    echo "队列大小: ${queue_size}"
    
    # 数据库连接
    db_active=$(curl -s "$METRICS_URL" | grep "devapi_db_connections_active" | awk '{print $2}')
    db_pool=$(curl -s "$METRICS_URL" | grep "devapi_db_pool_size" | awk '{print $2}')
    echo "数据库连接: ${db_active}/${db_pool}"
    
    # 缓存命中率
    cache_hit_rate=$(curl -s "$METRICS_URL" | grep "devapi_cache_hit_rate" | awk '{print $2}')
    cache_hit_percent=$(echo "scale=1; $cache_hit_rate * 100" | bc)
    echo "缓存命中率: ${cache_hit_percent}%"
    
    # 内存使用
    memory=$(curl -s "$METRICS_URL" | grep "devapi_memory_usage_bytes" | awk '{print $2}')
    memory_mb=$(echo "scale=0; $memory / 1024 / 1024" | bc)
    echo "内存使用: ${memory_mb}MB"
    
    echo ""
    echo "按 Ctrl+C 退出监控"
    sleep 5
done

日志分析脚本

#!/bin/bash
# log-analysis.sh

LOG_FILE="/opt/devapi-v2/logs/devapi.log"

echo "=== DevAPI v2 日志分析 ==="

# 错误统计
echo "最近1小时错误统计:"
grep "ERROR" "$LOG_FILE" | grep "$(date -d '1 hour ago' '+%Y-%m-%d %H')" | wc -l

# 性能统计
echo ""
echo "最近处理时间统计 (毫秒):"
grep "processing_time" "$LOG_FILE" | tail -100 | \
awk '{print $NF}' | sort -n | \
awk '
{
    times[NR] = $1
    sum += $1
}
END {
    print "平均值:", sum/NR
    print "中位数:", times[int(NR/2)]
    print "最小值:", times[1]
    print "最大值:", times[NR]
}'

# 最近错误
echo ""
echo "最近10条错误:"
grep "ERROR" "$LOG_FILE" | tail -10

🚀 部署建议

生产环境配置

# 推荐硬件配置
CPU: 8核心+
内存: 16GB+
存储: SSD 500GB+
网络: 1Gbps+

# 数据库配置
PostgreSQL: 14+
连接池: 100-200
分区: 按日分区
索引: 优化查询索引

# 缓存配置
Redis: 6+
内存: 4GB+
持久化: AOF + RDB

高可用部署

  1. 数据库高可用

    • 主从复制
    • 读写分离
    • 自动故障转移
  2. 应用高可用

    • 多实例部署
    • 负载均衡
    • 健康检查
  3. 缓存高可用

    • Redis集群
    • 哨兵模式
    • 数据备份

📈 扩展性

水平扩展

  • 支持多实例部署
  • 数据库分片
  • 缓存集群
  • 消息队列

垂直扩展

  • 增加CPU核心数
  • 扩大内存容量
  • 使用更快的存储
  • 优化网络带宽

🤝 贡献指南

  1. Fork项目
  2. 创建特性分支
  3. 提交更改
  4. 推送到分支
  5. 创建Pull Request

📄 许可证

MIT License

📞 支持

如有问题或建议,请提交Issue或联系维护团队。

About

Pumpfun Dev分析 V2 重构版

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published