第一章:开发环境搭建
做实时风控系统,第一步就是把环境搭好。说实话,这一步看着琐碎,但踩过的坑真不少。我记得刚带团队时,光环境不一致的问题就浪费了两周时间。所以这一章,我把自己的经验沉淀下来,帮你把基础打牢。
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 分别是 11924 和 13266。导入后稍作调整就能用。
我曾经遇到过一个坑:Prometheus 默认只保留15天的数据。对于风控系统来说,有时候需要回溯一个月甚至更久的历史指标做分析。所以记得改 --storage.tsdb.retention.time 参数,我一般设成60天。
本章小结
环境搭建这块,说白了就是四个字:一次配好,到处运行。虚拟环境隔离 Python 依赖,Docker 统一中间件环境,Flink 本地开发环境让你高效编码,Prometheus + Grafana 让你对系统了如指掌。
这些工具链配好了,后面的开发工作才能顺畅。别嫌麻烦,基础打牢了,后面写代码才爽。
公众号:蓝海资料掘金营,微信deep3321