斷線重連方案

2021-09-29 13:42:46 字數 1791 閱讀 2719

《天天炫鬥》弱網處理以及斷線重連方案

當前手遊現狀

弱網處理

登入流程

全區分服架構

《天天炫鬥》首先是乙個全區分服的架構, 前端邏輯層會有多個小區,每個小區會存在一組gameserver伺服器,每個gameserver伺服器自己會上報自己的負載情況到dir伺服器。

客戶端登入的時候,首先會登入到dir伺服器拉取所有的小區列表,當選擇某個小區登入的時候,又會拉取這個小區下的所有gameserver伺服器。根據這個小區gameserver的負載情況,來挑選一台gameserver登入。

登入流程

斷線重連

首先客戶端會記錄上次登入的gameserver的ip和埠,斷線重連後,是直連到gameserver的。如果gameserver還能夠找到它的player物件是可以重連成功的。伺服器這邊每個客戶端會為它保留player物件10分鐘,在10分鐘中之內重連的都是可以成功的。

斷線重連

斷線重連有乙個關鍵的地方是會做快取處理,客戶端重連會上報一次下行包包序,伺服器根據這個下行包包序來判斷是否給它下發在斷線期間有哪些包重複下發下去,能夠保證它的流程得以繼續。

斷線重連

測試案例:客戶端如果在進入副本之後,比如這個時候要進入電梯,客戶端介面上會顯示轉圈,實際上它是在嘗試重連,等到除了電梯的時候能夠重連成功,那麼在這個副本中流程也就可以繼續了。這主要得益於在斷線期間,能夠保證所有的下行包在重連之後一次下發。

快取機制

下行包快取處理

儲存結構設計,儲存結構每個節點都有三個元素:下行包包序即序號(seq)、下行包大小(size)、下行包pack之後的二進位制 (msgbuf),依次存入到記憶體中,向這個儲存結構儲存訊息,只需要移動end buf這個游標。如果記憶體不夠的情況,**則移動begin buf游標。

首先要判斷下行包是否在黑名單中,比如一些伺服器會踢掉客戶端下線的下行包是不應該快取的,然後要判斷快取是否足夠,如果足夠的話就依次將三個元素存入快取中。記憶體不足的情況下就需要去移動起始游標來**記憶體。

下行包快取流程

關鍵點斷線重連流程:

首先從快取中取出最舊下行包包序,與客戶端重連上報的下行包包序進行比較。過濾較早的包序,然後在斷線期間沒有下發的下行包可以一次下發。如果客戶端上報的下行包包序比較舊則會導致重連失敗。客戶端斷線期間時間比較長的話會導致快取中的包過多,也有可能導致客戶端重連失敗,比如前面的包已經被**掉了的話,客戶端這個時候重連就有可能失敗。

斷線重連流程

關鍵點斷線重連統計

天天炫鬥線上重連統計情況,抽取線上一台gameserver的統計結果。

斷線重連統計

websocket 斷線重連

摘要websocket reconnect websocket是html5發布之後出現的一種新技術,說它是新技術,其實也不是多新的技術了,因為畢竟也有2 3年了,但是找了很多國內的例項,缺發現不多,不知道是它不好用呢,還是說這種技術原來就有缺陷呢,咱們暫且不說,今天我們就來介紹一下websocket...

斷線重連機制

zookeeper的客戶端具有自動重連機制,當出現網路異常時,客戶端會自動重連直到與集群中的某台機器連線成功,連線過程如下圖所示 1.網路異常情況包括網路閃斷 zk伺服器宕機等情況,這會導致連線斷開connection loss,此時客戶端會收到事件none disconnected 2.如果在se...

TCP斷線重連

struct sockaddr in tempsadd tempsadd.sin family af inet tempsadd.sin port htons m serverport tempsadd.sin addr.s addr inet addr m serverip.c str if 1 ...