游戲制作-游戲服務(wù)端
服務(wù)端的一些設(shè)計(jì)-關(guān)于接口的數(shù)據(jù)處理。
游戲制作-golang-服務(wù)端設(shè)計(jì)
文件結(jié)構(gòu)
? ?-
? ?- lib //不同項(xiàng)目也可以用的包
? ? ? ?- contract //通用協(xié)議、接口
? ? ? ?- db //數(shù)據(jù)庫、倉儲(chǔ)、訪問
? ? ? ?- file_ex //文件的擴(kuò)展包
? ? ? ?- xx_ex //一些其他類的擴(kuò)展包
? ?- model // 項(xiàng)目中用到的模型
? ? ? ?- area_model //區(qū)服數(shù)據(jù)庫模型
? ? ? ?- global_model //一些全局的數(shù)據(jù)模型,比如早期存放一些 環(huán)境相關(guān)的主機(jī)信息
? ? ? ?- bg_model // 后臺(tái)數(shù)據(jù)模型,也可以考慮放到schame中,主要還是看不同環(huán)境的需求
? ? ? ?- config_model //配置數(shù)據(jù)庫的模型
? ? ? ?- account_model // 賬戶相關(guān)模型
? ? ? ?- config_enum // 游戲相關(guān)的枚舉
? ? ? ?- config_model //excel表格相關(guān)的模型
? ?- common //項(xiàng)目中的一些基礎(chǔ)包
? ? ? ?- 配置數(shù)據(jù)
? ? ? ?- 一些2次處理的數(shù)據(jù)
? ?- module //業(yè)務(wù)模塊、比如英雄模塊的數(shù)據(jù)訪問、 戰(zhàn)斗模塊的數(shù)據(jù)訪問
? ?- ops //自動(dòng)化相關(guān) ?比如升級(jí)項(xiàng)目(更新配置、協(xié)議等)
? ?- ops_test //一些測(cè)試用例
? ?- proto // 協(xié)議
? ?- service // 服務(wù)接口
? ?-
model
model-數(shù)據(jù)模型設(shè)計(jì)
模型類型分類設(shè)計(jì)按游戲業(yè)務(wù)的一種領(lǐng)域劃分賬戶、配置、玩家數(shù)據(jù)、全局配置、支付、日志性能上的需求劃分對(duì)玩家數(shù)據(jù),按區(qū)服進(jìn)行分庫
在model的使用上的一些設(shè)計(jì)
架構(gòu)上我們是分布式的系統(tǒng)
業(yè)務(wù)進(jìn)程是無狀態(tài)的
單個(gè)玩家的請(qǐng)求會(huì)通過負(fù)載均衡器、打在不同的節(jié)點(diǎn)上
數(shù)據(jù)的訪問頻率設(shè)計(jì)永久不變可通過內(nèi)存緩存熱數(shù)據(jù)分布式緩存冷數(shù)據(jù)直接訪問數(shù)據(jù)庫表任務(wù)數(shù)據(jù)合成一張表
數(shù)據(jù)處理
ORM 對(duì)象關(guān)系映射
實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射
IIdentity 唯一標(biāo)識(shí)
增 Add(model)
刪 remove(model)
查 Find(model,sql,args)
改 Save(model)
事務(wù)
工作單元 UnitOfWork
維護(hù)變化的對(duì)象列表
將需要執(zhí)行的sql添加到工作單元中,
在接口完成后通過事務(wù)提交
事務(wù)處理
conn.Begin()
?_, e := tx.Exec(item.Sqlstr, item.Values...)
? ?if e != nil {
? ? ? ?tx.Rollback()
? ? ? ?return e
? ?}
tx.Commit()
分布式鎖
加鎖
輪訓(xùn)檢查key
生成token
解鎖
先檢查是否有鎖、刪除鎖
需要原子性、利用redis的腳本訪問
var unlockScript = redis.NewScript(1, `
? ?if redis.call("get", KEYS[1]) == ARGV[1]
? ?then
? ? ? ?return redis.call("del", KEYS[1])
? ?else
? ? ? ?return 0
? ?end
`)