3、核心组件安装:策略引擎安装、数据库初始化、消息队列配置

好,咱们进入正题。这一章讲的是策略执行点部署里最核心的基建活儿——把策略引擎、数据库、消息队列这三兄弟安顿好。说实话,我在不少项目里见过因为这一步图省事,后面线上出问题排查到崩溃的情况。所以咱们慢慢来,把每个坑都踩明白。

3.1 策略引擎安装

策略引擎是整个系统的“大脑”。你给它输入条件,它给你输出决策。我习惯把它拆成两个部分来理解:规则解析器和执行上下文。

核心要点:策略引擎的安装本质上是一个 Java 应用部署,但它的依赖和配置项比普通 Web 服务要多。重点关注 JVM 参数、规则库路径、以及扩展点目录。

3.1.1 环境准备

先看看你需要什么。我列个清单,你对着准备就行:

组件 版本要求 备注
JDK 11+ (推荐 17 LTS) 我用的是 OpenJDK,Oracle JDK 也行
操作系统 CentOS 7+ / Ubuntu 20.04+ 内核参数需要调一下,后面说
磁盘 SSD,至少 50GB 规则库和日志会膨胀,别省这个钱
内存 最低 8GB,推荐 16GB+ JVM 堆内存至少给 4GB

注意:千万不要用 JDK 8。我在一个老项目里吃过亏——JDK 8 的 G1 垃圾回收器在策略引擎高并发场景下会频繁 Full GC,导致决策超时。换成 JDK 17 后,问题直接消失。

3.1.2 安装步骤

嗯,这里我直接给操作步骤。你跟着敲就行:

# 1. 创建专用用户(别用 root 跑)
useradd -m -s /bin/bash pep-engine
su - pep-engine

# 2. 解压安装包
tar -xzf pep-engine-3.2.1.tar.gz -C /opt/pep-engine

# 3. 配置环境变量
cat >> ~/.bashrc << 'EOF'
export PEP_HOME=/opt/pep-engine
export PATH=$PEP_HOME/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
EOF

source ~/.bashrc

# 4. 初始化配置文件
cp $PEP_HOME/conf/engine.yaml.example $PEP_HOME/conf/engine.yaml

配置文件里,有几个参数我建议你重点关注:

  • rule.base.path:规则库存放路径。我习惯把它挂载到独立的数据盘上,方便后续扩容。
  • engine.worker.threads:工作线程数。公式是 CPU核心数 * 2,别贪多,线程切换也是有开销的。
  • engine.cache.size:规则缓存大小。默认 10000 条,如果你的规则数量超过这个数,记得调大。

小技巧:启动前先用 pep-engine check 命令做一次配置校验。它能帮你发现 YAML 格式错误、路径不存在、端口冲突这类低级问题。我曾经有一次漏了冒号,排查了半小时……

3.2 数据库初始化

策略引擎需要数据库来存规则元数据、执行日志、以及一些运行时状态。我推荐用 PostgreSQL,当然 MySQL 8.0+ 也行。但说实话,PostgreSQL 在复杂查询和 JSON 支持上更顺手。

3.2.1 建库建表

先创建数据库和用户。安全起见,权限别给太大:

-- 创建专用数据库
CREATE DATABASE pep_db WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8';

-- 创建专用用户
CREATE USER pep_admin WITH PASSWORD 'YourStrongPassword!';

-- 只给必要权限
GRANT CONNECT ON DATABASE pep_db TO pep_admin;
GRANT ALL PRIVILEGES ON DATABASE pep_db TO pep_admin;

表结构不用手写。策略引擎安装包里自带了一个 schema.sql,直接跑就行:

psql -h localhost -U pep_admin -d pep_db -f $PEP_HOME/sql/schema.sql

跑完之后,你会看到这些核心表:

表名 用途 数据量预估
pep_rules 规则定义表 几千到几万条
pep_rule_versions 规则版本历史 规则数的 10-20 倍
pep_execution_log 执行日志 每天几百万条
pep_decision_cache 决策结果缓存 取决于缓存策略

注意:pep_execution_log 表会快速增长。我建议你提前规划好分区策略——按天分区,保留最近 30 天的数据。否则半年后,一张表几百 GB,查询和清理都成问题。

3.2.2 连接池配置

策略引擎用的是 HikariCP 连接池。配置在 engine.yaml 的 datasource 段:

datasource:
  url: jdbc:postgresql://localhost:5432/pep_db
  username: pep_admin
  password: YourStrongPassword!
  driver-class-name: org.postgresql.Driver
  hikari:
    maximum-pool-size: 20
    minimum-idle: 5
    idle-timeout: 300000
    connection-timeout: 30000
    max-lifetime: 1800000

