Dubbo学习笔记(四)------策略

来源:互联网 发布:淘宝帮忙跑腿 编辑:程序博客网 时间:2024/06/06 07:12

协议

远程调用层的协议,封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

协议名 功能 备注 Dubbo协议 采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) 在大文件传输时,单一连接会成为瓶颈。假设网络为千兆网卡(1024Mbit=128MByte),根据测试经验数据每条连接最多只能压满7MByte(不同的环境可能不一样,供参考),理论上1个服务提供者需要20个服务消费者才能压满网卡。如果每次请求的数据包大小为500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大7MByte(不同的环境可能不一样,供参考),单个服务提供者的TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。单个消费者调用单个服务提供者的TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14 Rmi协议 可与原生RMI互操作,基于TCP协议 偶尔会连接失败,需重建Stub Hessian协议 可与原生Hessian互操作,基于HTTP协议 需hessian.jar支持,http短连接的开销大

传输

网络传输层,抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。

协议名 功能 备注 Netty Transporter JBoss的NIO框架,性能较好(推荐使用) 一次请求派发两种事件,需屏蔽无用事件 Mina Transporter 老牌NIO框架,稳定 待发送消息队列派发不及时,大压力下,会出现FullGC

序列化

数据序列化层,可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool

协议名 功能 备注 Hessian Serialization 性能较好,多语言支持(推荐使用) Hessian的各版本兼容性不好,可能和应用使用的Hessian冲突,Dubbo内嵌了hessian3.2.1的源码 Dubbo Serialization 通过不传送POJO的类元信息,在大量POJO传输时,性能较好 当参数对象增加字段时,需外部文件声明 Json Serialization 纯文本,可跨语言解析,缺省采用FastJson解析 较差 Java Serialization Java原生支持 性能较差

注册中心

协议名 功能 备注 Zookeeper注册中心 支持基于网络的集群方式,有广泛周边开源产品,建议使用dubbo-2.3.3以上版本(推荐使用) 依赖于Zookeeper的稳定性 Redis注册中心 支持基于客户端双写的集群方式,性能高 要求服务器时间同步,用于检查心跳过期脏数据 Multicast注册中心 去中心化,不需要安装注册中心 依赖于网络拓普和路由,跨机房有风险 Simple注册中心 Dogfooding,注册中心本身也是一个标准的RPC服务 没有集群支持,可能单点故障

代理

服务代理层,服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory

协议名 功能 备注 Javassist ProxyFactory 通过字节码生成代替反射,性能比较好(推荐使用) 依赖于javassist.jar包,占用JVM的Perm内存,Perm可能要设大一些:java -XX:PermSize=128m Jdk ProxyFactory JDK原生支持 性能较差

负载均衡

协议名 功能 备注 Random LoadBalance 随机,按权重设置随机概率(推荐使用) 在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均 RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率 存在慢的机器累积请求问题,极端情况可能产生雪崩 LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求 不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量 ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 压力分摊不均

集群容错模式

协议名 功能 备注 Failover Cluster 失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使用) 重试会带来更长延迟 Failfast Cluster 快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作 如果有机器正在重启,可能会出现调用失败 Failsafe Cluster 失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作 调用信息丢失 Failback Cluster 失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作 不可靠,重启丢失 Forking Cluster 并行调用多个服务器,只要一个成功即返回,通常用于实时性要求较高的读操作 需要浪费更多服务资源 Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于更新提供方本地状态 速度慢,任意一台报错则报错

路由规则

协议名 功能 备注 条件路由规则 基于条件表达式的路由规则,功能简单易用 有些复杂多分支条件情况,规则很难描述 脚本路由规则 基于脚本引擎的路由规则,功能强大 没有运行沙箱,脚本能力过于强大,可能成为后门

服务容器

协议名 功能 备注 Spring Container 自动加载META-INF/spring目录下的所有Spring配置 Jetty Container 启动一个内嵌Jetty,用于汇报状态 大量访问页面时,会影响服务器的线程和内存 Log4j Container 自动配置log4j的配置,在多进程启动时,自动给日志文件按进程分目录 用户不能控制log4j的配置,不灵活
0 0