游戲服務端大訪問量大并發的優化解決方案?
1.所有的對象都放在內存,20萬用戶以下無壓力。
2.如果游戲的用戶很多,例如超過50萬,內存就會不夠,可使用LRU算法來淘汰一些數據。
流程:收到用戶請求-在內存查找用戶對象-如果不存在就從數據庫中加載-放入內存cache-如果cache中的用戶超過20萬-用LRU算法淘汰最古老的用戶數據。
3.避免同步的IO操作,所有會發生寫數據庫的操作:例如角色獲得了經驗,要更新數據庫;這類和游戲邏輯相關、安全性要求不高的保存操作,一律用異步操作,由后臺的數據庫保存線程定期保存。
流程:如果要保存到數據庫-檢查該對象是否已有標志為在保存隊列中-如果為假-將對象放入保存隊列。后臺保存線程的流程:從隊列中獲取要保存的對象-保存-置保存標志位為假。
內存cache+異步保存模式,并發每秒1000+不會有任何壓力,而且正常情況下每個請求的處理時間不會超過50毫秒。
郵件操作一定產生大量IO操作,而且都是同步操作,可用上面的cache機制處理,或者專門的郵件服務器。
如果是DNF之類的格斗類游戲,因為對系統響應的時間要求特別高,50毫秒都嫌慢,這種情況下,瓶頸是在網絡上,可用UDP包來解決。搜索UDP,有大量文檔。
如果用戶數是海量的,例如超過500萬,或者對并發的要求更高,例如每秒5000+次請求,這種指標明顯超過了單機的處理能力,這個時候就必須采用分布式結構,使用多臺服務器。可參照EJB二次遠程調用的原理實現多機分布式結構,搜索EJB,也有大量文檔。
沒事不要用c或者c++寫游戲服務器端,c#和java這類歷史悠久、有大量工具包、程序員一抓一大把的語言最好。性能不是問題,少BUG、穩定、開發周期短才是最重要的。