V10 中的 9.x 能力
迁移之前,用这一页查清你的服务用到的每项 9.x 能力会怎样。每一行说明这项能力的去向:
- 保留:V10 有它。
- 替代:V10 用另一种方式提供它。说明一栏写明怎样提供;
wow-migrateSkill 会改写用到它的代码。 - 放弃:V10 有意不提供它。说明一栏写明该怎么做。
- 10.x:10.0 里没有,计划在之后的 10.x 版本提供。
命令
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| 命令网关:发送、等待、执行 | 保留 | 基于协程;结果以命令结果的 flow 到达。 |
| Reactor 形态的命令网关 | 放弃 | 在协程里调用网关,或者在 Java 里通过客户端的 CompletableFuture 门面调用。处理函数仍可以返回 Mono 或 Flux。 |
等待阶段 SENT、PROCESSED、SNAPSHOT、PROJECTED、EVENT_HANDLED、SAGA_HANDLED | 替代 | 三个阶段 accepted、committed 和 handled(subscription),默认 snapshot,在线上都是小写。见等待结果。 |
等待链尾部请求头(Command-Wait-Tail-*) | 替代 | 多跳的 Wow-Wait 计划。 |
| 跨上下文等待 | 保留 | 信号直接发往发起节点。 |
| 用服务端推送事件返回结果 | 保留 | 每到达一跳一个事件。 |
| 请求 ID 幂等 | 保留 | 请求 ID 在每个租户和聚合类型下唯一;用于另一种命令类型时被拒绝。 |
| 布隆过滤器幂等检查 | 替代 | 每个缓存的聚合保存它最近的请求(从日志推出);其余由存储回答。 |
命令改写器(CommandBuilderRewriter) | 替代 | 准入时的命令转换器;它不能改变命令的身份。会自己发送命令的改写器,像其他 bean 一样在构造参数中接收服务的 CommandClient。要拒绝命令的改写器,比如查找落空时,调用 reject(code, message),错误码声明在命令所挂载的聚合上;它抛出的其他异常都是 500(在转换器中拒绝)。 |
挂在另一个聚合上的命令(@AggregateRoot(commands)) | 替代 | @MountedCommand;不指明聚合的命令用 @Unaddressed。 |
| 命令校验(Jakarta Bean Validation) | 替代 | 在准入时校验:命令类上的 Jakarta 约束,对每条命令(HTTP、进程内、Saga、定时器、其他上下文)检查,回答 wow.command.invalid(400)。需要状态的规则是拒绝。 |
@VoidCommand | 放弃 | 发送命令,等待不超过 accepted。 |
自定义路由(@CommandRoute、@AggregateRoute) | 放弃 | 路由从 Manifest 推出:POST /{context}/{aggregate}/{id}/{command},创建命令不带 {id}。 |
不开放 HTTP 路由的命令(@CommandRoute(enabled = false)) | 替代 | 只由平台发送时:@InternalCommand,公开端口不挂它的路由,内部端口受理调用它的服务(只在内部受理的命令)。由手写的用户路由发送时:命令保持公开,走生成的路由,原路由所做的事由转换器或 Wow-Scope 完成(路由、租户与所有权)。 |
Command-* 请求头 | 替代 | Wow-Wait、Wow-Wait-Timeout、Wow-Request-Id、If-Match、Wow-Scope、Wow-Space。 |
| 请求头别名 | 放弃 | 在你的网关里改写请求头。 |
| 从请求头复制的请求事实 | 保留 | 一份配置的请求头列表,加上已认证的应用、远程地址和 User-Agent。 |
| 命令的操作人 | 保留 | 每次提交都会记录。 |
| 全局和按聚合的 ID 生成、CosId | 保留 | 决定函数也能通过决定作用域使用。 |
| 命令批处理 | 替代 | 分区属主批量提交。 |
额外的命令结果(CommandResultAccessor) | 替代 | 决定函数通过决定作用域返回额外结果;它们不存储,所以重复请求拿不到。 |
跨聚合的唯一键(PrepareKey、@PreparableKey) | 替代 | 通过决定作用域使用预留键,存在日志旁边;数据工具导入 9.x 已确认的键。 |
查找 PrepareKey、它的值、它的存活时间 | 10.x | 计划提供只读的预留查找。存活时间放弃:定时一条释放该键的命令。 |
| 期望版本 | 保留 | If-Match;不匹配时返回 412。 |
| 命令总线:内存、本地优先、Kafka | 替代 | 默认经集群通道分区路由;需要持久摄入时按聚合类型经 Kafka 路由。 |
| Redis 命令总线 | 放弃 | — |
单一命令端点(/wow/command/send) | 替代 | 每条命令一个路由。 |
| 命令过滤器与埋点 | 替代 | 一个观测端口,由观测模块(wow-observability)实现。 |
| 错误码到 HTTP 状态的映射 | 保留 | 用 @ErrorCode 声明,或按错误码配置。 |
领域异常转换为 ErrorInfo | 替代 | 决定结果返回一个带已声明错误码的拒绝。 |
领域模型
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| 核心注解 | 保留 | 同一个包里一套更小、重新设计的注解。 |
事件修订号与升级器(EventUpgrader) | 替代 | @Revision、@Upgrade 和 @Alias。 |
丢弃的事件(DroppedEvent) | 替代 | 退役事件,列在聚合上。 |
固定租户(@StaticTenantId) | 替代 | 在配置里为聚合类型指定固定租户。 |
固定聚合 ID(@StaticAggregateId) | 放弃 | — |
所有者和空间策略(@AggregateOwner、@Spaced) | 替代 | 按聚合类型声明归属(所有者或租户);作用域来自调用方。见身份、租户与访问。 |
命令体中的聚合 ID(@AggregateId) | 保留 | 命令体指明聚合,命令的路由不带 {id}:Saga 或客户端发送它时不带 ID。计算出的 ID 由服务算出。 |
命令字段上的租户、所有者和版本(@TenantId、@OwnerId、@AggregateVersion) | 放弃 | 租户和所有者是调用方的,期望版本是 If-Match。 |
从状态推出标签(StateAggregateTagsExtractor) | 替代 | 访问属性:状态的 @Access 成员(声明访问属性)。 |
打标签(ApplyResourceTags) | 替代 | 聚合自己的一条领域命令和一个领域事件,设置状态的访问属性;数据迁移把 9.x 的标签映射到它们(标签与基于属性的访问)。 |
| 生命周期命令:删除、恢复、转移所有者或空间 | 保留 | — |
@EntityObject、@ValueObject、@Order | 放弃 | — |
@OnError | 放弃 | 从决定函数返回拒绝,需要记录这次拒绝时带上事件;把补偿放进 Saga 的 @OnRejected 处理函数。 |
| 用 Java 写的领域模型 | 保留 | 编译器读取 Java 源码。面向 Java 的测试 API 计划在 10.x 提供。 |
| 注入命令函数的领域服务 | 保留 | 通过生成的模型工厂绑定一次。 |
错误事件(IgnoreSourcing) | 替代 | 带事件的拒绝(reject(code, message, events)),每个事件有溯源函数,不改变状态时为空;它们与拒绝一起提交。 |
| 状态类独立的聚合 | 保留 | — |
@AfterCommand、@Blocking、@CreateAggregate、@AllowCreate | 保留 | — |
快照系统字段 eventId、snapshotTime、eventTime | 替代 | firstEventTime、lastEventTime、operator、firstOperator 以及其他快照字段。 |
事件与存储
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| MongoDB 事件存储 | 保留 | 一等的日志后端;另一个是 PostgreSQL。 |
| Redis 事件存储与快照存储 | 放弃 | 数据工具只读取 9.x 的 MongoDB 存储:先在 9.x 中把 Redis 数据迁到 MongoDB。 |
| Elasticsearch 事件存储 | 放弃 | Elasticsearch 接收快照和事件流的副本用于检索,从不保存日志。迁移之前先把 9.x 数据迁到 MongoDB。 |
| MongoDB 与 Elasticsearch 快照存储 | 保留 | 还有 PostgreSQL。 |
| 快照策略(每 n 个版本) | 替代 | 每个版本都写快照,按聚合批量写入。 |
| 为聚合关闭快照 | 保留 | V10 新增。 |
按聚合的存储(storage-routing) | 保留 | 命名的存储,按聚合为日志和快照选择。 |
| 重新生成快照,单个或批量 | 保留 | 一条系统命令;状态修订号提高时自动重建。 |
| 历史状态:按版本、按时间、轨迹 | 保留 | GET …/state?version=、?at= 和 …/state/trace。 |
| 读取一个聚合的事件流 | 保留 | events 查询模型。 |
| 恢复或跳过失败的处理 | 替代 | 停放与失败台账,通过 ops 服务操作。 |
| 定向重放一个版本区间;批量重发状态事件 | 10.x | 在此之前,重试停放的聚合,或重建整个订阅。 |
把已存储的事件重新投递给某个处理函数(DomainEventCompensator),用作回填 | 替代 | 一个新名字、从事件流开头开始的处理函数,把整段历史读一遍。见重建与重放。 |
| 领域事件总线与状态事件总线 | 替代 | 日志就是总线;其他上下文读取 Kafka 上发布的事件流。见日志就是总线。 |
| 创建集合与索引 | 保留 | 由存储的 DDL 设置管理。 |
处理器与订阅
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| Saga、投影、事件处理器 | 替代 | @Saga、@Projection 和 @Reactor;每个处理函数是一个独立的订阅。 |
@OnStateEvent、@OnMessage | 替代 | @OnEvent,接收状态事件,或其中一种事件类型。 |
| 处理另一个上下文的事件 | 保留 | 通过它发布的事件流。 |
| 把另一个上下文的事件解码成共享的类 | 保留 | 把对方上下文的 api jar 放在类路径上。 |
@Retry:次数、退避、超时 | 替代 | V10 的 @Retry,可按订阅配置,之后是停放聚合的长周期重试。 |
| 可恢复与不可恢复的异常类 | 保留 | 在 @Retry 上声明,另有可插拔的失败分类器。 |
| 订阅从哪里开始 | 保留 | V10 新增:在处理函数上声明或通过配置指定。 |
外部调度器中的周期作业(Simba、@Scheduled) | 替代 | Saga 的 @OnSchedule 作业,按 cron 规则运行,不需要外部锁。要等每条命令的结果再发下一条的作业留在外部,通过命令客户端发送。见定时命令。 |
处理器过滤器、拦截器、@Order | 放弃 | — |
| 跳过无法解码的 Kafka 消息 | 10.x | V10 会停放它们。 |
| 在处理函数里读取其他聚合的状态或查询 | 替代 | 类型化的查询 API,处理函数可以使用。 |
查询
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| 单条、列表、分页、游标、计数和聚合查询 | 保留 | — |
| 过滤表达式、相对时间、元数据过滤、聚合窗口 | 保留 | — |
Condition 协议 | 放弃 | 使用过滤表达式;Skill 会改写条件。 |
Kotlin 查询 DSL 与生成的 <State>Properties | 保留 | — |
存储在事件或状态中的 Wow 查询类型(Condition、Sort、Projection) | 放弃 | 内核的 JSON 没有查询协议的编解码,构建也会拒绝持有它的事件或状态:改存应用自己的类型,并把 9.x 的 JSON 升级过去。 |
类路径上的查询 schema 覆盖(META-INF/wow/query-schema) | 放弃 | schema 来自状态类;把每个覆盖改为状态上的字段注解。 |
实现或继承查询类型(IPagedList) | 放弃 | V10 的查询类型是 final 类,用它们的工厂或 DSL 构建。 |
查询字段注解(@Sensitive、@QueryAlias、@QueryReference 等) | 保留 | — |
| 在查询和状态读取中脱敏敏感字段 | 保留 | — |
ABAC 查询策略、CoSec 的 abac. 属性 | 替代 | 由访问属性与访问策略取代(编写访问策略);wow.query.abac.* 启动时拒绝。 |
| 查询策略 SPI 与作用域 | 替代 | 作用域保留。拒绝调用方的规则是 ReadAuthorizer Bean,收窄行的规则是访问策略;QueryPolicy 是 Wow 自己的。 |
| MongoDB 与 Elasticsearch 上的快照查询 | 保留 | 还有 PostgreSQL。 |
| 事件流查询与跨聚合的聚合 | 保留 | 快照、事件和数据集共用一个查询引擎。 |
HTTP 查询路由(snapshot/list 等) | 替代 | POST /{context}/{aggregate}/{model}/query,查询种类写在请求体里。 |
| 流式返回列表 | 保留 | 可从停下处续读的服务端推送事件。 |
| 查询 schema 路由与刷新 | 替代 | 对查询路由发 GET,描述模型能做什么;schema 来自 Manifest。 |
| 数据集:目录、网关、路由 | 保留 | — |
| 数据集注册(dataset-registry) | 替代 | 分析目录,一个平台服务。 |
| ClickHouse 数据集后端 | 保留 | — |
| 查询预算、有上限的计数、游标 | 保留 | 另有每个存储一个查询舱壁。 |
消息、BI 与外部存储
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| Kafka 传输 | 替代 | 发布事件流的 Sink、对其他上下文事件流的订阅、命令主题与回执。 |
| Kafka 主题前缀与主题管理 | 保留 | — |
| 分开的生产者与消费者设置 | 10.x | 在此之前只有一个 wow.kafka.properties。 |
BI 同步脚本(/wow/bi/script) | 替代 | ClickHouse Sink 直接写数仓,并为数据集提供展平的视图。它只建单机表:在集群上,按公布的列手工建表(在集群上运行)。 |
ClickHouse 命令表(<ctx>_<agg>_command) | 放弃 | Sink 写入的是提交,不是命令。提交保留着它的命令的 id、类型和操作者;命令历史见命令不写入。 |
| BI 表中状态的嵌套展开 | 10.x | — |
| 9.x 主题的外部消费者 | 放弃 | 切换时把每个消费者改到 V10 发布的事件流。没有 9.x 格式的 Sink。 |
| 往 9.x 命令主题发命令的外部生产者 | 替代 | V10 读取 wow.<context>.commands,不读 9.x 的命令记录。切换时改每个生产者,最好改成调用命令路由(迁移外部命令生产者)。 |
租户与安全
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| CoSec 集成 | 保留 | — |
| 租户与所有者的路由前缀 | 放弃 | 身份来自调用方;被允许在别处行事的调用方在 Wow-Scope 里指明作用域。 |
| 把 CoSec 主体传播到消息 | 替代 | 操作人和会传播的请求事实,随 Saga 发出的每条命令一起传递。 |
| 跨租户的上下文 | 保留 | — |
契约、OpenAPI 与 HTTP
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
wow-metadata.json 与 /wow/metadata | 替代 | Manifest 与 GET /wow/manifest。见一份契约。 |
| JSON Schema 生成 | 替代 | 在构建期依据 Jackson 自己对类的看法生成 schema。 |
| 注册自定义 Jackson 模块 | 放弃 | Wow 的 JSON 注册一组固定的模块,所以线上形式不依赖宿主。 |
| OpenAPI 文档 | 保留 | 从 Manifest 推出;也有对应的 Gradle 任务。 |
| springdoc 集成 | 保留 | — |
错误体(ErrorInfo) | 替代 | 带错误码的 application/problem+json(RFC 9457)。 |
可观测性
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| OpenTelemetry 追踪 | 保留 | 每个指标和 Span 都改了名:指标与 Span。 |
| 指标 | 保留 | — |
| 健康指示器 | 保留 | V10 新增:Actuator 的就绪与存活分组。 |
测试
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| 聚合测试 | 保留 | V10 的测试 DSL,制品 wow-test。 |
fork、givenState、按类型的 expectError | 保留 | — |
| Saga、投影与反应器测试 | 保留 | — |
| Java 测试 API | 10.x | 在此之前测试 DSL 只支持 Kotlin。 |
TestValidator | 放弃 | — |
| TCK 与 Testcontainers 测试夹具 | 保留 | 每个端口一个 spec,整个存储用 StoreTck;总线与分发器的 spec 随总线一起去掉,查询的 spec 在 wow-query-tck 中,测试夹具不再有 Redis。见从 9.x 的 TCK 迁来。 |
wow-mock | 放弃 | — |
平台服务
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| 补偿服务 | 替代 | 基于各服务失败台账的 ops 服务和控制台。数据工具导入未解决的执行。 |
| 长周期自动重试 | 保留 | — |
| 恢复、跳过、标记为可恢复、应用重试规格 | 保留 | 恢复在 V10 中称为 retry(重试)。 |
| 修改执行的函数;强制准备 | 放弃 | — |
| 企业微信 webhook | 保留 | 另有通用 webhook。 |
| 通知中的控制台链接与模板 | 10.x | — |
| 控制台里的堆栈信息 | 放弃 | — |
| 控制台里的每日趋势分析 | 10.x | — |
| 控制台里可编辑的看板 | 放弃 | — |
| 视图存储 | 保留 | — |
| 数据集注册与分析服务 | 替代 | 分析目录。 |
扩展模块
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
wow-models | 保留 | — |
wow-cocache | 替代 | 每个聚合类型一份共享缓存,由拥有它的上下文写入,读者以 StateViewCache 读取;读者自建的索引缓存与关联缓存没有对应物。 |
wow-apiclient | 替代 | 类型化的命令与查询客户端:对服务自己的上下文在进程内运行,对其他上下文经 HTTP。见上下文之间。 |
| CosId | 保留 | 通过 CosId 5 上的 wow-cosid,用于聚合 ID:号段生成器改用 CosId 5 的配置,其状态用 CosId 的迁移工具迁移。 |
| Spring 集成与 starter 功能 | 替代 | 一个 Spring Boot 宿主模块,按类路径装配各个后端。 |
配置与运维
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
wow.* 配置 | 替代 | 新的键。未知的 wow.* 键会让服务拒绝启动,并指明它。 |
| 优雅关闭 | 保留 | — |
| 没有持久存储时快速失败 | 保留 | — |
| Maven 构建 | 放弃 | V10 的编译期绑定需要 Gradle。 |
| TypeScript 客户端生成器 | 保留 | 它读取 Manifest。 |
TypeScript
| 9.x 能力 | V10 中 | 说明 |
|---|---|---|
| 命令客户端与经 SSE 等待 | 保留 | — |
| 快照、事件、数据集与描述客户端 | 保留 | — |
Condition 与本地化的操作符 | 放弃 | — |
| 按所有者路径读取状态 | 放弃 | 身份来自调用方。 |
React 查询 hooks(wow-react) | 保留 | — |
| 视图引擎与视图存储客户端 | 保留 | — |
数据迁移
| 9.x 来源 | V10 中 | 说明 |
|---|---|---|
| MongoDB 事件存储:导入、追尾、比对、快照 | 保留 | 见迁移数据。 |
| Redis 事件存储 | 放弃 | 先在 9.x 中迁到 MongoDB。 |
| Elasticsearch 事件存储 | 放弃 | 先在 9.x 中迁到 MongoDB。 |
PrepareKey 的键 | 保留 | 作为已确认的预留导入。 |
| 未解决的补偿执行 | 保留 | 作为停放的聚合导入。 |