1. 基于Dubbo分布式高并发场景下的运用要点
1.1 异步处理机制
- 为什么要采用异步?
如果采用同步调用, CPU 大部分的时间都在等待而没有去计算,从而导致 CPU 的利用率不够。
RPC 请求比较耗时的原因主要是在哪里?
在大多数情况下,RPC 本身处理请求的效率是在毫秒级的。RPC 请求的耗时大部分都是业务耗时。
- 调用端如何实现异步?
常用的方式就是 Future 方式,它是返回 Future 对象,通过 GET 方式获取结果;或者采用入参为 Callback 对象的回调方式,处理结果。
基于 RPC 的 Dubbo 框架是如何实现异步调用呢?
- 服务端如何实现异步?
为了提升性能,连接请求与业务处理不会放在一个线程处理, 这个就是服务端的异步化。服务端业务处理逻辑加入异步处理机制。
在 RPC 框架提供一种回调方式,让业务逻辑可以异步处理,处理完之后调用 RPC 框架的回调接口。
RPC 框架的异步策略主要是调用端异步与服务端异步。调用端的异步就是通过 Future 方式。
服务端异步则需要一种回调方式,让业务逻辑可以异步处理。这样就实现了 RPC 调用的全异步化。
1.2 路由与负载均衡
- 为什么要采用路由?
真实的环境中一般是以集群的方式提供服务,对于服务调用方来说,一个接口会有多个服务提供方同时提供服务,所以 RPC 在每次发起请求的时候,都需要从多个服务节点里面选取一个用于处理请求的服务节点。
这就需要在 RPC 应用中增加路由功能。 - 如何实现路由?
服务注册发现方式:
通过服务发现的方式从逻辑上看是可行,但注册中心是用来保证数据的一致性。通过服务发现方式来实现请求隔离并不理想。
RPC 路由策略:
从服务提供方节点集合里面选择一个合适的节点(负载均衡),把符合我们要求的节点筛选出来。这个就是路由策略:
接收请求-->请求校验-->路由策略-->负载均衡-->
使用了 IP 路由策略后,整个集群的调用拓扑如下图所示:
有些场景下,可能还需要更细粒度的路由方式,比如说根据 SESSIONID 要落到相同的服务节点上以保持会话的有效性;
可以考虑采用参数化路由:
- RPC 框架中的负载均衡
RPC 的负载均衡是由 RPC 框架自身提供实现,自主选择一个最佳的服务节点,发起 RPC 调用请求。