遊戲上線問題總結

1,Log問題(喫過虧纔會重視)
遊戲上線後,隨着玩家數據量的劇增,許多bug就會隨之出現,但同時有些bug是很難復現的,這時候定位問題就不可能通過打斷點來進行查找,這時候完整的log信息纔是定位問題的關鍵。
log等級:
Trace:突出強調程序運行過程
Debug:調試信息
Info:突出一些關鍵信息打印
Warn:出現一些按理不該出現的問題
Fatal:嚴重問題,影響程序運行

2,recover使用(循環時處理/加鎖時處理)
循環時處理:當在一個循環中出現panic時,需要在循環內部進行recover,以保證重新接管該線程時邏輯繼續,而不至於線程銷燬,邏輯不再執行。如下:

go Start()
//錯誤代碼,如果Start函數上層沒有for循環,當發生錯誤時,recover接管線程後再也進不了這個邏輯中,從而出現問題
func (this *TMail) Start () error {
	defer func() {
		if err := recover(); err != nil {
			logger.Fatal("error is %v", err)
		}
	}
	for {
		select {
			case A:
				//dosomething
			case B:
				//dosomething
			default:
				//dosomething
		}
	}
	return nil
}

//正確代碼
func (this *TMail) Start () error {
	for {
			_start()
		}
	return nil
}

func (this *TMail) _start() error {
	defer func() {
		if err := recover(); err != nil {
			logger.Fatal("error is %v", err)
		}
	}()
	
	select {
			case A:
				//dosomething
			case B:
				//dosomething
			default:
				//dosomething
		}
		return nil
}

加鎖時處理:加鎖後,出現panic,導致未解鎖,出現問題。如下

在這裏插入代碼片

3,線程panic崩潰,使得channel讀端出錯,導致channel寫端阻塞,主線程阻塞。
解決方案:給channel加個大的buffer(1000左右),當buffer寫滿時(不一定是bug引起(網絡),但需要打log進行報警,因爲很大可能是讀端出錯)。所以這裏需要注意:在有channel操作時,需要加default打對應Log.如下:

func SendMail(mail *TMail) {
	select {
		case: MyChannel <- mail:
			
		default:
			Loggler.Warning("channel is full!!!")
	}
}

4,某一時刻,系統向每一位在線玩家郵件發獎,峯值太大。
解決方案:系統向每一位玩家廣播紅點,玩家看到紅點後點擊查看領取時再對其進行發獎,這樣的操作由“網絡延遲”和“玩家自身操作”來分散峯值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章