Ice 规则引擎常见问题 FAQ

Ice 规则引擎使用过程中的常见问题解答,帮助您快速解决问题

关于 Ice 规则引擎

Ice 规则引擎可以用来做工作流引擎吗?

Ice 规则引擎本身是无状态的轻量级规则引擎。如果需要实现工作流引擎功能,建议在 Ice 规则引擎基础上进行二次开发封装。

Ice 规则引擎的定位

  • Ice 是一种抽象的业务编排框架,类似于抽象一个方法
  • 理论上代码能实现的逻辑,Ice 规则引擎都可以实现
  • 适用于规则配置、条件判断、业务编排等场景
  • 如需工作流的状态持久化、流程审批等功能,需要额外开发

Ice 规则引擎与传统规则引擎的区别?

Ice 规则引擎与 Drools、Activiti 等传统规则引擎相比:

  • 更轻量:零性能损耗,纯内存计算
  • 更灵活:树形编排结构,节点独立,修改互不影响
  • 更易用:可视化配置,学习成本低
  • 更快速:毫秒级响应,适合高并发场景

架构相关问题(Ice 2.0)

Ice Server 和 Client 是如何通信的?

Ice 2.0 架构

Ice 2.0 采用文件系统同步的架构,Server 和 Client 不直接进行网络通信

  • Server 将配置写入共享存储目录(ice-data/
  • Client 通过轮询文件系统获取配置更新
  • 心跳信息也是通过写入文件来实现
Server → 写入配置 → 共享存储 (ice-data/) ← 读取配置 ← Client

这意味着

  • 不需要 Server 和 Client 之间的网络连通
  • 只需要它们能访问同一个存储目录
  • 支持 NFS、云盘等分布式存储方案

共享存储无法访问会影响配置更新吗?

Ice 规则引擎的存储容错机制

  • 本地缓存:Client 启动后会将配置加载到内存
  • 轮询机制:Client 默认每 5 秒检查 version.txt 文件
  • 增量更新:只加载变更的配置,降低 IO 开销
  • 全量回退:如果增量文件缺失,自动进行全量加载

注意事项

  • 共享存储故障期间,Client 端的规则配置不会更新
  • 但已加载的配置仍然可以正常执行
  • 存储恢复后会自动同步最新配置

如何实现高可用?

Ice 2.0 通过共享存储实现高可用:

  • 使用 NFS、阿里云 NAS、AWS EFS 等作为共享存储
  • 多个 Server 实例可以同时写入(需注意并发控制)
  • 多个 Client 实例可以同时读取
# docker-compose.yml 示例
services:
  ice-server-1:
    volumes:
      - /shared/ice-data:/app/ice-data
  ice-server-2:
    volumes:
      - /shared/ice-data:/app/ice-data
  client-1:
    volumes:
      - /shared/ice-data:/app/ice-data

Client 常见问题

Client 无法加载配置?

检查清单

  1. 检查存储路径:确认 ice.storage.path 与 Server 共享同一目录
  2. 检查 App ID:确认 ice.app 配置正确
  3. 检查目录权限:确认应用有读取存储目录的权限
  4. 检查版本文件:确认存储目录中存在 {app}/version.txt 文件

配置更新不生效?

常见原因

  1. 未发布:在 Server 修改配置后需要点击「发布」按钮
  2. 轮询间隔:Client 默认 5 秒轮询一次,可能有延迟
  3. 版本文件:检查 version.txt 是否已更新
  4. 日志检查:查看 Client 日志是否有加载配置的记录

启动时报节点类找不到?

错误示例

ERROR (IceConfCache.java:62)- class not found conf:{"id":118,"type":6,"confName":"*.*.*Flow"}

原因:Client 中未找到对应的节点类

解决方案

  1. 检查节点类是否存在于 ice.scan 配置的包路径下
  2. 检查节点类的全类名是否正确
  3. 确认节点类已正确编译并打包

子节点错误

ERROR (IceConfCache.java:91)- sonId:73 not exist please check! conf:{"id":70,"sonIds":"73,74","type":1}

未找到对应 ID 的子节点,一般为子节点初始化失败导致。检查子节点的配置是否正确。

如果报错的节点未在业务中使用,可以忽略。

Server 常见问题

Server 挂了会影响 Client 吗?

Ice 2.0 架构下

  • Server 仅负责配置的操作和存储
  • Client 运行时完全不依赖 Server,直接从文件系统读取配置
  • Server 宕机后:
    • ✅ 已启动的 Client 可以正常运行
    • ✅ 新 Client 也可以正常启动(只要共享存储中有配置数据)
    • ❌ 无法在 Server 界面修改和发布新配置

💡 关键点:Client 只依赖共享存储目录,不依赖 Server 进程

Server 支持集群吗?

Ice 2.0 支持通过共享存储实现多 Server 实例部署:

  • 多个 Server 共享同一个 ice-data 目录
  • 推荐使用 NFS、阿里云 NAS、AWS EFS 等
  • 需要在负载均衡器后面部署多个 Server 实例

如何备份配置数据?

Ice 2.0 的配置以 JSON 文件存储,备份非常简单:

# 备份整个存储目录
cp -r ./ice-data ./ice-data-backup-$(date +%Y%m%d)

# 或者使用 rsync 增量备份
rsync -avz ./ice-data/ /backup/ice-data/

性能相关问题

Ice 规则引擎的性能如何?

  • 纯内存计算:规则执行完全在内存中进行
  • 毫秒级响应:单次规则执行通常在 1ms 以内
  • 零网络开销:配置同步基于文件系统,不影响执行性能
  • 无锁设计:节点执行互不干扰,天然支持高并发

如何优化 Client 启动速度?

  1. 配置 scan 路径:指定叶子节点扫描包,避免全量扫描
ice:
  scan: com.your.package.nodes  # 只扫描指定包
  1. 减少节点数量:清理不再使用的节点配置
  2. 使用 SSD 存储:加快配置文件读取速度

更多问题

如果以上内容未能解决您的问题,欢迎通过以下方式获取帮助: