一、为什么会有会话机制Session
首先我们看下ZooKeeper的架构图,client跟ZooKeeper集群中的某一台server保持连接,发送读/写请求,读请求直接由当前连接的server处理,写请求由于是事务请求,由当前server转发给leader进行处理。同时,client还能接收来自server端的watcher通知。
而所有的这些交互,都是基于client和ZooKeeper的server之间的TCP长连接,也称之为Session会话。ZooKeeper对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的Watch事件通知。Session的SessionTimeout值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在SessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
说点题外话,长连接、短连接、数据库连接池:
短连接 :连接->传输数据->关闭连接
也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接:连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
网络中不同节点使用TCP协议通过SOCKET进行通信,首先需要3次握手建立连接,数据传输,4次握手断开连接,因此如果频繁的创建、关闭,是很耗费系统资源的,就像短连接那样;使用长连接貌似弥补了短连接的缺点,但是,如果并发量过大,会有大量的长连接,同样会耗费大量系统资源,因此具体选用长连接还是短连接,是要根据具体的场景来选择。
ZooKeeper中一个client只会跟一个server进行交互(除非与当前server连接失败,会切换到下个server),不管这种交互有多频繁,只需要一个TCP长连接就足以应对,因选择一个TCP长连接,不失为一种最好的方案。
数据库连接池:我们在使用JDBC进行数据库连接的时候,其实是建立了一个数据库连接池,它本身是一种短连接+长连接的方案,我们通过JDBC的3个关键配