// the find
zjn-zjn/ice
Rule engine/process engine, committed to solving flexible and complex hard-coded problems, for complex/flexibly changing business, provide a new abstract orchestration solution that is lightweight, high-performance and provides visual operation pages. Java规则引擎-ice,针对复杂/灵活变动业务,提供一个新的抽象编排解决方案,轻量级,高性能并提供可视化操作页面
Ice is a rule engine that organizes business logic as trees of nodes rather than chains or tables, with a visual web UI for configuration and hot-reload without restarts. Rules execute in-memory with sub-millisecond latency and sync to clients via a shared file directory — no database or message queue required. It targets teams drowning in if-else sprawl for things like promotions, risk scoring, or access control.
The file-based server/client decoupling is genuinely smart: clients keep running from their in-memory cache if the server goes down, which you don't get from most rule engines that require a live backend. Multi-language SDK parity across Java, Go, and Python with consistent APIs means you're not maintaining separate rule logic per service. The parallel relation nodes (P_AND, P_ANY, etc.) are built-in rather than bolted on, which matters when leaf nodes do I/O. Zero external dependencies — no Zookeeper, no Redis, no Kafka — is a real ops win compared to something like Drools.
File-based sync is the Achilles heel at scale: in distributed mode you're depending on NFS or EFS for coordination, which introduces its own consistency and latency problems that the README glosses over. The Roam context being a stringly-typed bag of key-value pairs (roam.get("uid")) means there's no compile-time safety — typos in key names fail silently at runtime, not at build time. 673 stars and primarily Java-origin with an active Chinese community means Go and Python SDKs feel like afterthoughts — the Go SDK has a single test file in the client package. No observable audit trail for rule execution in production; the mock debugging feature requires the server to push execution into a live client, which is awkward for post-mortem debugging.