-
Notifications
You must be signed in to change notification settings - Fork 4
Home
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)
全异步的线程模型: