Skip to content
adamni135 edited this page Nov 5, 2019 · 17 revisions

Welcome to the adam_asyn wiki! adam_asyn是个可以支持全异步流程处理的框架,参考RXjava模式,支持多种分布式事务,让你的项目能够高并发且支持事务的运转起来,目前只是支持java版本且基于spring-4.2.0.RELEASE以上版本

测试用例spring-boot搭建的地址:https://github.com/vipadsteam/adam_mvc_test_demo

A>分布式事务使用基于Base理论,支持TCC、saga、Best Efforts 2PC,seata模式,可以使用doService、doSuccess、doFail、doComplete实现大并发场景下事务处理

B>基于专家领域模型思想(DDD\CQRS)及RXjava思想的一种实现

C>日志打印收集基于ThreadLocal能在大并发场景下支持精准打印,分场景打印,有效解决大并发场景下日志的生成问题

D>各种小工具,如快速UUID生成,URLEncode等

E>可以嫁接在Spring MVC、 Dubbox、或者任何RPC框架上,很好地与C层剥离,无耦合

F>支持服务端全异步,解耦请求与处理线程的关系

G>支持背压模式

简介: adam_asyn是由最基础的tasker组成,每注册到服务链实现接口IService的称为一个服务,服务里任何一个doService、doSuccess、doFail、doComplete的方法都是为一个tasker,因此每个服务也是由4个tasker组成,服务之间是根据@ServiceType的相同值串联起来称为一个服务链,服务链内的执行顺序则由@ServiceOrder来决定,而如果tasker运行中如果抛出Exception,@ServiceErrorCode则是约束错误code,该服务处产生的错误code(被写入resultVo)的code必须是ServiceErrorCode上注册的数值最为前缀。

adam_asyn是adam的全异步版本,请求与线程进行剥离,没有了主线程的概念。如果一个请求响应速度为1s的情况下理论上有依赖主线程来进行请求处理的在24core的主机上(大概是1000个线程)最大响应tps为1000,但是剥离了主线程概念后可以达到2000甚至10000以上。

在全异步模式下面,由于下游的性能下滑导致和上游速度产生差距,因此必须要开启背压才能解决,如图:

简化后:

整体系统为一个恒定的TPS,为了避免出现线程饥饿(B模块抢夺了所有CPU资源导致A无法正常工作)每组业务会有自己特定的线程池来完成工作, 正如图上的履带一样,每个处理环节的线程池所处理的吞吐量是一致的。如果一个轮快一个轮慢如A轮快 B轮慢,则会在A与B间的上方履带出现堆积。系统也一样,如果A线程池处理速度快B线程池慢则会出现A与B间出现请求堆积。因此必须有一种机制来解决这样的问题,比如读业务时候如果C轮发现自己已经到达最大工作能力时会触发信号传递给B,B轮降低一定的流量给C剩余的流量可以使用缓存来支撑。又如写业务时候如果B轮发现已经到达自己最大工作能力时会触发信号给A,A轮降低一定的流量给B剩余流量可以暂时存放在队列里面,或者由一个辅助轮(新线程池)帮助B轮加速处理流量。

标准流程:

遇到错误流程:

目前服务链支持几种模式:

1:简单的链式服务(/adam/request1?param=123)

2:嵌套的链式服务(/adam/request2?param=123)

3:串联的链式服务(/adam/request5?param=123)

全异步的线程模型:

Clone this wiki locally