这里有个坑——max-lifetime 一定要比数据库侧的 wait_timeout 短。我遇到过连接被数据库侧断开,但连接池不知道,还在用“死连接”的情况。设成 30 分钟,基本能避开这个问题。

3.3 消息队列配置

策略引擎不直接处理所有请求。它通过消息队列来解耦——接收决策请求,异步返回结果。我推荐用 RabbitMQ 或 Kafka。小规模用 RabbitMQ 就够了,大规模(日均千万级请求)上 Kafka。

3.3.1 为什么需要消息队列?

你想想看,如果没有消息队列,每次决策请求都直接打到策略引擎。高峰期一来,引擎扛不住,整个系统就瘫了。有了消息队列,请求先排队,引擎按自己的节奏处理。说白了,就是给系统加了个“缓冲带”。

核心逻辑:请求方只管往队列里扔消息,策略引擎只管从队列里拿消息。两边互不依赖,各自独立扩缩容。

3.3.2 RabbitMQ 配置示例

我以 RabbitMQ 为例,讲一下怎么配。先创建虚拟主机和用户:

# 创建虚拟主机
rabbitmqctl add_vhost pep_vhost

# 创建用户
rabbitmqctl add_user pep_mq YourMQPassword

# 授权
rabbitmqctl set_permissions -p pep_vhost pep_mq ".*" ".*" ".*"

然后在策略引擎的配置文件里,加上消息队列的配置:

mq:
  type: rabbitmq
  host: localhost
  port: 5672
  virtual-host: pep_vhost
  username: pep_mq
  password: YourMQPassword
  queues:
    decision-request:
      name: pep.decision.request
      durable: true
      prefetch-count: 100
    decision-response:
      name: pep.decision.response
      durable: true
      prefetch-count: 50

prefetch-count 这个参数很关键。它控制每个消费者一次能拿多少条消息。设得太小,消费者吃不饱;设得太大,消息堆积在消费者内存里,容易 OOM。我一般根据单条消息的处理耗时来算——如果处理一条要 10ms,prefetch 设 100,刚好 1 秒的缓冲量。

3.3.3 消息格式约定

消息体用 JSON,结构尽量简单。我习惯这样定义:

{
  "requestId": "uuid-xxxx",
  "timestamp": 1700000000000,
  "context": {
    "userId": "user_123",
    "resourceType": "api",
    "resourceId": "api_456",
    "attributes": {
      "ip": "192.168.1.1",
      "method": "GET"
    }
  }
}

为什么要有 requestId?方便追踪。线上排查问题时,拿着这个 ID 去查日志、查数据库、查消息队列,一条链路就串起来了。

小技巧:消息队列的监控一定要做。我建议你至少监控三个指标:队列深度、消费延迟、消费失败数。队列深度超过阈值就告警,别等到消息堆积到几百万条才发现。

3.4 整体架构图

说了这么多,咱们用一张图把这三者的关系理清楚:

策略执行点核心组件架构 请求方 消息队列 (RabbitMQ/Kafka) 策略引擎 数据库 (PostgreSQL) 发送请求 消费消息 读写规则/日志 返回结果 异步回调 说明: 请求方不直接调用策略引擎,而是通过消息队列异步通信。策略引擎从队列消费请求, 执行决策后将结果写回响应队列,请求方通过回调或轮询获取结果。数据库只被策略引擎访问。

这张图把流程讲得很清楚了。请求方发消息到队列,策略引擎从队列拿消息,处理过程中读写数据库,处理完把结果放回队列。整个链路是异步的,谁都不等谁。

3.5 验证与测试

装完别急着上线。先跑一轮验证,确保每个环节都通:

  1. 检查引擎状态:pep-engine status,看进程是否在运行,端口是否监听。
  2. 测试数据库连接:用 psql 连上去,跑一条 SELECT count(*) FROM pep_rules;,确认能查到数据。
  3. 测试消息队列:往队列里发一条测试消息,看引擎能不能消费到,并且日志里有没有报错。
  4. 端到端测试:模拟一次完整的决策请求,从发消息到拿结果,全链路走通。

小技巧:我习惯在测试环境里故意制造一些异常场景——比如把数据库停掉、把消息队列停掉,看引擎会不会优雅降级。如果它直接崩溃,那说明容错没做好,得回去改代码。

好了,核心组件的安装就这些。每一步都不难,但细节多。你按这个流程走,基本不会出大问题。如果遇到什么奇怪的报错,先看日志,日志里通常有答案。