跳到主要内容
版本:2.6.0

2.6.x Release Notes

2.6.x 版本目标是重构几个核心模块, 优化整体性能.

初步定义的模块有:

  • ReceiverActor 重构, 支持 Push、Pull 模式
  • EventPublish 重构, 支持 Slice 并行运行

2.6.0-RC1

  • 优化 ORACLE 下 EventPublish 和 Console-EventManager 的查询性能.

2.6.0-RC2

  • 丰富事件发送端日志
  • 聚合根支持扫描对象关系内的 CommandHandler、EventHandler 方法

2.6.0-RC3

2.6.0-RC4

特性

  • Client 丰富同步 API
    • 同步阻塞获取: RpcResult<T> sendSync(Object msg, String targetTopic, String requestId) throws ExecutionException, InterruptedException
    • 同步阻塞超时获取: RpcResult<T> sendSync(Object msg, String targetTopic, String requestId, Duration timeout) throws ExecutionException, InterruptedException, TimeoutException
  • 片段代码特性: 文档链接
  • Console 性能优化:此特性影响内部 Protobuf 和 EventStore,无法滚动升级.
    • EventManager: 懒加载列表查询
    • EventManager: 支持聚合根 ID 的精确查询
    • StatusManager: 优化聚合根状态查询速度(聚合根存活下,支持内存查询而非溯源)
    • Overview: 优化订阅进度获取速度
  • 增量试算特性:增量试算文档介绍
  • 监控体系重构:监控体系介绍

修复

  • 修复事务聚合根超时错误
  • 修复关闭聚合根创建的场景下,可能会导致聚合根溯源失败(版本-1)的缺陷

2.6.0-RC5

特性

修复

  • Console 聚合根内存查询失败:监控指标 NPE 问题
  • Console 内存查询支持序列化 JSR310 对象
  • 修复 Console 订阅进度重复展示
  • PhoenixClient 泛性问题修复
  • 修复聚合根处理优先级失效问题:处理优先级文档
  • 修复 Spring 异常时 PhoenixServer 无法正常退出

优化

  • PhoenixClient RPC 成功增加日志输出
  • EventPublish 异常打印原始异常堆栈
  • EventPublish 发送成功增加日志输出
  • StreamKafka 增加并行度配置

2.6.0-RC6

修复

  • 修复 PhoenixClient 无法独立使用的缺陷

2.6.0-RC7

优化

  • Console 优化前端 JSON 展示组件速度, 优化订阅进度视图
  • EventPublish 支持配置 Kafka ACK 超时时间, 优化超时下容错

修复

2.6.0-RC8

特性

  • PhoenixClient 支持回显元数据(MsgID 等):文档说明
  • SourceCollect API 变动,支持异步获取,优化内存显示:文档说明
  • 聚合根异步持久化,降低线程开销,提升性能(~30%):文档说明
  • Console 支持按命令查询事件
  • 聚合根钝化控制开关:文档说明

优化

  • Console 展示大体积 JSON 速度优化(默认不展开多层级)
  • Console 快照获取性能优化
  • 增加 KafkaConsumer 回调异常导致消息丢失的容错及补充日志输出

修复

  • 回归修复 PhoenixClient & Console 相关缺陷,优化
  • 修复 JMX 监控下可靠性投递聚合根溯源失败

2.6.0-RC9

修复

  • 修复定时任务消息丢失
  • 修复可靠性投递序列化失败
  • 修复 Console 查询错误触发聚合根淘汰
  • 修复多 AZ 集群下,依赖注入 NPE
  • 修复 MetaDataQuery exist 不生效
  • 修复聚合根内使用 Timer 导致 Sender NPE

2.6.0-RC10

特性

优化

  • 增加 EventStore 序列化监控指标
  • 新增 EventPublish 时区错误判断
  • 优化订阅在集群里的不均匀分布(针对 Kafka Partition 定制化)
  • 优化 Timer 下定时任务日志输出
  • EventStore 支持配置插入 Buffer 大小
  • 支持自定义 Kafka 超时配置
  • 聚合根片段代码支持递归扫描注解: 文档链接
  • Phoenix MQ 配置支持强制指定 group
  • PhoenixClient 支持配置 RPC 超时时间
  • 事务聚合根支持攒批、性能优化
  • 优化事务聚合根内存开销
  • Console 不显示事务异常调用链路、事件详情
  • Eureka 集群默认使用 HOSTNAME 注册、支持强制指定
  • 优化可靠性投递重试算法为指数退避算法

修复

  • 修复 JMX 监控下, 部分 MBean 不规范异常
  • 修复定时任务下, 聚合根取消钝化失败
  • 修复 Console 订阅状态修改异常
  • 修复 MetaData 频繁注册导致的内存溢出, 优化 MetaData 性能
  • 修复 Console 在定义多个 EventStoreLabel 下, 查询数据缺失问题
  • 定时任务导致聚合根异常淘汰
  • 修复持久化线程因 OOM 退出后无法唤醒
  • 修复试算 Actor 生命钩子调用

不兼容变动

一. API 变动

1. PhoenixClient

