kevy 不做什么
一个产品的形状,由它拒绝的东西定义的程度不亚于它提供的东西。这一页把 kevy 的拒绝集中在一处,好让"它能不能做 X"这个问题在你据此动工之前就有 答案。每条都写清为什么,以及那个需求该由什么来满足。
这里的拒绝是持久的。它们不是"还没做"——它们是设计据以成立的线,改动 其中一条是重新设计,不是加一个功能。
四条线
1. Redis 契约不归我们改。kevy 用 Redis 命令名回答的任何东西,含义 就是 Redis 的含义。新能力走自己的命名空间(IDX.*、FEED.*、 VIEW.*、FT.*、VEC.*),而不是给已有动词加载荷。所以:没有"改进 版"的 SET 语义,也不会给已有回复形状加字段。
2. 含义与执行计划留在你的应用里。kevy 负责存与取,不决定你的数据 是什么意思、也不决定一个查询该怎么执行。这条线拒掉的是 SQL 查询语言、 join 和基于代价的 planner:引擎一旦替你选计划,你的延迟里就多了一个你 没做、也看不见的决定。它给的是声明式访问路径——索引由你命名,代价 由你预测。
3. 拓扑是声明的,不是发现的。成员表来自配置。角色是动态的,成员 不是。
4. 网络是可信的。kevy 永久不做认证与传输加密——请把它放在一个具备 这两者的代理之后(Caddy、nginx、服务网格,或一个私有子网)。
拒绝清单,按领域
| 领域 | 拒绝 | 为什么,以及改用什么 |
|---|---|---|
| 查询 | SQL 查询语言、join、基于代价的 planner、视图层的即席谓词 | 线 2——声明一个索引或视图;IDX.QUERY / VIEW.QUERY 显式命名访问路径 |
| 查询 | 写路径回调 / 触发器 | 你的写入方本来就知道自己写了什么;回调把延迟藏进写入里 |
| 安全 | AUTH、TLS、ACL、多用户 | 线 4——在代理那一层终结 |
| 集群 | 分片多主、跨 DC 双活、CRDT | 按设计是单 DC、单分区容忍;无冲突合并是应用层的模型 |
| 集群 | Raft / 强一致日志复制 | 这套设计给的一致性是 quorum lease 加 epoch 栅栏;完整共识日志是另一个产品 |
| 集群 | 在线 resharding、gossip 发现、动态成员 | 线 3——改配置,重启该成员 |
| 存储 | 跨存储事务、租户语义 | 在引擎边界之外;在它之上组合 |
| 平台 | server 的 no_std / MCU 目标 | 五个石头 crate 本来就 no_std-capable;server 需要操作系统 |
函数面现在到哪了
kevy 那层 SQL 形状的面是一个折叠器,不是查询引擎:它算标量表达式, 好让一个从关系型数据库迁过来的应用不必重新实现它们;而任何需要 planner 的东西,它按名拒绝、绝不静默。
每次改动都被两条线卡着:
- 能力:本弧声明要服务的函数子集里,82.5% 能正确折叠,而且这个比例 只许升不许降。
- 诚实:全部 89 个探针文件里 零个错误答案。拒绝会自报家门,答错 不会。
你在决定要不要依赖它的时候,该看的是第二条。拒绝在调用处就可见,所以你 是在写代码的时候发现它,不是在生产环境里。