1 设计要点解析
1.1 通信模型
SOFA Bolt当前支持四种通信模型:
● oneway:单向调用。单向调用不会阻塞请求线程,不关心响应。但是,使用时需要注意控制调用频率和节奏,防止压垮接收方;
● sync:同步调用。同步调用会阻塞请求线程,待响应返回后才能进行下一个请求。这是最常用的一种通信模型;
● future:future调用。Future调用在调用过程中不会阻塞线程,但在获取结果的过程中会阻塞线程;
● callback:回调。回调是真正的异步调用,永远不会阻塞线程,在异步线程里处理响应结果。
在SOFA Bolt中,实现上述四种通信模型的相关类的类图如下:
BaseRemoting基于Netty实现了上述四种通信模型,其源码如下:
1. public abstract class BaseRemoting {
2. ……略
3.
4. /**
5. * Synchronous invocation
6. ……略
7. */
8. protected RemotingCommand invokeSync(final Connection conn, finalRemotingCommand request, final int timeoutMillis) throwsRemotingException, InterruptedException {
9. ……略
10. }
11.
12. /**
13. * Invocation with callback.
14. ……略
15. */
16. protected void invokeWithCallback(final Connection conn, finalRemotingCommand request, final InvokeCallback invokeCallback, final inttimeoutMillis) {
17. ……略
18. }
19.
20. /**
21. * Invocation with futurereturned.
22. ……略
23. */
24. protected InvokeFuture invokeWithFuture(final Connection conn, finalRemotingCommand request, final inttimeoutMillis) {
25. ……略
26.
27. };
28.
29. /**
30. * Oneway invocation.
31. ……略
32. */
33. protected void oneway(final Connection conn, finalRemotingCommand request) {
34. ……略
35. };
36.……略
37.}
通过源码可以看出,有两个类在实现上述四种通信模型中发挥了非常重要的作用:
1. InvokeFuture接口
一提到Future,大家一定会想到java.util.concurrent.Future。
Future为我们提供了一个异步编程的方式。Future表现为一个异步计算的结果,可以通过Future查看计算是否完成、等待计算完成、获取计算结果。
InvokeFuture虽然未实现Future接口,但遵循了Future的设计原理,基于网络通信的特征,为网络通信框架定义了一套同Future接口一样的功能。