public interface IPhoenixClient {
/**
* Client 端异步发送接口. 回复到指定 topic
*
* @param msg rpc调用消息
* @param targetTopic 接收命令的服务 Topic
* @param sourceTopic 接收回复的响应服务 Topic
* @param requestId 请求ID
*/
MessageMetaData sendNoReply(
Object msg, String targetTopic, String sourceTopic, String requestId);

/**
* Client 端异步发送接口. 不需要回复
*
* @param msg rpc调用消息
* @param targetTopic 目的地 Topic
* @param requestId 请求ID
*/
MessageMetaData sendNoReply(Object msg, String targetTopic, String requestId);
}

2. SourceCollect

public interface SourceCollect {

/**
* 转换消息,实现中可以自定义反序列化,广播等各种操作
*
* <p>{@link CollectResult}是为了用户可以自定义一些消息处理路径.
*
* @param records 源数据
* @param collectMetaDataQuery 转换注册源数据查询接口
* @return 消息实体列表
*/
List<CollectResult> collect(Records records, CollectMetaDataQuery collectMetaDataQuery);

/**
* 是否支持批量转换消息.
*
* @return
*/
default boolean supportBatchCollect() {
return false;
}

/**
* 批量转换消息. 使用批量消息转换时, 必须严格按照源数据集合的顺序处理.
*
* @param recordsList 源数据集合
* @param collectMetaDataQuery 转换注册源数据查询接口
* @return 消息实体列表
*/
default List<CollectResult> batchCollect(
List<Records> recordsList, CollectMetaDataQuery collectMetaDataQuery) {
return Collections.emptyList();
}
}

二. 数据库表结构变动

create table if not exists event_store
(
aggregate_root_type varchar(255) not null,
aggregate_id varchar(255) not null,
version bigint(19) not null,
idempotent_id varchar(128) not null,
event_content longblob null,
command_class_name varchar(256) default '' null,
create_time timestamp(3) default CURRENT_TIMESTAMP(3) null,
primary key (aggregate_id, version),
constraint event_store_cmd_id_idx
unique (idempotent_id)
);

create index idx_create_time
on event_store (create_time);

三. 监控方式变动

在 2.6.0 版本抽象 Phoenix APM 埋点模块后,用户需要选择并主动引入埋点模块的依赖:

  • phoenix-telemetry-jmx:基于 JMX 的代码埋点(如同2.5.X 及之前)
  • phoenix-telemetry-otel:基于 OpenTelemetry 的代码埋点,导出指标的方式不同,请参考监控文档:配置指标导出器

四. Scala 版本升级

在 2.6.0 版本中, Phoenix 升级了部分依赖的同时升级了 Scala 版本(2.13.11), 并支持发布多 Scala 版本发布, 用户可通过引入依赖中附加后缀的方式选择 scala 版本,目前依赖 scala 并支持 2.12 版本的模块如下:(使用 2.13 版本则无需显式指定 scala 后缀)

其余未指定模块无需指定 scala 版本.

[INFO] phoenix-client-starter_2.12                                        [jar]
[INFO] phoenix-cluster-core_2.12 [jar]
[INFO] phoenix-cluster-nacos_2.12 [jar]
[INFO] phoenix-cluster-consul_2.12 [jar]
[INFO] phoenix-cluster-eureka_2.12 [jar]
[INFO] phoenix-console_2.12 [jar]
[INFO] phoenix-dgc_2.12 [jar]
[INFO] phoenix-distributed-data_2.12 [jar]
[INFO] phoenix-distributed-data-starter_2.12 [jar]
[INFO] phoenix-event-publish_2.12 [jar]
[INFO] phoenix-event-publish-starter_2.12 [jar]
[INFO] phoenix-eventstore-jdbc_2.12 [jar]
[INFO] phoenix-kafka-extend-starter_2.12 [jar]
[INFO] phoenix-server_2.12 [jar]
[INFO] phoenix-server-starter_2.12 [jar]
[INFO] phoenix-starter-autoconfigure_2.12 [jar]
[INFO] phoenix-stream-kafka_2.12 [jar]
[INFO] phoenix-stream-kafka-starter_2.12 [jar]
[INFO] phoenix-telemetry-jmx_2.12 [jar]
[INFO] phoenix-telemetry-otel_2.12 [jar]
[INFO] phoenix-transaction_2.12 [jar]

为了避免同时引入两个相同依赖的不同版本的 NoClassFoundError(Scala 二进制敏感) 问题, 可在父工程下引入下面的插件来帮助检查 Scala 版本冲突

通过命令:mvn clean compile validate 执行校验

<build>
<plugins>
<!-- make sure we don't have any _2.10 or _2.11 dependencies when building
for Scala 2.13 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<executions>
<execution>
<id>enforce-versions</id>
<phase>validate</phase>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<excludes combine.children="append">
<exclude>*:*_2.11</exclude>
<exclude>*:*_2.10</exclude>
<exclude>*:*_2.12</exclude>
</excludes>
<message>Scala 2.10/2.11/2.12 dependencies are not allowed for Scala 2.13
builds.
This can be caused by hard-coded scala versions, where the
'scala.binary.version' property should be used instead.
</message>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>