私有通信协议设计:
我们的分布式架构,所需要的内部通信模块,采用了私有协议来设计和研发。
-
可以有效地利用协议里的各个字段
-
灵活满足各种通信功能需求:比如 CRC 校验,Server Fail-Fast 机制,自定义序列化器
-
最大程度满足性能需求:IO 模型与线程模型的灵活运用。
基础通信功能设计:
选择一些基础网络编程框架。
Netty===》把无锁化的设计理念放在第一位,然后针对内存分配,高效的 Queue 队列,高吞吐的超时机制等。
连接管理:
提高通信效率,需要考虑复用连接,减少 TCP 三次握手的次数,因此需要有连接管理的机制
========》通信,同步异步《======
SOFARPC 以基于 Netty 实现的网络通信框架 SOFABolt 用作远程通信框架,使用者不用关心如何实现私有协议的细节,直接使用内置 RPC 通信协议,启动客户端与服务端,同时注册用户请求处理器即可完成远程调用。
四种调用类型:
SOFARPC 服务调用提供同步 Sync、异步 Future、回调 Callback 以及单向 Oneway 。
Sync 同步调用
同步调用是指的客户端发起调用后,当前线程会被阻塞,直到等待服务端返回结果或者出现了超时异常,再进行后续的操作,是绝大多数 RPC 的默认调用方式,无需进行任何设置即可。
Future 异步调用
客户端发起调用后不会同步等待服务端的结果,而是获取到 RPC 框架给到的一个 Future 对象,调用过程不会阻塞线程,然后继续执行后面的业务逻辑。服务端返回响应结果被 RPC 缓存,当客户端需要响应结果的时候需要主动获取结果,获取结果的过程阻塞线程。
Callback 回调调用
客户端提前设置回调实现类,在发起调用后不会等待结果,但是注意此时是通过上下文或者其他方式向 RPC 框架注册了一个 Callback 对象,结果处理是在新的线程里执行。RPC在获取到服务端的结果后会自动执行该回调实现。
客户端代码段 2 发起 RPC 调用后,并不关心结果,此时也不会有结果。只是将自己的一个 Callback 对象传递给 RPC 框架,RPC 框架发起调用后,立即返回。之后自己等待调用结果,在有了调用结果,或者超过业务配置的超时时间后,将响应结果或者超时的异常,进行 callback 的回调。
Oneway 单向调用
客户端发送请求后不会等待服务端返回的结果,并且会忽略服务端的处理结果。
当前线程发起调用后,用户并不关心调用结果,只要请求已经发出就完成本次调用。单向调用不关心响应结果,请求线程不会被阻塞,使用 Oneway 调用需要注意控制调用节奏防止压垮接收方。注意 Oneway 调用不保证成功,而且发起方无法知道调用结果。
=====================================================================================================