王尘宇王尘宇

研究百度干SEO做推广变成一个被互联网搞的人

怎样去写一个高性能的支付宝服务框架?

怎样去写一个高性能的支付宝服务框架?


一  什么是 Netty? 能做什么?


Netty 是一个致力于创建高性能网络应用程序的成熟的 IO 框架。


相比较与支付宝推广直接使用底层的 Java IO API,你不需要先成为网络专家就可以基于 Netty 去构建复杂的网络应用。


业界常见的涉及到网络通信的相关中间件大部分基于 Netty 实现网络层。


二  设计一个分布式服务框架


1  Architecture



2  远程调用的流程


1.启动服务端(服务提供者)并发布服务到注册中心。


2.启动客户端(服务消费者)并去注册中心订阅感兴趣的服务。


3.客户端收到注册中心推送的服务地址列表。


4.调用者发起调用,Proxy从服务地址列表中选择一个地址并将请求信息 <group,providerName,version>,methodName,args[] 等信息序列化为字节数组并通过网络发送到该地址上。


5.服务端收到收到并反序列化请求信息,根据 <group,providerName,version> 从本地服务字典里查找到对应providerObject,再根据 <methodName,args[]> 通过反射调用指定方法,并将方法返回值序列化为字节数组返回给客户端。


6.客户端收到响应信息再反序列化为 Java 对象后由 Proxy 返回给方法调用者。


以上流程对方法调用者是透明的,一切看起来就像本地调用一样。


3  远程调用客户端图解



重要概念:RPC三元组 <ID,Request,Response>。


PS: 若是 netty4.x 的线程模型,IO Thread(worker) —> Map<InvokeId,Future> 代替全局 Map 能更好的避免线程竞争。


4  远程调用服务端图解



5  远程调用传输层图解



6  设计传输层协议栈


协议头




协议体


1)metadata: <group,providerName,version>


2)methodName


3)parameterTypes[] 真的需要吗?


(a)有什么问题?

1.反序列化时 ClassLoader.loadClass() 潜在锁竞争。

2.协议体码流大小。

3.泛化调用多了参数类型。


(b)能解决吗?

Java方法静态分派规则参考JLS <Java语言规范> $15.12.2.5 Choosing the Most Specific Method 章节。


(c)args[]


(d)其他:traceId,appName…


三  一些Features&好的实践&压榨性能


1  创建客户端代理对象


1)Proxy 做什么?


集群容错 —> 负载均衡 —> 网络


2)有哪些创建 Proxy 的方式?


jdk proxy/javassist/cglib/asm/bytebuddy


3)要注意的:


注意拦截toString,equals,hashCode等方法避免远程调用。


4)推荐的(bytebuddy):



2  优雅的同步/异步调用


先往上翻再看看“远程调用客户端图解”


再往下翻翻看看 Failover 如何处理更好


思考下如何拿到 future?


3  单播/组播


消息派发器


FutureGroup


4  泛化调用


Object $invoke(String methodName,Object... args)


parameterTypes[]


5  序列化/反序列化


协议 header 标记 serializer type,同时支持多种。


6  可扩展性


Java SPI:


java.util.ServiceLoader


META-INF/services/com.xxx.Xxx


7  服务级别线程池隔离


要挂你先挂,别拉着我。


8  责任链模式的拦截器


太多扩展需要从这里起步。


9  指标度量(Metrics)


10  链路追踪


OpenTracing


11  注册中心


12  流控(应用级别/服务级别)


要有能方便接入第三方流控中间件的扩展能力。


13  Provider线程池满了怎么办?



14  软负载均衡


1)加权随机 (二分法,不要遍历)



2)加权轮训(最大公约数)


3)最小负载

4)一致性 hash (有状态服务场景)

5)其他

注意:要有预热逻辑。


15  集群容错


1)Fail-fast


2)Failover


3)Fail-safe


4)Fail-back


5)Forking


6)其他

相关文章

评论列表

发表评论:
验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。