简单谈谈服务间的连接

2,723 阅读2分钟

最近又把RPC框架的底层协议翻出来回顾了一遍,梳理一下有什么可以学习和借鉴的地方,重点看了一下RPC连接的实现方案。看了之后,觉得可以谈谈服务间连接的方式及区别,所以按照自己的理解写了一下。


(图片来源于cs.rutgers.edu/)


连接的方式


(1)短连接,对于每一次请求,都需要单独建立一个tcp连接,请求完成之后关闭连接,每一个请求都需要独占一个tcp连接。

通常的短连接操作步骤是: 连接→数据传输→关闭连接;


(图片来源于教材截图)

(2)短连接线程池,对建立的tcp连接不是简单的释放掉,而是缓存起来,每一次rpc请求都需要占用该连接。
(3)长连接,只建立一个连接,所有请求都共享这个连接,通过一些请求id来标示返回的数据应该属于哪一个请求。

长连接的操作步骤就是:
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;


简单来说,短链接一般都是基于HTTP的,会遵循三次握手原则,web站点对外服务都是使用的短连接。

长连接主要基于Socket,长连接的框架有最出名的Netty了,Dubbo框架也是基于Netty而来。长连接框架优势在于效率高(大量建立连接的开销真心很高),适用于内部业务系统间的调用。


连接的发送/接收方式

1、异步, 报文发送和接收是分开的,相互独立的,互不影响。
2、同步, 报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式需要考虑超时问题。


长连接的管理


  • 建立一个连接管理器,每一次在发起请求的时候,都需要在连接器中申请一个连接,连接管理器负责连接状态监测;

  • 每次在获取连接的时候,做一次连接状态的监测,确保连接的状态确实是正常的;

  • 根据请求的一些状态,主动的处理连接,例如出现了一些意料之外的异常,那么为了安全,需要将当前线程主动关闭掉。通过上下文管理Context Manager捕获外部代码的一些异常,从而在一些特殊情况下主动关闭连接;

  • 客户端连接请求的timeout时间一定需要要设置,服务端需要监控线程运行状态,防止永久性的阻塞造成内存泄露,设定超时阈值,在需要的时候直接终止正在执行请求。


扫描二维码或手动搜索微信公众号【架构栈】: ForestNotes

欢迎转载,带上以下二维码即可