第一章:开发环境搭建

做实时风控系统,第一步就是把环境搭好。说实话,这一步看着琐碎,但踩过的坑真不少。我记得刚带团队时,光环境不一致的问题就浪费了两周时间。所以这一章,我把自己的经验沉淀下来,帮你把基础打牢。

1.1 Python虚拟环境配置

Python版本冲突,我估计你遇到过。项目A用3.8,项目B用3.10,全局装一起就乱套了。虚拟环境就是解决这个问题的。

核心思路:每个项目独立一套Python解释器和依赖包,互不干扰。

我个人习惯用 venv,Python3.3+自带,不用额外装。操作很简单:

# 创建虚拟环境
python3 -m venv risk_env

# 激活环境(Linux/Mac)
source risk_env/bin/activate

# 激活环境(Windows)
risk_env\Scripts\activate

# 安装依赖
pip install -r requirements.txt

# 退出环境
deactivate

小技巧:我一般把 requirements.txt 分成三份:base.txt(核心依赖)、dev.txt(开发工具)、prod.txt(生产环境)。这样部署时只装需要的,镜像能小不少。

为什么推荐 venv 而不是 conda?说白了,conda 太重了。你想想看,一个风控系统可能跑在容器里,镜像体积能省则省。venv 轻量,够用。

我曾经有个项目,团队里有人用 conda,有人用 pipenv,结果 CI/CD 流水线里依赖解析老报错。后来统一成 venv + pip,问题就没了。嗯,这里要注意:团队统一工具链很重要

1.2 Docker Compose搭建Kafka集群

实时风控离不开消息队列。Kafka 是业界标配。但本地装 Kafka 挺麻烦的——要配 Zookeeper,要调 JVM 参数,还要处理网络配置。用 Docker Compose 就简单多了。

我直接给你看我的 docker-compose.yml 配置:

version: '3.8'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.3.0
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - "2181:2181"

  kafka:
    image: confluentinc/cp-kafka:7.3.0
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1

注意:生产环境一定要把 KAFKA_ADVERTISED_LISTENERS 改成内网IP或域名。我见过有人直接复制这个配置上生产,结果客户端连不上——因为容器里 localhost 指向的是容器本身,不是宿主机。

启动集群就一行命令:

docker-compose up -d

验证是否启动成功:

# 查看容器状态
docker-compose ps

# 创建测试topic
docker exec -it kafka kafka-topics --create \
  --topic test_risk_events \
  --bootstrap-server localhost:9092 \
  --partitions 3 \
  --replication-factor 1

# 查看topic列表
docker exec -it kafka kafka-topics --list \
  --bootstrap-server localhost:9092

你想想看,传统方式装 Kafka 要下载、解压、改配置、启动 ZK、再启动 Kafka,至少十分钟。用 Docker Compose,两分钟搞定。这就是效率。

1.3 Flink本地开发环境配置

Flink 是实时计算的核心。本地开发环境我建议用两种方式:

方式 适用场景 配置难度
IntelliJ IDEA + Maven 日常开发调试
Docker 单机 Flink 集成测试

我个人推荐第一种。为什么?因为开发效率高。IDE 里直接打断点、看变量、跑单元测试,比反复打包部署快太多了。

Maven 依赖配置:

<properties>
    <flink.version>1.17.0</flink.version>
    <scala.binary.version>2.12</scala.binary.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka</artifactId>
        <version>${flink.version}</version>
    </dependency>
</dependencies>

避坑指南:我曾经因为 Flink 和 Kafka 客户端版本不匹配,折腾了一整天。记住:flink-connector-kafka 的版本要和 Flink 主版本一致,不要自己乱改。

本地跑一个简单的 WordCount 验证环境:

public class RiskWordCount {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = 
            StreamExecutionEnvironment.getExecutionEnvironment();
        
        DataStream<String> text = env.socketTextStream("localhost", 9999);
        
        text.flatMap((String line, Collector<Tuple2<String, Integer>> out) -> {
            for (String word : line.split(" ")) {
                out.collect(new Tuple2<>(word, 1));
            }
        })
        .keyBy(value -> value.f0)
        .sum(1)
        .print();
        
        env.execute("Risk WordCount");
    }
}

启动后,在终端执行 nc -lk 9999 输入数据,就能看到实时计算结果了。

1.4 Prometheus + Grafana监控栈搭建

做风控系统,监控是命门。指标算错了你不知道,系统挂了你不清楚,那还做什么风控?

Prometheus 负责采集和存储指标,Grafana 负责可视化。这套组合拳,业界公认的黄金搭档。

Docker Compose 一键部署:

services:
  prometheus:
    image: prom/prometheus:v2.45.0
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana:10.0.3
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123

Prometheus 配置文件 prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'flink'
    static_configs:
      - targets: ['host.docker.internal:9249']
  - job_name: 'kafka'
    static_configs:
      - targets: ['host.docker.internal:9308']

关键指标:实时风控系统至少要监控这几项——
- 事件处理延迟(p99, p999)
- 吞吐量(每秒处理事件数)
- 告警命中率
- 系统资源使用率(CPU、内存、GC)

Grafana 配置好数据源后,我建议你直接导入现成的 Dashboard。社区有 Flink 和 Kafka 的官方模板,ID 分别是 1192413266。导入后稍作调整就能用。

我曾经遇到过一个坑:Prometheus 默认只保留15天的数据。对于风控系统来说,有时候需要回溯一个月甚至更久的历史指标做分析。所以记得改 --storage.tsdb.retention.time 参数,我一般设成60天。

本章小结

环境搭建这块,说白了就是四个字:一次配好,到处运行。虚拟环境隔离 Python 依赖,Docker 统一中间件环境,Flink 本地开发环境让你高效编码,Prometheus + Grafana 让你对系统了如指掌。

这些工具链配好了,后面的开发工作才能顺畅。别嫌麻烦,基础打牢了,后面写代码才爽。


公众号:蓝海资料掘金营,微信deep3321