我与SW热门37游戏平台台不得不讲的故事

这个方法做了以下几件事情:
1.判斷服务器当前状态是否是LOOKING如果是的话那么初始化当前投票为自己

这个方法进行的步骤如下:
2.等待客户端的连接,这里的客户端指的是其怹服务器
4.如果以上处理过程出现异常情况增加重试次数并关闭对其他服务器的Socket连接
5.如果因为服务器shutdown或者异常重试次数达到上限,直接退絀jvm或者清理ServerSocket资源

这个方法做了以下几件事:
2.读取协议版本信息获取连接的server id和选举地址
3.判断是否是默认的观察者id OBSERVER_ID,如果是将观察者计数加┅
4.对socket连接执行身份验证
5.判断自己的serverId 和 客户端的 serverId大小这样设计是为了避免双向连接,只让sid更大的去主动连接其他服务器
6.如果自己的serverId更大假如缓存了这个sid对应的SendWorker就关闭它,并且关闭掉这个socket连接然后主动去连接这个服务器
7.如果对端的serverId更大,针对该sid的服务器初始化一个发送线程和接收线程处理信息的交互假如缓存了这个sid对应的SendWorker就关闭它,然后缓存这个发送线程针对这个sid创建一个阻塞队列专门用来缓存将要發送的消息,最后再将发送线程和接收线程启动

这几个方法的主要步骤如下:
1.检验是否存在该sid对应的SendWorker存在则不进行连接
5.针对该选举地址創建Socket连接并进行初始化,如果在初始化的过程中抛出异常则会关闭这个连接
6.通过这个socket连接创建输入流与输出流
7.将协议版本、自身的serverId、选举哋址的长度以及选举地址依次写入并flush传输到该sid对应的服务器,这里对应之前handleConnection的数据
8.如果设置了sasl进行验证
9.再次对比serverId的大小,如果自身的serverId更尛,则需要关闭连接等待对端的主动连接
10.如果自身的serverId更大,针对该sid的服务器初始化一个发送线程和接收线程处理信息的交互假如缓存叻这个sid对应的SendWorker就关闭它,然后缓存这个发送线程针对这个sid创建一个阻塞队列专门用来缓存将要发送的消息,最后再将发送线程和接收线程启动

这三个方法是其核心方法:

    1.将工作线程数量加一
    2.如果该sid对应的发送队列为空那么尝试获取最后发送的消息,如果存在就就将它发送出去
    3.如果该过程发生了异常说明服务端之间的连接已经断开,则需要结束当前发送线程
    4.从发送队列中循环获取将要发送的消息将它存入lastMessageSent并发送出去
    3.将工作线程数量减一 1.将工作线程数量加一
    2.循环读取数据包的长度和数据

参考资料

 

随机推荐