Phoenix介绍
Phoenix是宽拓自主研发的一款消息驱动型的高性能Java开发框架,专注于降低金融行业中业务复杂性高、性能要求高的应用系统的开发难度,助力研发团队打造专业、高效的微服务化的金融应用系统。
整体介绍
Phoenix是一套响应式微服务开发框架,致力于打造有状态服务。
在应用系统架构方面,提供了包括客户端开发、服务端开发、消息通讯架构、服务端状态数据存储和恢复、计算层和消息层监控、服务端运维等架构方案。而在业务开发方面,Phoenix提供了一套领域驱动设计模式(DDD)的实现模型,业务开发中的领域模型定义以聚合根(Aggregate Root)的形式作为业务计算的基本单元,在整个业务计算的流程中,聚合根对象之间仅以消息(Message)作为数据交互接口。框架对聚合根对象的状态管理和多层次交互的实现进行了封装。
Phoenix可以支持用无状态的方式来开发高价值的有状态场景。
框架对比
以Spring Cloud为例,对比与Phoenix功能实现上的不同。
功能点 | Phoenix | Spring Cloud |
---|---|---|
服务发现 | 同集群内借助Akka通信,不同集群间借助MQ(Kafka)完成服务间通讯 | 注册中心(Eureka、Consul等) |
协议 | 基于消息通讯、依赖消息中间件 | HTTP协议 |
客户端 | PhoenixClient SDK | HttpClient、Feign等 |
调用方式 | 支持同步、异步调用 | 同步调用为主 |
服务状态管理 | 有状态 | 无状态 |
状态存储 | 状态存储在本地进程内、事件存储在数据库 | 主要存储在关系型数据库中 |
分布式事务 | 原生支持Saga、TCC模式 | 插件支持(如:Seata) |
负载均衡 | 框架依赖Kafka多partition实现 | 插件支持(如:Ribbon) |
限流 | 自适应背压 | 插件支持(如:hystrix) |
熔断 | 暂未支持 | 插件支持(如:hystrix) |
降级 | 暂未支持 | 插件支持(如:hystrix) |
特性介绍
基于Phoenix框架开发的业务应用系统不管在业务建模和系统架构上都有别于传统的应用服务系统,同时也跟其他微服务开发框架有所区别。Phoenix框架致力于为复杂业务场景、可靠性要求高、性能要求高和服务模块高度解耦的应用系统提供强大的开发和运维能力。所以,Phoenix框架提供了以下应用架构特性。
内存计算
在传统的业务系统中,企业应用系统一般选择使用数据库等存储来实现业务数据存储和管理。业务模型往往与数据模型有着紧密的耦合,如此一来,随着业务模型变得复杂,为了满足这些复杂的业务需求实现,对应的数据模型和算法也开始变得越来越复杂,复杂的数据模型和算法为应用系统带来严重的性能问题。尽管我们有许多手段优化这些数据模型和算法,但这对数据建模和算法实现等开发都是个巨大的挑战,同时大量的IO可能使得各种优化手段都无济于事。
如果业务数据的修改完全在内存中进行,得益于内存极高的速度,将复杂的数据模型和算法实现搬到内存中,业务计算的速度也能得到极大提升。此外,业务数据模型和算法面向内存构建,将复杂的数据模型和算法过程与数据库系统解耦开来,简化计算层和存储层的交互,也能减少IO次数,为整体性能带来提升。
但内存计算技术也带来的其他方面的问题。
- 第一是内存数据在进程结束后无法进行保存,框架需要提供额外的手段,保证服务在遇到故障时,内存中的业务数据能可靠地进行恢复。
- 第二是,相比将数据模型放到数据库等成熟的存储中,将数据完全运行内存中不能方便的提供数据查询能力。
所以,针对以上两个问题,Phoenix都提供了解决方案。
EventStore领域事件存储解决了内存数据的可靠恢复问题。聚合根对象在处理消息时产生领域事件,领域事件是聚合根对象状态变化的依据,聚合根对象在更新状态的同时会将领域事件(DomainEvent)保存到EventStore中。这样,如果聚合根对象所处的服务节点出现故障时,通过从EventStore中读取领域事件,便可以在节点重启后重新构建该聚合根对象的状态。若是该节点无法重新启动,则可以通过多活集群的能力,在剩余的其他节点中恢复聚合根状态,这种通过领域事件恢复状态的技术称为EventSourcing。
同时,存储在EventStore中的所有事件记录了聚合根内存数据的变化过程。我们可以通过这些事件来扩展服务(Q端)的数据查询能力。